diff --git a/indra/llcommon/lleventcoro.h b/indra/llcommon/lleventcoro.h index c6d9de171d29f0f5a185bb60c1f48ab407867dd1..1981ae7482b295751907eaf7946e5182064e2d9f 100644 --- a/indra/llcommon/lleventcoro.h +++ b/indra/llcommon/lleventcoro.h @@ -203,9 +203,12 @@ LLSD postAndWait(SELF& self, const LLSD& event, const LLEventPumpOrPumpName& req // request event. LLSD modevent(event); LLEventDetail::storeToLLSDPath(modevent, replyPumpNamePath, replyPump.getPump().getName()); - LL_DEBUGS("lleventcoro") << "postAndWait(): coroutine " << listenerName + LL_DEBUGS("lleventcoro") << "postAndWait(): coroutine " << listenerName << " posting to " << requestPump.getPump().getName() - << ": " << modevent << LL_ENDL; + << LL_ENDL; + + // *NOTE:Mani - Removed because modevent could contain user's hashed passwd. + // << ": " << modevent << LL_ENDL; requestPump.getPump().post(modevent); } LL_DEBUGS("lleventcoro") << "postAndWait(): coroutine " << listenerName diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index 232478577c79e2d24a21152dfd7357fe87b0f27b..40e4a4268d1207a11be0d1eaffc0524baf50dd96 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -92,7 +92,7 @@ const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23); const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26); -const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27); +// const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27); // We no longer support ELAR const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28); diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 70d770ef7ed6d99cdafd183b9198f8cef051f95f..1a382643da537121f296fcde94daf84a9f4962de 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -63,14 +63,15 @@ LLPluginClassMedia::~LLPluginClassMedia() reset(); } -bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug) +bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path) { LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL; LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL; + LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL; mPlugin = new LLPluginProcessParent(this); mPlugin->setSleepTime(mSleepTime); - mPlugin->init(launcher_filename, plugin_filename, debug); + mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path); return true; } diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 6b6468871841a88e8353b91b4fc40f439534ae3b..b58067733b5f9022aadad61f12c5a0c7fea749bc 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -49,7 +49,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner virtual ~LLPluginClassMedia(); // local initialization, called by the media manager when creating a source - virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false); + virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path); // undoes everything init() didm called by the media manager when destroying a source virtual void reset(); diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp index 55cf11c6208805cca7e72d15ea28c4ec4c13d2f2..ccf6dab942a1bdb1d28a897ad1feb4f4bf1257fc 100644 --- a/indra/llplugin/llpluginprocesschild.cpp +++ b/indra/llplugin/llpluginprocesschild.cpp @@ -145,8 +145,12 @@ void LLPluginProcessChild::idle(void) break; case STATE_PLUGIN_LOADED: - setState(STATE_PLUGIN_INITIALIZING); - sendMessageToPlugin(LLPluginMessage("base", "init")); + { + setState(STATE_PLUGIN_INITIALIZING); + LLPluginMessage message("base", "init"); + message.setValue("user_data_path", mUserDataPath); + sendMessageToPlugin(message); + } break; case STATE_PLUGIN_INITIALIZING: @@ -310,6 +314,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message) if(message_name == "load_plugin") { mPluginFile = parsed.getValue("file"); + mUserDataPath = parsed.getValue("user_data_path"); } else if(message_name == "shm_add") { diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h index f5c57c3d49d212257723d33a208e3d15bd8ddf22..1cfd9dcaf9a411f1d635ec484c51d00f0225414c 100644 --- a/indra/llplugin/llpluginprocesschild.h +++ b/indra/llplugin/llpluginprocesschild.h @@ -96,6 +96,8 @@ class LLPluginProcessChild: public LLPluginMessagePipeOwner, public LLPluginInst LLSocket::ptr_t mSocket; std::string mPluginFile; + + std::string mUserDataPath; LLPluginInstance *mInstance; diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 332ce288d70207292d2ef16ed3ce7c0e331799b9..f60838b1e733c83d6637f288a0f80c2195649da7 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -99,12 +99,13 @@ void LLPluginProcessParent::errorState(void) setState(STATE_ERROR); } -void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug) +void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path) { mProcess.setExecutable(launcher_filename); mPluginFile = plugin_filename; mCPUUsage = 0.0f; mDebug = debug; + mUserDataPath = user_data_path; setState(STATE_INITIALIZED); } @@ -362,6 +363,7 @@ void LLPluginProcessParent::idle(void) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin"); message.setValue("file", mPluginFile); + message.setValue("user_data_path", mUserDataPath); sendMessage(message); } diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 25669f5d78eddb2d9a100809bb5558b30bee8a89..6d661a69601b852fe27293d58c59f7bebb5dabdc 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -58,7 +58,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner LLPluginProcessParent(LLPluginProcessParentOwner *owner); ~LLPluginProcessParent(); - void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false); + void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path); void idle(void); // returns true if the plugin is on its way to steady state @@ -139,6 +139,8 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner std::string mPluginFile; + std::string mUserDataPath; + LLPluginProcessParentOwner *mOwner; typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType; diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp index 3c69a69d28a8e480fe5fa08675819af6da363b43..9c18b410c75b6cf0b4bc16160db55f03de48bb6e 100644 --- a/indra/llplugin/llpluginsharedmemory.cpp +++ b/indra/llplugin/llpluginsharedmemory.cpp @@ -1,6 +1,6 @@ /** * @file llpluginsharedmemory.cpp - * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API. + * LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API. * * @cond * $LicenseInfo:firstyear=2008&license=viewergpl$ @@ -96,6 +96,10 @@ std::string LLPluginSharedMemory::createName(void) return newname.str(); } +/** + * @brief LLPluginSharedMemoryImpl is the platform-dependent implementation of LLPluginSharedMemory. TODO:DOC is this necessary/sufficient? kinda obvious. + * + */ class LLPluginSharedMemoryPlatformImpl { public: @@ -112,6 +116,9 @@ class LLPluginSharedMemoryPlatformImpl }; +/** + * Constructor. Creates a shared memory segment. + */ LLPluginSharedMemory::LLPluginSharedMemory() { mSize = 0; @@ -121,6 +128,9 @@ LLPluginSharedMemory::LLPluginSharedMemory() mImpl = new LLPluginSharedMemoryPlatformImpl; } +/** + * Destructor. Uses destroy() and detach() to ensure shared memory segment is cleaned up. + */ LLPluginSharedMemory::~LLPluginSharedMemory() { if(mNeedsDestroy) diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h index 4014620c520edc7ef0b35b6c7fda902567b14b6f..00c54ef08caf917403b224f881a2011a691a8d1f 100644 --- a/indra/llplugin/llpluginsharedmemory.h +++ b/indra/llplugin/llpluginsharedmemory.h @@ -1,6 +1,5 @@ /** * @file llpluginsharedmemory.h - * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API. * * @cond * $LicenseInfo:firstyear=2008&license=viewergpl$ @@ -36,6 +35,10 @@ class LLPluginSharedMemoryPlatformImpl; +/** + * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API. + * + */ class LLPluginSharedMemory { LOG_CLASS(LLPluginSharedMemory); @@ -46,16 +49,62 @@ class LLPluginSharedMemory // Parent will use create/destroy, child will use attach/detach. // Message transactions will ensure child attaches after parent creates and detaches before parent destroys. - // create() implicitly creates a name for the segment which is guaranteed to be unique on the host at the current time. + /** + * Creates a shared memory segment, with a name which is guaranteed to be unique on the host at the current time. Used by parent. + * Message transactions will (? TODO:DOC - should? must?) ensure child attaches after parent creates and detaches before parent destroys. + * + * @param[in] size Shared memory size in TODO:DOC units = bytes?. + * + * @return False for failure, true for success. + */ bool create(size_t size); + /** + * Destroys a shared memory segment. Used by parent. + * Message transactions will (? TODO:DOC - should? must?) ensure child attaches after parent creates and detaches before parent destroys. + * + * @return True. TODO:DOC - always returns true. Is this the intended behavior? + */ bool destroy(void); + /** + * Creates and attaches a name to a shared memory segment. TODO:DOC what's the difference between attach() and create()? + * + * @param[in] name Name to attach to memory segment + * @param[in] size Size of memory segment TODO:DOC in bytes? + * + * @return False on failure, true otherwise. + */ bool attach(const std::string &name, size_t size); + /** + * Detaches shared memory segment. + * + * @return False on failure, true otherwise. + */ bool detach(void); + /** + * Checks if shared memory is mapped to a non-null address. + * + * @return True if memory address is non-null, false otherwise. + */ bool isMapped(void) const { return (mMappedAddress != NULL); }; + /** + * Get pointer to shared memory. + * + * @return Pointer to shared memory. + */ void *getMappedAddress(void) const { return mMappedAddress; }; + /** + * Get size of shared memory. + * + * @return Size of shared memory in bytes. TODO:DOC are bytes the correct unit? + */ size_t getSize(void) const { return mSize; }; + /** + * Get name of shared memory. + * + * @return Name of shared memory. + */ std::string getName() const { return mName; }; private: diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 9ba0cfc6b8a2ad60306d74e13f7e505ab53a455d..a28ffbfdc0d3816085326acc697a007d4891bd1f 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -446,7 +446,9 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars // for the last character we want to measure the greater of its width and xadvance values // so keep track of the difference between these values for the each character we measure // so we can fix things up at the end - width_padding = llmax(0.f, (F32)fgi->mWidth - advance); + width_padding = llmax( 0.f, // always use positive padding amount + width_padding - advance, // previous padding left over after advance of current character + (F32)(fgi->mWidth + fgi->mXBearing) - advance); // difference between width of this character and advance to next character cur_x += advance; llwchar next_char = wchars[i+1]; diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h index 46491d8a29e9743bca40046254a26f217e7c070d..2c339f4a3f508ef10975f5fdf43a5144dc8c392a 100644 --- a/indra/llui/lldockablefloater.h +++ b/indra/llui/lldockablefloater.h @@ -83,6 +83,8 @@ class LLDockableFloater : public LLFloater virtual void onDockHidden(); virtual void onDockShown(); + LLDockControl* getDockControl(); + private: /** * Provides unique of dockable floater. @@ -92,7 +94,6 @@ class LLDockableFloater : public LLFloater protected: void setDockControl(LLDockControl* dockControl); - LLDockControl* getDockControl(); const LLUIImagePtr& getDockTongue(); private: diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h index 30a45bedc74e43f3225fe9dfb404e6440fadc8a0..550955c4c537484ad5a0db3c44e2bd25bfb78749 100644 --- a/indra/llui/lldockcontrol.h +++ b/indra/llui/lldockcontrol.h @@ -76,6 +76,9 @@ class LLDockControl // gets a rect that bounds possible positions for a dockable control (EXT-1111) void getAllowedRect(LLRect& rect); + S32 getTongueWidth() { return mDockTongue->getWidth(); } + S32 getTongueHeight() { return mDockTongue->getHeight(); } + private: virtual void moveDockable(); private: diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 831ac66d061f1ecaf0a28d5fa784023a55768b3f..64a4824a17d2cc53020c3275ecadecce682aee26 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -891,7 +891,13 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const // We have to update child rect here because of issues with rect after reshaping while creating LLTextbox // It is possible to have invalid LLRect if Flat List is in LLAccordionTab LLRect comment_rect = getLocalRect(); - comment_rect.stretch(-getBorderWidth()); + + // To see comment correctly (EXT - 3244) in mNoItemsCommentTextbox we must get border width + // of LLFlatListView (@see getBorderWidth()) and stretch mNoItemsCommentTextbox to this width + // But getBorderWidth() returns 0 if LLFlatListView not visible. So we have to get border width + // from 'scroll_border' + LLViewBorder* scroll_border = getChild<LLViewBorder>("scroll border"); + comment_rect.stretch(-scroll_border->getBorderWidth()); mNoItemsCommentTextbox->setRect(comment_rect); } mNoItemsCommentTextbox->setVisible(visible); diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h index 82c3bc385f322434a033b356f1ea94fd8a0214cf..938419d374d6b6e0e802d4a0aeaa0244b19cf713 100644 --- a/indra/llui/llhelp.h +++ b/indra/llui/llhelp.h @@ -42,6 +42,8 @@ class LLHelp virtual std::string defaultTopic() = 0; // return topic to use before the user logs in virtual std::string preLoginTopic() = 0; + // return topic to use for the top-level help, invoked by F1 + virtual std::string f1HelpTopic() = 0; }; #endif // headerguard diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 907f2352a034453453cef1a67aee2e3bc3543ce7..fd5c2b7fefc0f6068615529939cdc16b6e38b8b4 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -761,7 +761,7 @@ void LLMenuItemCallGL::initFromParams(const Params& p) { if (p.on_visible.isProvided()) { - mVisibleSignal.connect(initVisibleCallback(p.on_visible)); + mVisibleSignal.connect(initEnableCallback(p.on_visible)); } if (p.on_enable.isProvided()) { diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index cbb9b4d3448a105d588af9fdf3de3924507a814f..61e06f9e5f971ce47da5ff1b7859add610afead4 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -175,9 +175,7 @@ class LLMenuItemGL : public LLUICtrl // This function appends the character string representation of // the current accelerator key and mask to the provided string. void appendAcceleratorString( std::string& st ) const; - - void initMenuEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig); - + protected: KEY mAcceleratorKey; MASK mAcceleratorMask; @@ -249,7 +247,7 @@ class LLMenuItemCallGL : public LLMenuItemGL { Optional<EnableCallbackParam > on_enable; Optional<CommitCallbackParam > on_click; - Optional<VisibleCallbackParam > on_visible; + Optional<EnableCallbackParam > on_visible; Params() : on_enable("on_enable"), on_click("on_click"), @@ -284,15 +282,10 @@ class LLMenuItemCallGL : public LLMenuItemGL { return mEnableSignal.connect(cb); } - - boost::signals2::connection setVisibleCallback( const visible_signal_t::slot_type& cb ) - { - return mVisibleSignal.connect(cb); - } - + private: enable_signal_t mEnableSignal; - visible_signal_t mVisibleSignal; + enable_signal_t mVisibleSignal; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index a8bd5fd5e549db3a633ee1f0b30a5de05d6cc37c..d0986a06d396396f455234a335bb4d75fae2165f 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -249,7 +249,6 @@ class LLPanel : public LLUICtrl LLCallbackMap::map_t mFactoryMap; CommitCallbackRegistry::ScopedRegistrar mCommitCallbackRegistrar; EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar; - VisibleCallbackRegistry::ScopedRegistrar mVisibleCallbackRegistrar; commit_signal_t* mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD() diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index f6caed4617ff76e22447290e1cc199cc99519d70..a5e47e8547f2f52d76485e5b5d607e9c564d3a38 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -235,18 +235,37 @@ BOOL LLScrollContainer::handleKeyHere(KEY key, MASK mask) BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks ) { - if(LLUICtrl::handleScrollWheel(x,y,clicks)) + // Give event to my child views - they may have scroll bars + // (Bad UI design, but technically possible.) + if (LLUICtrl::handleScrollWheel(x,y,clicks)) return TRUE; - for( S32 i = 0; i < SCROLLBAR_COUNT; i++ ) - { - // Note: tries vertical and then horizontal + // When the vertical scrollbar is visible, scroll wheel + // only affects vertical scrolling. It's confusing to have + // scroll wheel perform both vertical and horizontal in a + // single container. + LLScrollbar* vertical = mScrollbar[VERTICAL]; + if (vertical->getVisible() + && vertical->getEnabled()) + { // Pretend the mouse is over the scrollbar - if( mScrollbar[i]->handleScrollWheel( 0, 0, clicks ) ) + if (vertical->handleScrollWheel( 0, 0, clicks ) ) { updateScroll(); - return TRUE; } + // Always eat the event + return TRUE; + } + + LLScrollbar* horizontal = mScrollbar[HORIZONTAL]; + // Test enablement and visibility for consistency with + // LLView::childrenHandleScrollWheel(). + if (horizontal->getVisible() + && horizontal->getEnabled() + && horizontal->handleScrollWheel( 0, 0, clicks ) ) + { + updateScroll(); + return TRUE; } return FALSE; } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 82a3c5cf478be87467a85f3cc8bb14803d8075d6..e0503a084470bf3c3597bcc49d08a26ddda2da12 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -194,7 +194,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mHAlign(p.font_halign), mLineSpacingMult(p.line_spacing.multiple), mLineSpacingPixels(p.line_spacing.pixels), - mClipPartial(p.clip_partial), + mClipPartial(p.clip_partial && !p.allow_scroll), mTrackEnd( p.track_end ), mScrollIndex(-1), mSelectionStart( 0 ), @@ -529,11 +529,6 @@ void LLTextBase::drawText() S32 next_line = cur_line + 1; line_info& line = mLineInfoList[cur_line]; - if ((line.mRect.mTop - scrolled_view_rect.mBottom) < mTextRect.mBottom) - { - break; - } - S32 next_start = -1; S32 line_end = text_len; @@ -543,17 +538,9 @@ void LLTextBase::drawText() line_end = next_start; } - // A patch for EXT-1944 "Implement ellipses in message well" - // introduced a regression where text in SansSerif ending in the - // letter "r" is clipped. This may be due to an off-by-one in - // font width information out of FreeType with our fractional font - // sizes. For now, just make an extra pixel of space to resolve - // EXT-2971 "Letter R doesn't show when it's the last letter in a - // text block". See James/Richard for details. - const S32 FIX_CLIPPING_HACK = 1; LLRect text_rect(line.mRect.mLeft + mTextRect.mLeft - scrolled_view_rect.mLeft, line.mRect.mTop - scrolled_view_rect.mBottom + mTextRect.mBottom, - llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft + FIX_CLIPPING_HACK, + llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft, line.mRect.mBottom - scrolled_view_rect.mBottom + mTextRect.mBottom); // draw a single line of text @@ -1086,6 +1073,10 @@ void LLTextBase::reflow(S32 start_index) { mReflowNeeded = FALSE; + // shrink document to minimum size (visible portion of text widget) + // to force inlined widgets with follows set to shrink + mDocumentView->setShape(mTextRect); + bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos); @@ -1348,13 +1339,11 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible) if (fully_visible) { - // binary search for line that starts before top of visible buffer and starts before end of visible buffer first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top()); last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom()); } else { - // binary search for line that starts before top of visible buffer and starts before end of visible buffer first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom()); last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top()); } @@ -2091,6 +2080,8 @@ void LLTextBase::updateRects() } mContentsRect.mTop += mVPad; + // subtract a pixel off the bottom to deal with rounding errors in measuring font height + mContentsRect.mBottom -= 1; S32 delta_pos = -mContentsRect.mBottom; // move line segments to fit new document rect @@ -2105,7 +2096,7 @@ void LLTextBase::updateRects() LLRect doc_rect = mContentsRect; // use old mTextRect constraint document to width of viewable region doc_rect.mLeft = 0; - doc_rect.mRight = mTextRect.getWidth(); + doc_rect.mRight = llmax(mTextRect.getWidth(), mContentsRect.mRight); mDocumentView->setShape(doc_rect); @@ -2125,7 +2116,7 @@ void LLTextBase::updateRects() } // update document container again, using new mTextRect - doc_rect.mRight = doc_rect.mLeft + mTextRect.getWidth(); + doc_rect.mRight = llmax(mTextRect.getWidth(), mContentsRect.mRight); mDocumentView->setShape(doc_rect); } @@ -2218,6 +2209,12 @@ LLNormalTextSegment::LLNormalTextSegment( const LLStyleSP& style, S32 start, S32 mEditor(editor) { mFontHeight = llceil(mStyle->getFont()->getLineHeight()); + + LLUIImagePtr image = mStyle->getImage(); + if (image.notNull()) + { + mImageLoadedConnection = image->addLoadedCallback(boost::bind(&LLTextBase::needsReflow, &mEditor)); + } } LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible) @@ -2230,6 +2227,12 @@ LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32 mFontHeight = llceil(mStyle->getFont()->getLineHeight()); } +LLNormalTextSegment::~LLNormalTextSegment() +{ + mImageLoadedConnection.disconnect(); +} + + F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect) { if( end - start > 0 ) @@ -2243,7 +2246,7 @@ F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selec // Center the image vertically S32 image_bottom = draw_rect.getCenterY() - (style_image_height/2); image->draw(draw_rect.mLeft, image_bottom, - style_image_width, style_image_height); + style_image_width, style_image_height, color); } return drawClippedSegment( getStart() + start, getStart() + end, selection_start, selection_end, draw_rect); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index c60b0406550993d4402eaceb781e3c8753793f77..0138ca370422a0ecbdc7088593551220bcee82c2 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -136,7 +136,6 @@ class LLTextBase // TODO: move into LLTextSegment? void createUrlContextMenu(S32 x, S32 y, const std::string &url); // create a popup context menu for the given Url - // Text accessors // TODO: add optional style parameter virtual void setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style @@ -148,6 +147,8 @@ class LLTextBase LLWString getWText() const; void appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params = LLStyle::Params()); + // force reflow of text + void needsReflow() { mReflowNeeded = TRUE; } S32 getLength() const { return getWText().length(); } S32 getLineCount() const { return mLineInfoList.size(); } @@ -162,7 +163,6 @@ class LLTextBase S32 getVPad() { return mVPad; } S32 getHPad() { return mHPad; } - S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const; LLRect getLocalRectFromDocIndex(S32 pos) const; LLRect getDocRectFromDocIndex(S32 pos) const; @@ -180,6 +180,7 @@ class LLTextBase void changePage( S32 delta ); void changeLine( S32 delta ); + const LLFontGL* getDefaultFont() const { return mDefaultFont; } public: @@ -303,7 +304,6 @@ class LLTextBase // misc void updateRects(); - void needsReflow() { mReflowNeeded = TRUE; } void needsScroll() { mScrollNeeded = TRUE; } void replaceUrlLabel(const std::string &url, const std::string &label); @@ -426,6 +426,7 @@ class LLNormalTextSegment : public LLTextSegment public: LLNormalTextSegment( const LLStyleSP& style, S32 start, S32 end, LLTextBase& editor ); LLNormalTextSegment( const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE); + ~LLNormalTextSegment(); /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; /*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const; @@ -457,6 +458,7 @@ class LLNormalTextSegment : public LLTextSegment S32 mFontHeight; LLKeywordToken* mToken; std::string mTooltip; + boost::signals2::connection mImageLoadedConnection; }; class LLIndexSegment : public LLTextSegment diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index e68affc36c605cd9f125518d93c7c69a1aa483c8..faf9ccbeb86afd24f5b8fde26cc272d3fa64e79c 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1887,9 +1887,10 @@ void LLTextEditor::doDelete() removeChar(); } - onKeyStroke(); } + onKeyStroke(); + needsReflow(); } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 4cf503b413c49dae9535b13a357e975a0b1fdb6d..660388790570994a1250d962015aa98f1382d4a8 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1847,8 +1847,8 @@ LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname) // spawn_x and spawn_y are top left corner of view in screen GL coordinates void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y) { - const S32 CURSOR_HEIGHT = 18; // Approximate "normal" cursor size - const S32 CURSOR_WIDTH = 9; + const S32 CURSOR_HEIGHT = 16; // Approximate "normal" cursor size + const S32 CURSOR_WIDTH = 8; LLView* parent = view->getParent(); @@ -1866,7 +1866,7 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y) LLRect virtual_window_rect = parent->getLocalRect(); LLRect mouse_rect; - const S32 MOUSE_CURSOR_PADDING = 5; + const S32 MOUSE_CURSOR_PADDING = 1; mouse_rect.setLeftTopAndSize(mouse_x - MOUSE_CURSOR_PADDING, mouse_y + MOUSE_CURSOR_PADDING, CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2, diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 706712ec5e703f3431992b230539618403cfbc0f..6044908ca797b4ab48d3153b42d6b925f164deeb 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -232,11 +232,6 @@ bool default_enable_handler(LLUICtrl* ctrl, const LLSD& param) return true; } -bool default_visible_handler(LLUICtrl* ctrl, const LLSD& param) -{ - return true; -} - LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCallbackParam& cb) { @@ -290,30 +285,6 @@ LLUICtrl::enable_signal_t::slot_type LLUICtrl::initEnableCallback(const EnableCa return default_enable_handler; } -LLUICtrl::visible_signal_t::slot_type LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb) -{ - // Set the callback function - if (cb.function.isProvided()) - { - if (cb.parameter.isProvided()) - return boost::bind(cb.function(), this, cb.parameter); - else - return cb.function(); - } - else - { - visible_callback_t* func = (VisibleCallbackRegistry::getValue(cb.function_name)); - if (func) - { - if (cb.parameter.isProvided()) - return boost::bind((*func), this, cb.parameter); - else - return visible_signal_t::slot_type(*func); - } - } - return default_visible_handler; -} - // virtual void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask) { diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index b20ff5d798c0ae49b5d8e06e1d861367b2757393..b9a4f61e15a34778c421fef4fd366adbefbcebc2 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -63,9 +63,6 @@ class LLUICtrl typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> enable_callback_t; typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> enable_signal_t; - typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> visible_callback_t; - typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> visible_signal_t; - struct CallbackParam : public LLInitParam::Block<CallbackParam> { Ignored name; @@ -83,16 +80,12 @@ class LLUICtrl Optional<commit_callback_t> function; }; + // also used for visible callbacks struct EnableCallbackParam : public LLInitParam::Block<EnableCallbackParam, CallbackParam > { Optional<enable_callback_t> function; }; - - struct VisibleCallbackParam : public LLInitParam::Block<VisibleCallbackParam, CallbackParam > - { - Optional<visible_callback_t> function; - }; - + struct EnableControls : public LLInitParam::Choice<EnableControls> { Alternative<std::string> enabled; @@ -148,7 +141,6 @@ class LLUICtrl commit_signal_t::slot_type initCommitCallback(const CommitCallbackParam& cb); enable_signal_t::slot_type initEnableCallback(const EnableCallbackParam& cb); - visible_signal_t::slot_type initVisibleCallback(const VisibleCallbackParam& cb); // We need this virtual so we can override it with derived versions virtual LLViewModel* getViewModel() const; @@ -269,10 +261,9 @@ class LLUICtrl {}; class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>{}; + // the enable callback registry is also used for visiblity callbacks class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>{}; - class VisibleCallbackRegistry : public CallbackRegistry<visible_callback_t, VisibleCallbackRegistry>{}; - - + protected: static bool controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type); diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index a8683e55c3597bfd6985f90ff2f29921957af629..f941f391eb3c1b4e825ab8801c04bdbe34413c49 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -39,18 +39,20 @@ #include "lluiimage.h" #include "llui.h" -LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image) : - mName(name), - mImage(image), - mScaleRegion(0.f, 1.f, 1.f, 0.f), - mClipRegion(0.f, 1.f, 1.f, 0.f), - mUniformScaling(TRUE), - mNoClip(TRUE) +LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image) +: mName(name), + mImage(image), + mScaleRegion(0.f, 1.f, 1.f, 0.f), + mClipRegion(0.f, 1.f, 1.f, 0.f), + mUniformScaling(TRUE), + mNoClip(TRUE), + mImageLoaded(NULL) { } LLUIImage::~LLUIImage() { + delete mImageLoaded; } void LLUIImage::setClipRegion(const LLRectf& region) @@ -138,6 +140,25 @@ S32 LLUIImage::getTextureHeight() const return mImage->getHeight(0); } +boost::signals2::connection LLUIImage::addLoadedCallback( const image_loaded_signal_t::slot_type& cb ) +{ + if (!mImageLoaded) + { + mImageLoaded = new image_loaded_signal_t(); + } + return mImageLoaded->connect(cb); +} + + +void LLUIImage::onImageLoaded() +{ + if (mImageLoaded) + { + (*mImageLoaded)(); + } +} + + namespace LLInitParam { LLUIImage* TypedParam<LLUIImage*>::getValueFromBlock() const @@ -170,3 +191,4 @@ namespace LLInitParam return (a == b); } } + diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index 9d734bcfdf3a563ee7cc42a3372f57a729c8c160..5fa9610ab20df4c1995592835883685224e7c1c5 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -39,6 +39,7 @@ #include "llrefcount.h" #include "llrect.h" #include <boost/function.hpp> +#include <boost/signals2.hpp> #include "llinitparam.h" #include "lltexture.h" @@ -47,6 +48,8 @@ extern const LLColor4 UI_VERTEX_COLOR; class LLUIImage : public LLRefCount { public: + typedef boost::signals2::signal<void (void)> image_loaded_signal_t; + LLUIImage(const std::string& name, LLPointer<LLTexture> image); virtual ~LLUIImage(); @@ -77,7 +80,13 @@ class LLUIImage : public LLRefCount S32 getTextureWidth() const; S32 getTextureHeight() const; + boost::signals2::connection addLoadedCallback( const image_loaded_signal_t::slot_type& cb ); + + void onImageLoaded(); + protected: + image_loaded_signal_t* mImageLoaded; + std::string mName; LLRectf mScaleRegion; LLRectf mClipRegion; diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 7694d0283711dc2fe51fda331c35694b9b264ebe..73504572749378ef53d0edb5298cfadcfb209e4f 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -196,6 +196,31 @@ std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string) return getUrlFromWikiLink(string); } +// +// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com +// +LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol() +{ + mPattern = boost::regex("(\\bwww\\.\\S+\\.\\S+|\\S+.com\\S*|\\S+.net\\S*|\\S+.edu\\S*|\\S+.org\\S*)", + boost::regex::perl|boost::regex::icase); + mMenuName = "menu_url_http.xml"; + mTooltip = LLTrans::getString("TooltipHttpUrl"); +} + +std::string LLUrlEntryHTTPNoProtocol::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + return unescapeUrl(url); +} + +std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) +{ + if (string.find("://") == std::string::npos) + { + return "http://" + escapeUrl(string); + } + return escapeUrl(string); +} + // // LLUrlEntrySLURL Describes generic http: and https: Urls // diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index b3fb333fdd80f91c25fffdb9931a154c3bb6bbc6..4adffde99c35a9c47ab71166ddcbe603e18b6f9e 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -134,6 +134,17 @@ class LLUrlEntryHTTPLabel : public LLUrlEntryBase /*virtual*/ std::string getUrl(const std::string &string); }; +/// +/// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com +/// +class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase +{ +public: + LLUrlEntryHTTPNoProtocol(); + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getUrl(const std::string &string); +}; + /// /// LLUrlEntrySLURL Describes http://slurl.com/... Urls /// diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index f47db2db1a5110d484525391873b2a0a696dda84..afcff0d4090c607ea729b0adddda94a6a4c8b526 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -58,6 +58,9 @@ LLUrlRegistry::LLUrlRegistry() //so it should be registered in the end of list registerUrl(new LLUrlEntrySL()); registerUrl(new LLUrlEntrySLLabel()); + // most common pattern is a URL without any protocol, + // e.g., "secondlife.com" + registerUrl(new LLUrlEntryHTTPNoProtocol()); } LLUrlRegistry::~LLUrlRegistry() @@ -118,10 +121,23 @@ static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &en return true; } +static bool stringHasUrl(const std::string &text) +{ + // fast heuristic test for a URL in a string. This is used + // to avoid lots of costly regex calls, BUT it needs to be + // kept in sync with the LLUrlEntry regexes we support. + return (text.find("://") != std::string::npos || + text.find("www.") != std::string::npos || + text.find(".com") != std::string::npos || + text.find(".net") != std::string::npos || + text.find(".edu") != std::string::npos || + text.find(".org") != std::string::npos); +} + bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb) { // avoid costly regexes if there is clearly no URL in the text - if (text.find("://") == std::string::npos) + if (! stringHasUrl(text)) { return false; } diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index c0c6e592d584318a72d73059c7336509c2a0846c..b2b17fdd56583a7e71b5aef873a1478ec8f8c63a 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -394,12 +394,6 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd prefix += "local_assets"; break; - case LL_PATH_MOZILLA_PROFILE: - prefix = getOSUserAppDir(); - prefix += mDirDelimiter; - prefix += "browser_profile"; - break; - case LL_PATH_EXECUTABLE: prefix = getExecutableDir(); break; diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 07c814769ef1dc1ab50d115c1c91c7567e8cf44e..206e3223e3bdce1e097b1c9dce55fc053e1b4854 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -38,7 +38,7 @@ #define MAX_PATH MAXPATHLEN #endif -// these numbers *may* get serialized, so we need to be explicit +// these numbers *may* get serialized (really??), so we need to be explicit typedef enum ELLPath { LL_PATH_NONE = 0, @@ -54,10 +54,8 @@ typedef enum ELLPath LL_PATH_TOP_SKIN = 10, LL_PATH_CHAT_LOGS = 11, LL_PATH_PER_ACCOUNT_CHAT_LOGS = 12, - LL_PATH_MOZILLA_PROFILE = 13, LL_PATH_USER_SKIN = 14, LL_PATH_LOCAL_ASSETS = 15, -// LL_PATH_HTML = 16, LL_PATH_EXECUTABLE = 16, LL_PATH_DEFAULT_SKIN = 17, LL_PATH_FONTS = 18, diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 08c993ed2aa42c57c1d1a18a3291261bc12c5502..ee902d1de791e3e245e1e16169a4569141230493 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -225,15 +225,6 @@ void LLDir_Linux::initAppDirs(const std::string &app_name, } } - res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"")); - if (res == -1) - { - if (errno != EEXIST) - { - llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; - } - } - mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index a21f3ca0abab877dd4173326edcf0c50d4380950..a8fad8e5bdf7b1fcad74a08138edf7ad6b46f10f 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -244,15 +244,6 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name, } } - res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"")); - if (res == -1) - { - if (errno != EEXIST) - { - llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; - } - } - mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 4c376f11a5a0532d73f1815abf79286c2969acf4..4eb10c842be332ac35a0c3e235ad78f92e18bb0a 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -212,14 +212,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name, } } - res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"")); - if (res == -1) - { - if (errno != EEXIST) - { - llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl; - } - } res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,"")); if (res == -1) { diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 8602225108414776a775b16bea4e3c8a64bb43d5..127dbf45e0a5f16244c2aadb435eacdb19a1316b 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -70,6 +70,8 @@ class LLWindow virtual BOOL getMinimized() = 0; virtual BOOL getMaximized() = 0; virtual BOOL maximize() = 0; + virtual void minimize() = 0; + virtual void restore() = 0; BOOL getFullscreen() { return mFullscreen; }; virtual BOOL getPosition(LLCoordScreen *position) = 0; virtual BOOL getSize(LLCoordScreen *size) = 0; diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index 3cffd2bbf6b1f4a74738f036ce38689402b4697c..59fc2ec6577bc25de8619a4e4e4715f1114bd437 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -45,6 +45,8 @@ class LLWindowHeadless : public LLWindow /*virtual*/ BOOL getMinimized() {return FALSE;}; /*virtual*/ BOOL getMaximized() {return FALSE;}; /*virtual*/ BOOL maximize() {return FALSE;}; + /*virtual*/ void minimize() {}; + /*virtual*/ void restore() {}; /*virtual*/ BOOL getFullscreen() {return FALSE;}; /*virtual*/ BOOL getPosition(LLCoordScreen *position) {return FALSE;}; /*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;}; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 86bbb0bcf8b05750bee689be9464354702ecfd6e..ed62faece6cfc54b3bb1f77cd32791f82a088eb8 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1033,6 +1033,7 @@ void LLWindowMacOSX::hide() HideWindow(mWindow); } +//virtual void LLWindowMacOSX::minimize() { setMouseClipping(FALSE); @@ -1040,6 +1041,7 @@ void LLWindowMacOSX::minimize() CollapseWindow(mWindow, true); } +//virtual void LLWindowMacOSX::restore() { show(); diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 17074080eb070bd9da994d8d748779fe8c7c77dc..fbfa07fab4d4a173e7e2af4b766ed2ebb457c941 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -56,6 +56,8 @@ class LLWindowMacOSX : public LLWindow /*virtual*/ BOOL getMinimized(); /*virtual*/ BOOL getMaximized(); /*virtual*/ BOOL maximize(); + /*virtual*/ void minimize(); + /*virtual*/ void restore(); /*virtual*/ BOOL getFullscreen(); /*virtual*/ BOOL getPosition(LLCoordScreen *position); /*virtual*/ BOOL getSize(LLCoordScreen *size); @@ -139,9 +141,6 @@ class LLWindowMacOSX : public LLWindow // Restore the display resolution to its value before we ran the app. BOOL resetDisplayResolution(); - void minimize(); - void restore(); - BOOL shouldPostQuit() { return mPostQuit; } diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h index 46b62b914c092fc507175e94726e92323cd881a4..06146afde7e645ec11bee39080c443d657e3a080 100644 --- a/indra/llwindow/llwindowmesaheadless.h +++ b/indra/llwindow/llwindowmesaheadless.h @@ -49,6 +49,8 @@ class LLWindowMesaHeadless : public LLWindow /*virtual*/ BOOL getMinimized() {return FALSE;}; /*virtual*/ BOOL getMaximized() {return FALSE;}; /*virtual*/ BOOL maximize() {return FALSE;}; + /*virtual*/ void minimize() {}; + /*virtual*/ void restore() {}; /*virtual*/ BOOL getFullscreen() {return FALSE;}; /*virtual*/ BOOL getPosition(LLCoordScreen *position) {return FALSE;}; /*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;}; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index e671fc8a83cdfe0bd9138fc2f0193f68d17eccf9..bfdf1147a1e48f9c499f93d6c2f7d18026228704 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -839,11 +839,13 @@ void LLWindowSDL::hide() // *FIX: What to do with SDL? } +//virtual void LLWindowSDL::minimize() { // *FIX: What to do with SDL? } +//virtual void LLWindowSDL::restore() { // *FIX: What to do with SDL? diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index dcf41291ec7a71d08696d07b73ed31d6ff2ae333..0ba1c861da883d2dcd63c91afdffc5008d680bc6 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -62,6 +62,8 @@ class LLWindowSDL : public LLWindow /*virtual*/ BOOL getMinimized(); /*virtual*/ BOOL getMaximized(); /*virtual*/ BOOL maximize(); + /*virtual*/ void minimize(); + /*virtual*/ void restore(); /*virtual*/ BOOL getFullscreen(); /*virtual*/ BOOL getPosition(LLCoordScreen *position); /*virtual*/ BOOL getSize(LLCoordScreen *size); @@ -165,9 +167,6 @@ class LLWindowSDL : public LLWindow // Go back to last fullscreen display resolution. BOOL setFullscreenResolution(); - void minimize(); - void restore(); - BOOL shouldPostQuit() { return mPostQuit; } protected: diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index c608c21d05152332fd5b243c305c44dec051a009..3b9c840e729663809b824137f564b433ee4165b7 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -643,6 +643,7 @@ void LLWindowWin32::hide() ShowWindow(mWindowHandle, SW_HIDE); } +//virtual void LLWindowWin32::minimize() { setMouseClipping(FALSE); @@ -650,7 +651,7 @@ void LLWindowWin32::minimize() ShowWindow(mWindowHandle, SW_MINIMIZE); } - +//virtual void LLWindowWin32::restore() { ShowWindow(mWindowHandle, SW_RESTORE); diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index e14324c9f170309213cf85ff1b341378c2ee6abc..e4e9179db7dc38284ae415eee8effc15379fed0e 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -54,6 +54,8 @@ class LLWindowWin32 : public LLWindow /*virtual*/ BOOL getMinimized(); /*virtual*/ BOOL getMaximized(); /*virtual*/ BOOL maximize(); + /*virtual*/ void minimize(); + /*virtual*/ void restore(); /*virtual*/ BOOL getFullscreen(); /*virtual*/ BOOL getPosition(LLCoordScreen *position); /*virtual*/ BOOL getSize(LLCoordScreen *size); @@ -137,9 +139,6 @@ class LLWindowWin32 : public LLWindow // Restore the display resolution to its value before we ran the app. BOOL resetDisplayResolution(); - void minimize(); - void restore(); - BOOL shouldPostQuit() { return mPostQuit; } void fillCompositionForm(const LLRect& bounds, COMPOSITIONFORM *form); diff --git a/indra/lscript/lscript_export.h b/indra/lscript/lscript_export.h index d4626a8cd267c73b5bc4ad4ad99f4687bcacbee7..4c883582e244720cdf2b632486d941cc1f2a7119 100644 --- a/indra/lscript/lscript_export.h +++ b/indra/lscript/lscript_export.h @@ -35,6 +35,6 @@ #include "lscript_library.h" -extern LLScriptLibrary gScriptLibrary; + #endif diff --git a/indra/lscript/lscript_library.h b/indra/lscript/lscript_library.h index 6728d70d0a7922b54768595862b7b887e9654fc3..363d11f3aac1a25dadccad04da9c50ff5c32e9d5 100644 --- a/indra/lscript/lscript_library.h +++ b/indra/lscript/lscript_library.h @@ -70,7 +70,7 @@ class LLScriptLibrary std::vector<LLScriptLibraryFunction> mFunctions; }; -extern LLScriptLibrary gScriptLibrary; + class LLScriptLibData { @@ -428,4 +428,6 @@ class LLScriptLibData }; +extern LLScriptLibrary gScriptLibrary; + #endif diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 25f4c8720a9353f617359da697acbbca3a0577c4..276ad39dfbac89c19559192f98f520c360ab67d8 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -76,6 +76,8 @@ class MediaPluginWebKit : private: + std::string mProfileDir; + enum { INIT_STATE_UNINITIALIZED, // Browser instance hasn't been set up yet @@ -187,7 +189,6 @@ class MediaPluginWebKit : #else std::string component_dir = application_dir; #endif - std::string profileDir = application_dir + "/" + "browser_profile"; // cross platform? // window handle - needed on Windows and must be app window. #if LL_WINDOWS @@ -199,7 +200,7 @@ class MediaPluginWebKit : #endif // main browser initialization - bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, profileDir, native_window_handle ); + bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle ); if ( result ) { // create single browser window @@ -587,6 +588,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) { if(message_name == "init") { + std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter + mProfileDir = user_data_path + "browser_profile"; + LLPluginMessage message("base", "init_response"); LLSD versions = LLSD::emptyMap(); versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7cbdff38dd64c557895e1f1664ee3b666dfcbc6b..3b3b62460053596dd35288ede403eaf225eecac5 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -108,6 +108,7 @@ set(viewer_SOURCE_FILES llclassifiedstatsresponder.cpp llcloud.cpp llcolorswatch.cpp + llcommanddispatcherlistener.cpp llcommandhandler.cpp llcommandlineparser.cpp llcompilequeue.cpp @@ -330,6 +331,7 @@ set(viewer_SOURCE_FILES llpanellandmarks.cpp llpanellandmedia.cpp llpanellogin.cpp + llpanelloginlistener.cpp llpanellookinfo.cpp llpanelmaininventory.cpp llpanelmediasettingsgeneral.cpp @@ -395,6 +397,7 @@ set(viewer_SOURCE_FILES llsplitbutton.cpp llsprite.cpp llstartup.cpp + llstartuplistener.cpp llstatusbar.cpp llstylemap.cpp llsurface.cpp @@ -449,6 +452,7 @@ set(viewer_SOURCE_FILES lluploaddialog.cpp llurl.cpp llurldispatcher.cpp + llurldispatcherlistener.cpp llurlhistory.cpp llurllineeditorctrl.cpp llurlsimstring.cpp @@ -616,6 +620,7 @@ set(viewer_HEADER_FILES llclassifiedstatsresponder.h llcloud.h llcolorswatch.h + llcommanddispatcherlistener.h llcommandhandler.h llcommandlineparser.h llcompilequeue.h @@ -833,6 +838,7 @@ set(viewer_HEADER_FILES llpanellandmarks.h llpanellandmedia.h llpanellogin.h + llpanelloginlistener.h llpanellookinfo.h llpanelmaininventory.h llpanelmediasettingsgeneral.h @@ -900,6 +906,7 @@ set(viewer_HEADER_FILES llsplitbutton.h llsprite.h llstartup.h + llstartuplistener.h llstatusbar.h llstylemap.h llsurface.h @@ -956,6 +963,7 @@ set(viewer_HEADER_FILES lluploaddialog.h llurl.h llurldispatcher.h + llurldispatcherlistener.h llurlhistory.h llurllineeditorctrl.h llurlsimstring.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e889c552aaa5939c27db39b85f13af3df0470179..cc1957838692cf3ef8e171579b3fa0d004e47725 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1044,7 +1044,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>10</integer> + <integer>4</integer> </map> <key>ButtonHeight</key> <map> @@ -1055,7 +1055,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>20</integer> + <integer>23</integer> </map> <key>ButtonHeightSmall</key> <map> @@ -1066,7 +1066,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>16</integer> + <integer>23</integer> </map> <key>ButtonVPad</key> <map> @@ -4974,7 +4974,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>StartUpToastLifeTime</key> <key>NearbyToastFadingTime</key> <map> <key>Comment</key> @@ -5039,7 +5038,18 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>35</integer> + <integer>5</integer> + </map> + <key>NotificationChannelHeightRatio</key> + <map> + <key>Comment</key> + <string>Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.5</real> </map> <key>OverflowToastHeight</key> <map> @@ -5504,6 +5514,28 @@ <string>F32</string> <key>Value</key> <real>5.0</real> + </map> + <key>PrimMediaMaxSortedQueueSize</key> + <map> + <key>Comment</key> + <string>Maximum number of objects the viewer will load media for initially</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>100000</integer> + </map> + <key>PrimMediaMaxRoundRobinQueueSize</key> + <map> + <key>Comment</key> + <string>Maximum number of objects the viewer will continuously update media for</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>100000</integer> </map> <key>ProbeHardwareOnStartup</key> <map> @@ -9923,6 +9955,28 @@ <key>Value</key> <integer>0</integer> </map> + <key>UseCircuitCodeMaxRetries</key> + <map> + <key>Comment</key> + <string>Max timeout count for the initial UseCircuitCode message</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <real>3</real> + </map> + <key>UseCircuitCodeTimeout</key> + <map> + <key>Comment</key> + <string>Timeout duration in seconds for the initial UseCircuitCode message</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>5.0</real> + </map> <key>UseDebugLogin</key> <map> <key>Comment</key> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index d7182dfaab2fd036bf59392490f8f5087f4a26ce..ae89eb4413579f36aa16560388f35653d7224a7d 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -9283,7 +9283,7 @@ render_pass="bump"> wearable="skin" edit_group="skin_facedetail" edit_group_order="3" - name="wrinkles" + name="Wrinkles" label_min="Less" label_max="More" value_min="0" diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index d91b9d7ea431e6b03948cba209a7b06145bbb682..c06098689db5def39e6b985112f270c88d4f41bd 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -574,29 +574,32 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) linkAll(cof, obj_items, link_waiter); linkAll(cof, gest_items, link_waiter); - LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); // Add link to outfit if category is an outfit. LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) + if (!append) { - link_inventory_item(gAgent.getID(), category, cof, catp->getName(), - LLAssetType::AT_LINK_FOLDER, link_waiter); - - // Update the current outfit name of the appearance sidepanel. - if (panel_appearance) + std::string new_outfit_name = ""; + if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { - panel_appearance->refreshCurrentOutfitName(catp->getName()); + link_inventory_item(gAgent.getID(), category, cof, catp->getName(), + LLAssetType::AT_LINK_FOLDER, link_waiter); + new_outfit_name = catp->getName(); } + updatePanelOutfitName(new_outfit_name); } - else +} + +void LLAppearanceManager::updatePanelOutfitName(const std::string& name) +{ + LLSidepanelAppearance* panel_appearance = + dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); + if (panel_appearance) { - if (panel_appearance) - { - panel_appearance->refreshCurrentOutfitName(""); - } + panel_appearance->refreshCurrentOutfitName(name); } } + void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) { lldebugs << "updateAgentWearables()" << llendl; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 7038d1a35b7a35c627c4b5df4d73c7230093faad..b625d42a50fb0a7b6545f9050ad6a6e9ff09dc53 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -64,6 +64,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> // Finds the folder link to the currently worn outfit const LLViewerInventoryItem *getCurrentOutfitLink(); + // Update the displayed outfit name in UI. + void updatePanelOutfitName(const std::string& name); + void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); // For debugging - could be moved elsewhere. diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 508badcc6fa77691fe0e5389b893f145ca7f8ef3..3250343b253abbee297ed097d83744e58e491bcf 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -78,6 +78,8 @@ #include "lllocationhistory.h" #include "llfasttimerview.h" #include "llvoicechannel.h" +#include "llsidetray.h" + #include "llweb.h" #include "llsecondlifeurls.h" @@ -744,7 +746,15 @@ bool LLAppViewer::init() LLViewerJointMesh::updateVectorize(); // load MIME type -> media impl mappings - LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") ); + std::string mime_types_name; +#if LL_DARWIN + mime_types_name = "mime_types_mac.xml"; +#elif LL_LINUX + mime_types_name = "mime_types_linux.xml"; +#else + mime_types_name = "mime_types.xml"; +#endif + LLMIMETypes::parseMIMETypes( mime_types_name ); // Copy settings to globals. *TODO: Remove or move to appropriage class initializers settings_to_globals(); @@ -2854,6 +2864,8 @@ void LLAppViewer::requestQuit() gFloaterView->closeAllChildren(true); } + LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit")); + send_stats(); gLogoutTimer.reset(); @@ -3758,6 +3770,13 @@ void LLAppViewer::idleShutdown() { return; } + + if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit"))) + { + return; + } + + // ProductEngine: Try moving this code to where we shut down sTextureCache in cleanup() // *TODO: ugly diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 5af023f5657de6853da13da6d102389a6260cead..5f90a7627f3727fef031b12fa58d868a4050dd96 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -62,9 +62,6 @@ #include "llimfloater.h" #include "lltrans.h" -// callback connection to auto-call when the IM floater initializes -boost::signals2::connection gAdhocAutoCall; - // static void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name) { @@ -250,8 +247,8 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids) // always open IM window when connecting to voice LLIMFloater::show(session_id); - // start the call once the floater has fully initialized - gAdhocAutoCall = LLIMModel::getInstance()->addSessionInitializedCallback(callbackAutoStartCall); + // start the call once the session has fully initialized + gIMMgr->autoStartCallOnStartup(session_id); make_ui_sound("UISndStartIM"); } @@ -466,17 +463,6 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re return false; } -// static -void LLAvatarActions::callbackAutoStartCall(const LLSD& data) -{ - // start the adhoc voice call now the IM panel has initialized - LLUUID session_id = data["session_id"].asUUID(); - gIMMgr->startCall(session_id); - - // and deschedule this callback as its work is done now - gAdhocAutoCall.disconnect(); -} - // static void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 4c9851a48d4fde4a54b196534e3527ad3418ef48..2dd2a4c4b12b3fcc0dba969cce1040e6d3d1ded6 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -139,7 +139,6 @@ class LLAvatarActions static bool handleRemove(const LLSD& notification, const LLSD& response); static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id); static void callback_invite_to_group(LLUUID group_id, LLUUID id); - static void callbackAutoStartCall(const LLSD& data); // Just request friendship, no dialog. static void requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message); diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 7cda2d31e66ec154a91874b993a04e6913b0acaa..33e5046f5062b5fa90a99dc510a9ae2f226d9a96 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -440,11 +440,17 @@ void LLAvatarPropertiesProcessor::notifyObservers(const LLUUID& id,void* data, E // Copy the map (because observers may delete themselves when updated?) LLAvatarPropertiesProcessor::observer_multimap_t observers = mObservers; - observer_multimap_t::iterator oi = observers.lower_bound(id); - observer_multimap_t::iterator end = observers.upper_bound(id); + observer_multimap_t::iterator oi = observers.begin(); + observer_multimap_t::iterator end = observers.end(); for (; oi != end; ++oi) { - oi->second->processProperties(data,type); + // only notify observers for the same agent, or if the observer + // didn't know the agent ID and passed a NULL id. + const LLUUID &agent_id = oi->first; + if (agent_id == id || agent_id.isNull()) + { + oi->second->processProperties(data,type); + } } } diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 4b3b7a99d844fac9179ededc9e319b28eeaab34e..30967677e8630075509cf8de8b4ecf3d83d0c2ee 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -61,6 +61,7 @@ static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p"); static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group"); static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc"); static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script"); +static LLDefaultChildRegistry::Register<LLInvOfferChiclet> t7("chiclet_offer"); static const LLRect CHICLET_RECT(0, 25, 25, 0); static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0); @@ -78,29 +79,73 @@ boost::signals2::signal<LLChiclet* (const LLUUID&), ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +/** + * Updates the Well's 'Lit' state to flash it when "new messages" are come. + * + * It gets callback which will be called 2*N times with passed period. See EXT-3147 + */ +class LLSysWellChiclet::FlashToLitTimer : public LLEventTimer +{ +public: + typedef boost::function<void()> callback_t; + FlashToLitTimer(S32 count, F32 period, callback_t cb) + : LLEventTimer(period) + , mCallback(cb) + , mFlashCount(2 * count) + , mCurrentFlashCount(0) + { + mEventTimer.stop(); + } + + BOOL tick() + { + mCallback(); + + if (++mCurrentFlashCount == mFlashCount) mEventTimer.stop(); + return FALSE; + } + + void flash() + { + mCurrentFlashCount = 0; + mEventTimer.start(); + } + +private: + callback_t mCallback; + S32 mFlashCount; + S32 mCurrentFlashCount; +}; + LLSysWellChiclet::Params::Params() : button("button") , unread_notifications("unread_notifications") +, max_displayed_count("max_displayed_count", 9) +, flash_to_lit_count("flash_to_lit_count", 3) +, flash_period("flash_period", 0.5F) { button.name("button"); button.tab_stop(FALSE); button.label(LLStringUtil::null); - } LLSysWellChiclet::LLSysWellChiclet(const Params& p) : LLChiclet(p) , mButton(NULL) , mCounter(0) +, mMaxDisplayedCount(p.max_displayed_count) +, mFlashToLitTimer(NULL) { LLButton::Params button_params = p.button; mButton = LLUICtrlFactory::create<LLButton>(button_params); addChild(mButton); + + mFlashToLitTimer = new FlashToLitTimer(p.flash_to_lit_count, p.flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this)); } LLSysWellChiclet::~LLSysWellChiclet() { - + delete mFlashToLitTimer; } void LLSysWellChiclet::setCounter(S32 counter) @@ -108,11 +153,30 @@ void LLSysWellChiclet::setCounter(S32 counter) std::string s_count; if(counter != 0) { - s_count = llformat("%d", counter); + static std::string more_messages_exist("+"); + std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : ""); + s_count = llformat("%d%s" + , llmin(counter, mMaxDisplayedCount) + , more_messages.c_str() + ); } mButton->setLabel(s_count); + /* + Emulate 4 states of button by background images, see detains in EXT-3147 + xml attribute Description + image_unselected "Unlit" - there are no new messages + image_selected "Unlit" + "Selected" - there are no new messages and the Well is open + image_pressed "Lit" - there are new messages + image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open + */ + mButton->setForcePressedState(counter > 0); + + if (mCounter == 0 && counter > 0) + { + mFlashToLitTimer->flash(); + } mCounter = counter; } @@ -126,6 +190,14 @@ void LLSysWellChiclet::setToggleState(BOOL toggled) { mButton->setToggleState(toggled); } +void LLSysWellChiclet::changeLitState() +{ + static bool set_lit = false; + + mButton->setForcePressedState(set_lit); + + set_lit ^= true; +} /************************************************************************/ /* LLIMWellChiclet implementation */ @@ -939,12 +1011,34 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ } } +void object_chiclet_callback(const LLSD& data) +{ + LLUUID object_id = data["object_id"]; + bool new_message = data["new_message"]; + + std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id); + std::list<LLChiclet *>::iterator iter; + for (iter = chiclets.begin(); iter != chiclets.end(); iter++) + { + LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*iter); + if (chiclet != NULL) + { + if(data.has("unread")) + { + chiclet->setCounter(data["unread"]); + } + chiclet->setShowNewMessagesIcon(new_message); + } + } +} BOOL LLChicletPanel::postBuild() { LLPanel::postBuild(); LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1)); + LLScriptFloaterManager::getInstance()->addNewObjectCallback(boost::bind(object_chiclet_callback, _1)); + LLScriptFloaterManager::getInstance()->addToggleObjectFloaterCallback(boost::bind(object_chiclet_callback, _1)); LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1)); LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1)); @@ -1545,6 +1639,11 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id) } } +void LLScriptChiclet::setCounter(S32 counter) +{ + setShowNewMessagesIcon( counter > 0 ); +} + void LLScriptChiclet::onMouseDown() { LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId()); @@ -1601,6 +1700,11 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id) } } +void LLInvOfferChiclet::setCounter(S32 counter) +{ + setShowNewMessagesIcon( counter > 0 ); +} + void LLInvOfferChiclet::onMouseDown() { LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId()); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 609ce167136bfec918467d6d45bd3fce177c574f..65abcd1f5fcd70d9203467877593b27d21ce8f7c 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -315,7 +315,7 @@ class LLIMChiclet : public LLChiclet { Optional<std::string> new_messages_icon_name; - Params() : new_messages_icon_name("new_messages_icon_name", "icn_voice-localchat.tga") + Params() : new_messages_icon_name("new_messages_icon_name", "Unread_IM") {} }; @@ -389,7 +389,7 @@ class LLIMChiclet : public LLChiclet * Made public so that it can be triggered from outside * (more specifically, from the Active IM window). */ - void onMouseDown(); + virtual void onMouseDown(); protected: @@ -594,7 +594,7 @@ class LLScriptChiclet : public LLIMChiclet /*virtual*/ void setSessionId(const LLUUID& session_id); - /*virtual*/ void setCounter(S32 counter){} + /*virtual*/ void setCounter(S32 counter); /*virtual*/ S32 getCounter() { return 0; } @@ -634,7 +634,7 @@ class LLInvOfferChiclet: public LLIMChiclet /*virtual*/ void setSessionId(const LLUUID& session_id); - /*virtual*/ void setCounter(S32 counter){} + /*virtual*/ void setCounter(S32 counter); /*virtual*/ S32 getCounter() { return 0; } @@ -745,7 +745,7 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver /** * Implements notification chiclet. Used to display total amount of unread messages - * across all IM sessions, total amount of system notifications. + * across all IM sessions, total amount of system notifications. See EXT-3147 for details */ class LLSysWellChiclet : public LLChiclet { @@ -757,6 +757,24 @@ class LLSysWellChiclet : public LLChiclet Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications; + /** + * Contains maximum displayed count of unread messages. Default value is 9. + * + * If count is less than "max_unread_count" will be displayed as is. + * Otherwise 9+ will be shown (for default value). + */ + Optional<S32> max_displayed_count; + + /** + * How many time chiclet should flash before set "Lit" state. Default value is 3. + */ + Optional<S32> flash_to_lit_count; + + /** + * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5. + */ + Optional<F32> flash_period; + Params(); }; @@ -778,9 +796,26 @@ class LLSysWellChiclet : public LLChiclet LLSysWellChiclet(const Params& p); friend class LLUICtrlFactory; + /** + * Change Well 'Lit' state from 'Lit' to 'Unlit' and vice-versa. + * + * There is an assumption that it will be called 2*N times to do not change its start state. + * @see FlashToLitTimer + */ + void changeLitState(); + protected: + class FlashToLitTimer; LLButton* mButton; S32 mCounter; + S32 mMaxDisplayedCount; + + /** + * How many times Well will blink. + */ + S32 mFlashToLitCount; + FlashToLitTimer* mFlashToLitTimer; + }; /** diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 442e9ab27baa7a91b98d569826379c4dcf8d401a..dc6847f2360cdec2ce46d352e9638cb05382d0fd 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -306,6 +306,21 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op ) } } +// This is called when the main floatercustomize panel is closed. +// Since this class has pointers up to its parents, we need to cleanup +// this class first in order to avoid a crash. +void LLColorSwatchCtrl::onParentFloaterClosed() +{ + LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get(); + if (pickerp) + { + pickerp->setSwatch(NULL); + pickerp->closeFloater(); + } + + mPickerHandle.markDead(); +} + void LLColorSwatchCtrl::setValid(BOOL valid ) { mValid = valid; @@ -323,7 +338,7 @@ void LLColorSwatchCtrl::showPicker(BOOL take_focus) if (!pickerp) { pickerp = new LLFloaterColorPicker(this, mCanApplyImmediately); - gFloaterView->getParentFloater(this)->addDependentFloater(pickerp); + //gFloaterView->getParentFloater(this)->addDependentFloater(pickerp); mPickerHandle = pickerp->getHandle(); } diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h index e3e267f831e6d086e115706f9389a446ebdd498e..4bb7d837cbe32865027f12fb8b9ed95ad62cb2e1 100644 --- a/indra/newview/llcolorswatch.h +++ b/indra/newview/llcolorswatch.h @@ -105,6 +105,7 @@ class LLColorSwatchCtrl /*virtual*/ void setEnabled( BOOL enabled ); static void onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE ); + void onParentFloaterClosed(); protected: BOOL mValid; diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp new file mode 100644 index 0000000000000000000000000000000000000000..00a20de30edc4639671fd432adfb938282c39275 --- /dev/null +++ b/indra/newview/llcommanddispatcherlistener.cpp @@ -0,0 +1,47 @@ +/** + * @file llcommanddispatcherlistener.cpp + * @author Nat Goodspeed + * @date 2009-12-10 + * @brief Implementation for llcommanddispatcherlistener. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llcommanddispatcherlistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llcommandhandler.h" + +LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher* instance */): + LLEventAPI("LLCommandDispatcher", "Access to LLCommandHandler commands") /* , + mDispatcher(instance) */ +{ + add("dispatch", + "Execute a command registered as an LLCommandHandler,\n" + "passing any required parameters:\n" + "[\"cmd\"] string command name\n" + "[\"params\"] array of parameters, as if from components of URL path\n" + "[\"query\"] map of parameters, as if from ?key1=val&key2=val\n" + "[\"trusted\"] boolean indicating trusted browser [default true]", + &LLCommandDispatcherListener::dispatch); +} + +void LLCommandDispatcherListener::dispatch(const LLSD& params) const +{ + // For most purposes, we expect callers to want to be trusted. + bool trusted_browser = true; + if (params.has("trusted")) + { + // But for testing, allow a caller to specify untrusted. + trusted_browser = params["trusted"].asBoolean(); + } + LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL, + trusted_browser); +} diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h new file mode 100644 index 0000000000000000000000000000000000000000..d0070ddd711caf8d13fe3866e70b5cf7f0b2425d --- /dev/null +++ b/indra/newview/llcommanddispatcherlistener.h @@ -0,0 +1,30 @@ +/** + * @file llcommanddispatcherlistener.h + * @author Nat Goodspeed + * @date 2009-12-10 + * @brief LLEventAPI for LLCommandDispatcher + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H) +#define LL_LLCOMMANDDISPATCHERLISTENER_H + +#include "lleventapi.h" +class LLCommandDispatcher; +class LLSD; + +class LLCommandDispatcherListener: public LLEventAPI +{ +public: + LLCommandDispatcherListener(/* LLCommandDispatcher* instance */); // all static members + +private: + void dispatch(const LLSD& params) const; + + //LLCommandDispatcher* mDispatcher; +}; + +#endif /* ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H) */ diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index af6488388a39add5cf462851bd0e9b490a79a1ba..8c7e7bea83b91be92abf6a0680ddca920c787726 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -34,12 +34,16 @@ #include "llviewerprecompiledheaders.h" #include "llcommandhandler.h" +#include "llnotificationsutil.h" +#include "llcommanddispatcherlistener.h" // system includes #include <boost/tokenizer.hpp> #define THROTTLE_PERIOD 15 // required secs between throttled commands +static LLCommandDispatcherListener sCommandDispatcherListener; + //--------------------------------------------------------------------------- // Underlying registry for command handlers, not directly accessible. //--------------------------------------------------------------------------- @@ -93,6 +97,8 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, LLMediaCtrl* web, bool trusted_browser) { + static bool slurl_blocked = false; + static bool slurl_throttled = false; static F64 last_throttle_time = 0.0; F64 cur_time = 0.0; std::map<std::string, LLCommandHandlerInfo>::iterator it = mMap.find(cmd); @@ -110,6 +116,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, // block request from external browser, but report as // "handled" because it was well formatted. LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL; + if (! slurl_blocked) + { + LLNotificationsUtil::add("BlockedSLURL"); + slurl_blocked = true; + } return true; case LLCommandHandler::UNTRUSTED_THROTTLE: @@ -119,6 +130,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, // block request from external browser if it happened // within THROTTLE_PERIOD secs of the last command LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL; + if (! slurl_throttled) + { + LLNotificationsUtil::add("ThrottledSLURL"); + slurl_throttled = true; + } return true; } last_throttle_time = cur_time; diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index eae2747cc93a5cb736285b7e7d4b90a808525b63..9e6ef2fc4d3143e7fc8e4235bac086c353d55bed 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -208,7 +208,12 @@ BOOL LLFloaterAnimPreview::postBuild() mPlayButton = getChild<LLButton>( "play_btn"); mPlayButton->setClickedCallback(onBtnPlay, this); + mPlayButton->setVisible(true); + mPauseButton = getChild<LLButton>( "pause_btn"); + mPauseButton->setClickedCallback(onBtnPause, this); + mPauseButton->setVisible(false); + mStopButton = getChild<LLButton>( "stop_btn"); mStopButton->setClickedCallback(onBtnStop, this); @@ -560,24 +565,60 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data) if (previewp->mMotionID.notNull() && previewp->mAnimPreview) { LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); - + if(!avatarp->isMotionActive(previewp->mMotionID)) { previewp->resetMotion(); previewp->mPauseRequest = NULL; + previewp->mPauseButton->setVisible(TRUE); + previewp->mPauseButton->setEnabled(TRUE); + previewp->mPlayButton->setVisible(FALSE); + previewp->mPlayButton->setEnabled(FALSE); } - else + else if (avatarp->areAnimationsPaused()) { - if (avatarp->areAnimationsPaused()) - { - previewp->mPauseRequest = NULL; - } - else + + previewp->mPauseRequest = NULL; + previewp->mPauseButton->setVisible(TRUE); + previewp->mPauseButton->setEnabled(TRUE); + previewp->mPlayButton->setVisible(FALSE); + previewp->mPlayButton->setEnabled(FALSE); + } + + } + + + +} + +//----------------------------------------------------------------------------- +// onBtnPause() +//----------------------------------------------------------------------------- +void LLFloaterAnimPreview::onBtnPause(void* user_data) +{ + LLFloaterAnimPreview* previewp = (LLFloaterAnimPreview*)user_data; + if (!previewp->getEnabled()) + return; + + if (previewp->mMotionID.notNull() && previewp->mAnimPreview) + { + LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar(); + + if(avatarp->isMotionActive(previewp->mMotionID)) + { + if (!avatarp->areAnimationsPaused()) { previewp->mPauseRequest = avatarp->requestPause(); + + previewp->mPlayButton->setVisible(TRUE); + previewp->mPlayButton->setEnabled(TRUE); + previewp->mPauseButton->setVisible(FALSE); + previewp->mPauseButton->setEnabled(FALSE); } } } + + } //----------------------------------------------------------------------------- @@ -595,6 +636,10 @@ void LLFloaterAnimPreview::onBtnStop(void* user_data) previewp->resetMotion(); previewp->mPauseRequest = avatarp->requestPause(); } + previewp->mPlayButton->setVisible(TRUE); + previewp->mPlayButton->setEnabled(TRUE); + previewp->mPauseButton->setVisible(FALSE); + previewp->mPauseButton->setEnabled(FALSE); } //----------------------------------------------------------------------------- @@ -912,43 +957,38 @@ void LLFloaterAnimPreview::refresh() { childShow("bad_animation_text"); mPlayButton->setEnabled(FALSE); + mPlayButton->setVisible(TRUE); + mPauseButton->setVisible(FALSE); mStopButton->setEnabled(FALSE); childDisable("ok_btn"); } else { childHide("bad_animation_text"); - mPlayButton->setEnabled(TRUE); LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar(); if (avatarp->isMotionActive(mMotionID)) { mStopButton->setEnabled(TRUE); LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID); - if (avatarp->areAnimationsPaused()) - { - - mPlayButton->setImages(std::string("button_anim_play.tga"), - std::string("button_anim_play_selected.tga")); - - } - else + if (!avatarp->areAnimationsPaused()) { if (motionp) { F32 fraction_complete = motionp->getLastUpdateTime() / motionp->getDuration(); childSetValue("playback_slider", fraction_complete); } - mPlayButton->setImages(std::string("button_anim_pause.tga"), - std::string("button_anim_pause_selected.tga")); - + + mPlayButton->setVisible(FALSE); + mPauseButton->setVisible(TRUE); + } + } else { mPauseRequest = avatarp->requestPause(); - mPlayButton->setImages(std::string("button_anim_play.tga"), - std::string("button_anim_play_selected.tga")); - + //mPlayButton->setVisible(TRUE); + //mPlayButton->setEnabled(TRUE); mStopButton->setEnabled(TRUE); // stop also resets, leave enabled. } childEnable("ok_btn"); diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h index f1c4a6b0d08cdbd34dfa245689228df9e1d78c8d..09b04f1f422443fc71f8ea730ede6d611f39c666 100644 --- a/indra/newview/llfloateranimpreview.h +++ b/indra/newview/llfloateranimpreview.h @@ -87,6 +87,7 @@ class LLFloaterAnimPreview : public LLFloaterNameDesc void refresh(); static void onBtnPlay(void*); + static void onBtnPause(void*); static void onBtnStop(void*); static void onSliderMove(LLUICtrl*, void*); static void onCommitBaseAnim(LLUICtrl*, void*); @@ -119,6 +120,7 @@ class LLFloaterAnimPreview : public LLFloaterNameDesc S32 mLastMouseX; S32 mLastMouseY; LLButton* mPlayButton; + LLButton* mPauseButton; LLButton* mStopButton; LLRect mPreviewRect; LLRectf mPreviewImageRect; diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index 57bb93d81afef3ea51355af4372a798bbdd70dd8..b9e0f928f14dc1271053c3741c86d13073af01be 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -41,6 +41,7 @@ // project include #include "llagent.h" +#include "llappviewer.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" @@ -142,6 +143,10 @@ BOOL LLFloaterChat::postBuild() void LLFloaterChat::updateConsoleVisibility() { + if(gDisconnected) + { + return; + } // determine whether we should show console due to not being visible gConsole->setVisible( !isInVisibleChain() // are we not in part of UI being drawn? || isMinimized() // are we minimized? diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index a16cde7f102a11529c2f08b7a61c9f9fd030c0d4..0bbbe2051ce8f776f3d92fa47b1bf8ac930578b8 100644 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -69,6 +69,7 @@ class LLFloaterColorPicker void destroyUI (); void cancelSelection (); LLColorSwatchCtrl* getSwatch () { return mSwatch; }; + void setSwatch( LLColorSwatchCtrl* swatch) { mSwatch = swatch; } // mutator / accessor for original RGB value void setOrigRgb ( F32 origRIn, F32 origGIn, F32 origBIn ); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index ed0f24d16052fce9f35a04ad0e0bb75b1072a4ab..5b03292b22b4d95e0def974c3528e4bbdf928f7e 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2300,7 +2300,7 @@ void LLPanelLandAccess::refresh() mListBanned->deleteAllItems(); LLParcel *parcel = mParcel->getParcel(); - + // Display options if (parcel) { @@ -2396,22 +2396,40 @@ void LLPanelLandAccess::refresh() mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); } } + + LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); + if(region) + { + std::string region_access = "("; + region_access += region->getSimAccessString(); + region_access += ")"; + childSetLabelArg( "public_access", "[MATURITY]", region_access ); + } + else + { + childSetLabelArg( "public_access", "[MATURITY]", std::string() ); + } + if(parcel->getRegionDenyAnonymousOverride()) { childSetValue("limit_payment", TRUE); + childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") ); } else { childSetValue("limit_payment", (parcel->getParcelFlag(PF_DENY_ANONYMOUS))); + childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", std::string() ); } if(parcel->getRegionDenyAgeUnverifiedOverride()) { childSetValue("limit_age_verified", TRUE); + childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", getString("access_estate_defined") ); } else { childSetValue("limit_age_verified", (parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED))); + childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", std::string() ); } BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index 56a86c2cb72c09f03781150ae1e96c22611ee437..c1e8d251eeb50843cf6a49eface5b071df9b9203 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -72,11 +72,14 @@ LLFloaterOpenObject::~LLFloaterOpenObject() { // sInstance = NULL; } + // virtual BOOL LLFloaterOpenObject::postBuild() { childSetTextArg("object_name", "[DESC]", std::string("Object") ); // *Note: probably do not want to translate this mPanelInventoryObject = getChild<LLPanelObjectInventory>("object_contents"); + + refresh(); return TRUE; } @@ -95,29 +98,57 @@ void LLFloaterOpenObject::onOpen(const LLSD& key) return; } mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); + refresh(); } + void LLFloaterOpenObject::refresh() { mPanelInventoryObject->refresh(); - std::string name; - BOOL enabled; + std::string name = ""; + + // Enable the copy || copy & wear buttons only if we have something we can copy or copy & wear (respectively). + bool copy_enabled = false; + bool wear_enabled = false; LLSelectNode* node = mObjectSelection->getFirstRootNode(); - if (node) + if (node) { name = node->mName; - enabled = TRUE; - } - else - { - name = ""; - enabled = FALSE; + copy_enabled = true; + + LLViewerObject* object = node->getObject(); + if (object) + { + // this folder is coming from an object, as there is only one folder in an object, the root, + // we need to collect the entire contents and handle them as a group + InventoryObjectList inventory_objects; + object->getInventoryContents(inventory_objects); + + if (!inventory_objects.empty()) + { + for (InventoryObjectList::iterator it = inventory_objects.begin(); + it != inventory_objects.end(); + ++it) + { + LLInventoryItem* item = static_cast<LLInventoryItem*> ((LLInventoryObject*)(*it)); + LLInventoryType::EType type = item->getInventoryType(); + if (type == LLInventoryType::IT_OBJECT + || type == LLInventoryType::IT_ATTACHMENT + || type == LLInventoryType::IT_WEARABLE + || type == LLInventoryType::IT_GESTURE) + { + wear_enabled = true; + break; + } + } + } + } } childSetTextArg("object_name", "[DESC]", name); - childSetEnabled("copy_to_inventory_button", enabled); - childSetEnabled("copy_and_wear_button", enabled); + childSetEnabled("copy_to_inventory_button", copy_enabled); + childSetEnabled("copy_and_wear_button", wear_enabled); } diff --git a/indra/newview/llfloaterparcel.cpp b/indra/newview/llfloaterparcel.cpp index 88a39a495fd6702cbd733c665af033ac8ccfc637..e2be78411634090a054c32db79dee80f7535d1da 100644 --- a/indra/newview/llfloaterparcel.cpp +++ b/indra/newview/llfloaterparcel.cpp @@ -40,6 +40,7 @@ // viewer project includes #include "llcommandhandler.h" #include "llpanelplace.h" +#include "llsidetray.h" // linden library includes #include "lluuid.h" @@ -70,7 +71,10 @@ class LLParcelHandler : public LLCommandHandler { if (parcel_id.notNull()) { - LLFloaterReg::showInstance("parcel_info", LLSD(parcel_id)); + LLSD key; + key["type"] = "remote_place"; + key["id"] = parcel_id; + LLSideTray::getInstance()->showPanel("panel_places", key); return true; } } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1c1f27a25935b31c163026541d7f9d2d1be30e39..ab27375b87e4fd475fd82c2a47586f6d3c84e03f 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -251,7 +251,7 @@ bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFlo { floater->setAllIgnored(); LLFirstUse::disableFirstUse(); - LLFloaterPreference::buildLists(floater); + floater->buildPopupLists(); } } return false; @@ -266,7 +266,7 @@ bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFl { floater->resetAllIgnored(); LLFirstUse::resetFirstUse(); - LLFloaterPreference::buildLists(floater); + floater->buildPopupLists(); } } return false; @@ -391,6 +391,7 @@ LLFloaterPreference::~LLFloaterPreference() ctrl_window_size->setCurrentByIndex(i); } } + void LLFloaterPreference::draw() { BOOL has_first_selected = (getChildRef<LLScrollListCtrl>("disabled_popups").getFirstSelected()!=NULL); @@ -548,17 +549,17 @@ void LLFloaterPreference::cancel() void LLFloaterPreference::onOpen(const LLSD& key) { gAgent.sendAgentUserInfoRequest(); + /////////////////////////// From LLPanelGeneral ////////////////////////// // if we have no agent, we can't let them choose anything // if we have an agent, then we only let them choose if they have a choice - bool canChoose = gAgent.getID().notNull() && - (gAgent.isMature() || gAgent.isGodlike()); + bool can_choose_maturity = + gAgent.getID().notNull() && (gAgent.isMature() || gAgent.isGodlike()); LLComboBox* maturity_combo = getChild<LLComboBox>("maturity_desired_combobox"); - if (canChoose) - { - + if (can_choose_maturity) + { // if they're not adult or a god, they shouldn't see the adult selection, so delete it if (!gAgent.isAdult() && !gAgent.isGodlike()) { @@ -568,8 +569,7 @@ void LLFloaterPreference::onOpen(const LLSD& key) maturity_combo->remove(0); } childSetVisible("maturity_desired_combobox", true); - childSetVisible("maturity_desired_textbox", false); - + childSetVisible("maturity_desired_textbox", false); } else { @@ -577,6 +577,10 @@ void LLFloaterPreference::onOpen(const LLSD& key) childSetVisible("maturity_desired_combobox", false); } + // Enabled/disabled popups, might have been changed by user actions + // while preferences floater was closed. + buildPopupLists(); + LLPanelLogin::setAlwaysRefresh(true); refresh(); @@ -717,14 +721,6 @@ void LLFloaterPreference::updateMeterText(LLUICtrl* ctrl) m1->setVisible(two_digits); m2->setVisible(!two_digits); } -/* -void LLFloaterPreference::onClickClearCache() -{ - // flag client cache for clearing next time the client runs - gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE); - LLNotificationsUtil::add("CacheWillClear"); -} -*/ void LLFloaterPreference::onClickBrowserClearCache() { @@ -794,12 +790,13 @@ void LLFloaterPreference::refreshSkin(void* data) self->getChild<LLRadioGroup>("skin_selection", true)->setValue(sSkin); } -// static -void LLFloaterPreference::buildLists(void* data) + +void LLFloaterPreference::buildPopupLists() { - LLPanel*self = (LLPanel*)data; - LLScrollListCtrl& disabled_popups = self->getChildRef<LLScrollListCtrl>("disabled_popups"); - LLScrollListCtrl& enabled_popups = self->getChildRef<LLScrollListCtrl>("enabled_popups"); + LLScrollListCtrl& disabled_popups = + getChildRef<LLScrollListCtrl>("disabled_popups"); + LLScrollListCtrl& enabled_popups = + getChildRef<LLScrollListCtrl>("enabled_popups"); disabled_popups.deleteAllItems(); enabled_popups.deleteAllItems(); @@ -861,8 +858,7 @@ void LLFloaterPreference::buildLists(void* data) } void LLFloaterPreference::refreshEnabledState() -{ - +{ LLCheckBoxCtrl* ctrl_reflections = getChild<LLCheckBoxCtrl>("Reflections"); LLRadioGroup* radio_reflection_detail = getChild<LLRadioGroup>("ReflectionDetailRadio"); @@ -1111,7 +1107,7 @@ void LLFloaterPreference::onClickEnablePopup() LLUI::sSettingGroups["ignores"]->setBOOL(notification_name, TRUE); } - buildLists(this); + buildPopupLists(); } void LLFloaterPreference::onClickDisablePopup() @@ -1128,8 +1124,9 @@ void LLFloaterPreference::onClickDisablePopup() LLUI::sSettingGroups["ignores"]->setBOOL(notification_name, FALSE); } - buildLists(this); + buildPopupLists(); } + void LLFloaterPreference::resetAllIgnored() { for (LLNotifications::TemplateMap::const_iterator iter = LLNotifications::instance().templatesBegin(); @@ -1428,17 +1425,11 @@ BOOL LLPanelPreference::postBuild() } } - ////////////////////////Panel Popups///////////////// - if(hasChild("disabled_popups") && hasChild("enabled_popups")) - { - LLFloaterPreference::buildLists(this); - } - ////// + if(hasChild("online_visibility") && hasChild("send_im_to_email")) { childSetText("email_address",getString("log_in_to_change") ); -// childSetText("busy_response", getString("log_in_to_change")); - +// childSetText("busy_response", getString("log_in_to_change")); } @@ -1573,8 +1564,7 @@ void LLPanelPreference::saveSettings() { view_stack.push_back(*iter); } - } - + } } void LLPanelPreference::cancel() @@ -1607,4 +1597,3 @@ void LLPanelPreference::setControlFalse(const LLSD& user_data) if (control) control->set(LLSD(FALSE)); } - diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index a30422564aec1cc9c455a5d82f82a62d51a1f6c7..d292f3bb7b7c7b44996cb0ab8226d610cecf084c 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -85,7 +85,6 @@ class LLFloaterPreference : public LLFloater void onBtnCancel(); void onBtnApply(); -// void onClickClearCache(); void onClickBrowserClearCache(); // if the custom settings box is clicked @@ -141,7 +140,7 @@ class LLFloaterPreference : public LLFloater static void initWindowSizeControls(LLPanel* panelp); - static void buildLists(void* data); + void buildPopupLists(); static void refreshSkin(void* data); static void cleanupBadSetting(); static F32 sAspectRatio; @@ -153,7 +152,6 @@ class LLFloaterPreference : public LLFloater bool mOriginalHideOnlineStatus; std::string mDirectoryVisibility; - }; class LLPanelPreference : public LLPanel diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 05a46ad89451e4b40a34d1acffe2f0bbeb048fe5..8a26078f3d3fe4643664a169ebd0fa525e8104af 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -88,8 +88,6 @@ #include "lltrans.h" #include "llagentui.h" -#define ELAR_ENABLED 0 // Enable when server support is implemented - const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; @@ -1995,11 +1993,6 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region) childSetEnabled("remove_banned_avatar_btn", god || owner || manager); childSetEnabled("message_estate_btn", god || owner || manager); childSetEnabled("kick_user_from_estate_btn", god || owner || manager); -#if ELAR_ENABLED - childSetEnabled("abuse_email_address", god || owner || manager); -#else - childSetEnabled("abuse_email_address", false); -#endif // estate managers can't add estate managers childSetEnabled("add_estate_manager_btn", god || owner); @@ -2065,8 +2058,6 @@ BOOL LLPanelEstateInfo::postBuild() initCtrl("limit_payment"); initCtrl("limit_age_verified"); initCtrl("voice_chat_check"); - getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this)); - getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this); // set up the use global time checkbox getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this)); @@ -2276,8 +2267,6 @@ bool LLPanelEstateInfo::commitEstateInfoCaps() } body["sun_hour"] = sun_hour; - body["owner_abuse_email"] = childGetValue("abuse_email_address").asString(); - // we use a responder so that we can re-get the data after committing to the database LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this)); return true; @@ -2436,16 +2425,6 @@ void LLPanelEstateInfo::setOwnerName(const std::string& name) childSetValue("estate_owner", LLSD(name)); } -const std::string LLPanelEstateInfo::getAbuseEmailAddress() const -{ - return childGetValue("abuse_email_address").asString(); -} - -void LLPanelEstateInfo::setAbuseEmailAddress(const std::string& address) -{ - childSetValue("abuse_email_address", LLSD(address)); -} - void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban) @@ -2954,18 +2933,6 @@ bool LLDispatchEstateUpdateInfo::operator()( std::string estate_name = strings[0].c_str(); // preserve c_str() call! panel->setEstateName(estate_name); -#if ELAR_ENABLED - if (strings.size() > 9) - { - std::string abuse_email = strings[9].c_str(); // preserve c_str() call! - panel->setAbuseEmailAddress(abuse_email); - } - else -#endif - { - panel->setAbuseEmailAddress(panel->getString("email_unsupported")); - } - LLViewerRegion* regionp = gAgent.getRegion(); LLUUID owner_id(strings[1]); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index a3b91223b78bed0785923fcaf73af96104e99f8b..704166d1065e66b22c612f04290a5b5039bd2993 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -330,9 +330,6 @@ class LLPanelEstateInfo : public LLPanelRegionInfo const std::string getOwnerName() const; void setOwnerName(const std::string& name); - const std::string getAbuseEmailAddress() const; - void setAbuseEmailAddress(const std::string& address); - // If visible from mainland, allowed agent and allowed groups // are ignored, so must disable UI. void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 408303a1e0474f142b6b9d9f8057a65ea836244f..932e49c79be542cd5e015149938fed648da7232d 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -95,7 +95,6 @@ const U32 INCLUDE_SCREENSHOT = 0x01 << 0; LLFloaterReporter::LLFloaterReporter(const LLSD& key) : LLFloater(key), mReportType(COMPLAINT_REPORT), - mEmailToEstateOwner(FALSE), mObjectID(), mScreenID(), mAbuserID(), @@ -117,18 +116,7 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg) if ( LLFloaterReg::instanceVisible("reporter") ) { - LLFloaterReporter *f = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter"); - BOOL email_to_estate_owner = ( region_flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER ); - f->mEmailToEstateOwner = email_to_estate_owner; - - if ( email_to_estate_owner ) - { - LLNotificationsUtil::add("HelpReportAbuseEmailEO"); - } - else - { - LLNotificationsUtil::add("HelpReportAbuseEmailLL"); - } + LLNotificationsUtil::add("HelpReportAbuseEmailLL"); }; } // virtual @@ -218,17 +206,7 @@ LLFloaterReporter::~LLFloaterReporter() // virtual void LLFloaterReporter::draw() { - // this is set by a static callback sometime after the dialog is created. - // Only disable screenshot for abuse reports to estate owners - if ( mEmailToEstateOwner ) - { - childSetValue("screen_check", FALSE ); - childSetEnabled("screen_check", FALSE ); - } - else - { - childSetEnabled("screen_check", TRUE ); - } + childSetEnabled("screen_check", TRUE ); LLFloater::draw(); } @@ -637,11 +615,7 @@ LLSD LLFloaterReporter::gatherReport() LLUUID screenshot_id = LLUUID::null; if (childGetValue("screen_check")) { - - if ( mEmailToEstateOwner == FALSE ) - { - screenshot_id = childGetValue("screenshot"); - } + screenshot_id = childGetValue("screenshot"); }; LLSD report = LLSD::emptyMap(); diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index 917f51364170d4617d4f29bbaa6e59b325427433..a3776f3d279715f90a1a4240af71a87c56d42abc 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -124,7 +124,6 @@ class LLFloaterReporter private: EReportType mReportType; - BOOL mEmailToEstateOwner; LLUUID mObjectID; LLUUID mScreenID; LLUUID mAbuserID; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 2c618263ec497012b2840c2756b1745f4adc4e9d..c6589637080ddb3d6fce93925292b94c28ec8afb 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -42,7 +42,8 @@ LLFloaterSearch::LLFloaterSearch(const LLSD& key) : LLFloater(key), LLViewerMediaObserver(), - mBrowser(NULL) + mBrowser(NULL), + mSearchGodLevel(0) { // declare a map that transforms a category name into // the URL suffix that is used to search that category @@ -86,12 +87,21 @@ void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent eve case MEDIA_EVENT_NAVIGATE_COMPLETE: childSetText("status_text", 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). + childSetVisible("refresh_search", (godlevel != mSearchGodLevel)); +} + void LLFloaterSearch::search(const LLSD &key) { if (! mBrowser) @@ -99,6 +109,10 @@ void LLFloaterSearch::search(const LLSD &key) return; } + // reset the god level warning as we're sending the latest state + childHide("refresh_search"); + mSearchGodLevel = gAgent.getGodLevel(); + // get the URL for the search page std::string url = getString("search_url"); if (! LLStringUtil::endsWith(url, "/")) diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index 743107484f9a43f51e3b7db6865d34a49b76a241..ba817adf7f060271b877a55d72419cbe7491af11 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -66,14 +66,20 @@ class LLFloaterSearch : /// "events", "groups", "wiki", "destinations", "classifieds" void search(const LLSD &key); + /// changing godmode can affect the search results that are + /// returned by the search website - use this method to tell the + /// search floater that the user has changed god level. + void godLevelChanged(U8 godlevel); + private: /*virtual*/ BOOL postBuild(); // inherited from LLViewerMediaObserver /*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event); - + LLMediaCtrl *mBrowser; LLSD mCategoryPaths; + U8 mSearchGodLevel; }; #endif // LL_LLFLOATERSEARCH_H diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 6ba032c152651f77d49c68a5c4b0e03f8f230396..7fb71d4d4f583fcabaf5ff9e632496c5f646fbbc 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -991,7 +991,7 @@ S32 LLFloaterTools::calcRenderCost() if (viewer_volume) { cost += viewer_volume->getRenderCost(textures); - cost += textures.size() * 5; + cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; textures.clear(); } } @@ -1080,7 +1080,7 @@ void LLFloaterTools::getMediaState() { LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); LLViewerObject* first_object = selected_objects->getFirstObject(); - LLLineEditor* media_info = getChild<LLLineEditor>("media_info"); + LLTextBox* media_info = getChild<LLTextBox>("media_info"); if( !(first_object && first_object->getPCode() == LL_PCODE_VOLUME @@ -1088,12 +1088,6 @@ void LLFloaterTools::getMediaState() )) { childSetEnabled("Add_Media", FALSE); -/* childSetEnabled("media_tex", FALSE); - childSetEnabled("add_media", FALSE); - childSetEnabled("delete_media", FALSE); - childSetEnabled("edit_media", FALSE); - childSetEnabled("media_info", FALSE); - media_info->setEnabled(FALSE);*/ media_info->clear(); clearMediaSettings(); return; @@ -1105,13 +1099,6 @@ void LLFloaterTools::getMediaState() if(!has_media_capability) { childSetEnabled("Add_Media", FALSE); - /* childSetEnabled("media_tex", FALSE); - childSetEnabled("add_media", FALSE); - childSetEnabled("delete_media", FALSE); - childSetEnabled("edit_media", FALSE); - childSetEnabled("media_info", FALSE); - media_info->setEnabled(FALSE); - media_info->clear();*/ LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL; clearMediaSettings(); return; @@ -1233,7 +1220,6 @@ void LLFloaterTools::getMediaState() childSetEnabled( "edit_media", bool_has_media & editable ); childSetEnabled( "delete_media", bool_has_media & editable ); childSetEnabled( "add_media", ( ! bool_has_media ) & editable ); - media_info->setEnabled(false); // TODO: display a list of all media on the face - use 'identical' flag } else // not all face has media but at least one does. @@ -1260,8 +1246,6 @@ void LLFloaterTools::getMediaState() } } - media_info->setEnabled(false); - media_info->setTentative(true); childSetEnabled("media_tex", TRUE); childSetEnabled( "edit_media", TRUE); childSetEnabled( "delete_media", TRUE); @@ -1392,7 +1376,7 @@ void LLFloaterTools::updateMediaTitle() if ( ! media_title.empty() ) { // update the UI widget - LLLineEditor* media_title_field = getChild<LLLineEditor>("media_info"); + LLTextBox* media_title_field = getChild<LLTextBox>("media_info"); if ( media_title_field ) { media_title_field->setText( media_title ); diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp index 43024a4bd03fd3ae7178fda4dc29feb774d0cf73..3951f4291f7b7ce3fd4fe3e069e51f97ea2acf7c 100644 --- a/indra/newview/llfloatervoicedevicesettings.cpp +++ b/indra/newview/llfloatervoicedevicesettings.cpp @@ -40,7 +40,6 @@ #include "llcombobox.h" #include "llfocusmgr.h" #include "lliconctrl.h" -#include "llsliderctrl.h" #include "llviewercontrol.h" #include "llvoiceclient.h" #include "llvoicechannel.h" @@ -61,9 +60,6 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); mDevicesUpdated = FALSE; - // grab "live" mic volume level - mMicVolume = gSavedSettings.getF32("AudioLevelMic"); - // ask for new device enumeration // now do this in onOpen() instead... //gVoiceClient->refreshDeviceLists(); @@ -75,10 +71,6 @@ LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings() BOOL LLPanelVoiceDeviceSettings::postBuild() { - LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider"); - // set mic volume tuning slider based on last mic volume setting - volume_slider->setValue(mMicVolume); - childSetCommitCallback("voice_input_device", onCommitInputDevice, this); childSetCommitCallback("voice_output_device", onCommitOutputDevice, this); @@ -157,15 +149,6 @@ void LLPanelVoiceDeviceSettings::apply() gSavedSettings.setString("VoiceOutputAudioDevice", s); mOutputDevice = s; } - - // assume we are being destroyed by closing our embedding window - LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider"); - if(volume_slider) - { - F32 slider_value = (F32)volume_slider->getValue().asReal(); - gSavedSettings.setF32("AudioLevelMic", slider_value); - mMicVolume = slider_value; - } } void LLPanelVoiceDeviceSettings::cancel() @@ -178,22 +161,12 @@ void LLPanelVoiceDeviceSettings::cancel() if(mCtrlOutputDevices) mCtrlOutputDevices->setSimple(mOutputDevice); - - gSavedSettings.setF32("AudioLevelMic", mMicVolume); - LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider"); - if(volume_slider) - { - volume_slider->setValue(mMicVolume); - } } void LLPanelVoiceDeviceSettings::refresh() { - //grab current volume - LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider"); - // set mic volume tuning slider based on last mic volume setting - F32 current_volume = (F32)volume_slider->getValue().asReal(); - gVoiceClient->tuningSetMicVolume(current_volume); + // update the live input level display + gVoiceClient->tuningSetMicVolume(); // Fill in popup menus mCtrlInputDevices = getChild<LLComboBox>("voice_input_device"); @@ -263,7 +236,6 @@ void LLPanelVoiceDeviceSettings::initialize() { mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); - mMicVolume = gSavedSettings.getF32("AudioLevelMic"); mDevicesUpdated = FALSE; // ask for new device enumeration diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h index d67283d0a224d5a4357bbeb4cb97c086998a3806..20958af780c37b084e1791a79ccc3c4fb30c2c99 100644 --- a/indra/newview/llfloatervoicedevicesettings.h +++ b/indra/newview/llfloatervoicedevicesettings.h @@ -56,7 +56,6 @@ class LLPanelVoiceDeviceSettings : public LLPanel static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data); static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data); - F32 mMicVolume; std::string mInputDevice; std::string mOutputDevice; class LLComboBox *mCtrlInputDevices; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 4e77b421875855e1a9a390ef8bb915a60103d32a..321982ceb62d780b050f1eeea9064fc22facba0f 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -357,6 +357,16 @@ void LLFolderView::openFolder(const std::string& foldername) } } +void LLFolderView::openTopLevelFolders() +{ + for (folders_t::iterator iter = mFolders.begin(); + iter != mFolders.end();) + { + folders_t::iterator fit = iter++; + (*fit)->setOpen(TRUE); + } +} + void LLFolderView::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse) { // call base class to do proper recursion @@ -401,7 +411,12 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen folderp->setVisible(show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders? (folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter } - if (folderp->getVisible()) + + // Need to call arrange regardless of visibility, since children's visibility + // might need to be changed too (e.g. even though a folder is invisible, its + // children also need to be set invisible for state-tracking purposes, e.g. + // llfolderviewitem::filter). + // if (folderp->getVisible()) { S32 child_height = 0; S32 child_width = 0; @@ -469,13 +484,13 @@ void LLFolderView::filter( LLInventoryFilter& filter ) if (getCompletedFilterGeneration() < filter.getCurrentGeneration()) { - mFiltered = FALSE; + mPassedFilter = FALSE; mMinWidth = 0; LLFolderViewFolder::filter(filter); } else { - mFiltered = TRUE; + mPassedFilter = TRUE; } } @@ -890,7 +905,7 @@ void LLFolderView::draw() } else { - mStatusText = LLTrans::getString("InventoryNoMatchingItems"); + mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage()); font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 4adf6c2fbf90ef38335d46eebc1f445a7d9dc0b0..d18ba385d82d6caf88e95f33e1bb966dd26a5b32 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -127,6 +127,7 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler // Close all folders in the view void closeAllFolders(); void openFolder(const std::string& foldername); + void openTopLevelFolders(); virtual void toggleOpen() {}; virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse); diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 63511301b316d0f0766d7e61ff94bf9957345f83..135821f662db00b9acfcc115425097a360d80f9c 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -40,6 +40,7 @@ #include "llinventoryfilter.h" #include "llpanel.h" #include "llviewercontrol.h" // gSavedSettings +#include "llviewerinventory.h" #include "llviewerwindow.h" // Argh, only for setCursor() // linden library includes @@ -62,6 +63,7 @@ const F32 LLFolderViewItem::FOLDER_OPEN_TIME_CONSTANT = 0.03f; const LLColor4U DEFAULT_WHITE(255, 255, 255); + //static LLFontGL* LLFolderViewItem::getLabelFontForStyle(U8 style) { @@ -120,7 +122,7 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p) mHasVisibleChildren(FALSE), mIndentation(0), mNumDescendantsSelected(0), - mFiltered(FALSE), + mPassedFilter(FALSE), mLastFilterGeneration(-1), mStringMatchOffset(std::string::npos), mControlLabelRotation(0.f), @@ -222,17 +224,17 @@ BOOL LLFolderViewItem::potentiallyVisible() BOOL LLFolderViewItem::getFiltered() { - return mFiltered && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration(); + return mPassedFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration(); } BOOL LLFolderViewItem::getFiltered(S32 filter_generation) { - return mFiltered && mLastFilterGeneration >= filter_generation; + return mPassedFilter && mLastFilterGeneration >= filter_generation; } void LLFolderViewItem::setFiltered(BOOL filtered, S32 filter_generation) { - mFiltered = filtered; + mPassedFilter = filtered; mLastFilterGeneration = filter_generation; } @@ -387,7 +389,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo // makes sure that this view and it's children are the right size. S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation) { - mIndentation = getParentFolder() && getParentFolder()->getParentFolder() + mIndentation = (getParentFolder() + && getParentFolder()->getParentFolder() + && getParentFolder()->getParentFolder()->getParentFolder()) ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0; if (mLabelWidthDirty) @@ -420,19 +424,20 @@ S32 LLFolderViewItem::getItemHeight() void LLFolderViewItem::filter( LLInventoryFilter& filter) { - BOOL filtered = mListener && filter.check(this); + const BOOL previous_passed_filter = mPassedFilter; + const BOOL passed_filter = mListener && filter.check(this); - // if our visibility will change as a result of this filter, then + // If our visibility will change as a result of this filter, then // we need to be rearranged in our parent folder - if (getVisible() != filtered) + if (mParentFolder) { - if (mParentFolder) - { + if (getVisible() != passed_filter) + mParentFolder->requestArrange(); + if (passed_filter != previous_passed_filter) mParentFolder->requestArrange(); - } } - setFiltered(filtered, filter.getCurrentGeneration()); + setFiltered(passed_filter, filter.getCurrentGeneration()); mStringMatchOffset = filter.getStringMatchOffset(); filter.decrementFilterCount(); @@ -600,6 +605,11 @@ const std::string& LLFolderViewItem::getSearchableLabel() const return mSearchableLabel; } +LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void) +{ + return gInventory.getItem(getListener()->getUUID()); +} + std::string LLFolderViewItem::getName( void ) const { if(mListener) @@ -735,15 +745,6 @@ BOOL LLFolderViewItem::handleDoubleClick( S32 x, S32 y, MASK mask ) return TRUE; } -BOOL LLFolderViewItem::handleScrollWheel(S32 x, S32 y, S32 clicks) -{ - if (getParent()) - { - return getParent()->handleScrollWheel(x, y, clicks); - } - return FALSE; -} - BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask ) { if (LLView::childrenHandleMouseUp(x, y, mask)) @@ -1243,7 +1244,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter) if (getLastFilterGeneration() < filter_generation) { if (getLastFilterGeneration() >= must_pass_generation && // folder has been compared to a valid precursor filter - !mFiltered) // and did not pass the filter + !mPassedFilter) // and did not pass the filter { // go ahead and flag this folder as done mLastFilterGeneration = filter_generation; @@ -1381,7 +1382,7 @@ void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation) { // if this folder is now filtered, but wasn't before // (it just passed) - if (filtered && !mFiltered) + if (filtered && !mPassedFilter) { // reset current height, because last time we drew it // it might have had more visible items than now @@ -2153,12 +2154,6 @@ BOOL LLFolderViewFolder::handleHover(S32 x, S32 y, MASK mask) handled = LLFolderViewItem::handleHover(x, y, mask); } - //if(x < LEFT_INDENTATION + mIndentation && x > mIndentation - LEFT_PAD && y > getRect().getHeight() - ) - //{ - // gViewerWindow->setCursor(UI_CURSOR_ARROW); - // mExpanderHighlighted = TRUE; - // handled = TRUE; - //} return handled; } @@ -2171,7 +2166,7 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask ) } if( !handled ) { - if(x < LEFT_INDENTATION + mIndentation && x > mIndentation - LEFT_PAD) + if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD) { toggleOpen(); handled = TRUE; @@ -2205,7 +2200,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask ) } if( !handled ) { - if(x < LEFT_INDENTATION + mIndentation && x > mIndentation - LEFT_PAD) + if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD) { // don't select when user double-clicks plus sign // so as not to contradict single-click behavior diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index f6264ec968a39572164abdf4b4a7da31a92a9dc8..620aa070b99a6aa775af10d69798a375ac4aeca7 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -45,6 +45,7 @@ class LLFolderViewListenerFunctor; class LLInventoryFilter; class LLMenuGL; class LLUIImage; +class LLViewerInventoryItem; // These are grouping of inventory types. // Order matters when sorting system folders to the top. @@ -110,7 +111,7 @@ class LLFolderViewItem : public LLView // layout constants static const S32 LEFT_PAD = 5; - static const S32 LEFT_INDENTATION = 8; + static const S32 LEFT_INDENTATION = 2; static const S32 ICON_PAD = 2; static const S32 ICON_WIDTH = 16; static const S32 TEXT_PAD = 1; @@ -120,6 +121,9 @@ class LLFolderViewItem : public LLView static const F32 FOLDER_CLOSE_TIME_CONSTANT; static const F32 FOLDER_OPEN_TIME_CONSTANT; + // Mostly for debugging printout purposes. + const std::string& getSearchableLabel() { return mSearchableLabel; } + protected: friend class LLUICtrlFactory; friend class LLFolderViewEventListener; @@ -148,7 +152,7 @@ class LLFolderViewItem : public LLView BOOL mHasVisibleChildren; S32 mIndentation; S32 mNumDescendantsSelected; - BOOL mFiltered; + BOOL mPassedFilter; S32 mLastFilterGeneration; std::string::size_type mStringMatchOffset; F32 mControlLabelRotation; @@ -156,8 +160,8 @@ class LLFolderViewItem : public LLView BOOL mDragAndDropTarget; LLUIImagePtr mArrowImage; LLUIImagePtr mBoxImage; - BOOL mIsLoading; - LLTimer mTimeSinceRequestStart; + BOOL mIsLoading; + LLTimer mTimeSinceRequestStart; bool mDontShowInHierarchy; // helper function to change the selection from the root. @@ -202,7 +206,7 @@ class LLFolderViewItem : public LLView virtual S32 arrange( S32* width, S32* height, S32 filter_generation ); virtual S32 getItemHeight(); void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; } - bool getDontShowInHierarchy() { return mDontShowInHierarchy; } + bool getDontShowInHierarchy() const { return mDontShowInHierarchy; } // applies filters to control visibility of inventory items virtual void filter( LLInventoryFilter& filter); @@ -281,6 +285,9 @@ class LLFolderViewItem : public LLView const LLFolderViewEventListener* getListener( void ) const { return mListener; } LLFolderViewEventListener* getListener( void ) { return mListener; } + + // Gets the inventory item if it exists (null otherwise) + LLViewerInventoryItem * getInventoryItem(void); // just rename the object. void rename(const std::string& new_name); @@ -319,7 +326,6 @@ class LLFolderViewItem : public LLView virtual BOOL handleHover( S32 x, S32 y, MASK mask ); virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask ); virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask ); - virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); // virtual void handleDropped(); virtual void draw(); @@ -329,7 +335,7 @@ class LLFolderViewItem : public LLView EAcceptance* accept, std::string& tooltip_msg); - private: +private: static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts }; diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 2bc07d0c27427bb819ca31a5a604b0ec8223ad96..47a168e354999135ae96e44ec83f459af5c99362 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -90,8 +90,20 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id) case IM_SESSION_CONFERENCE_START: mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this); break; - default: + case IM_SESSION_GROUP_START: mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this); + break; + case IM_SESSION_INVITE: + if (gAgent.isInGroup(mSessionID)) + { + mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this); + } + else + { + mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this); + } + break; + default: break; } } } @@ -415,6 +427,7 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock) if(channel) { channel->updateShowToastsState(); + channel->redrawToasts(); } } @@ -439,6 +452,7 @@ void LLIMFloater::setVisible(BOOL visible) if(channel) { channel->updateShowToastsState(); + channel->redrawToasts(); } if (visible && mChatHistory && mInputEditor) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 6c4af0522f4f00a5db24a5884dad3ba1bdb811d6..4d2ba16a4cf1c61c20fad5742fa0aad16d3b48b4 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -88,6 +88,9 @@ const static std::string IM_TEXT("message"); const static std::string IM_FROM("from"); const static std::string IM_FROM_ID("from_id"); +const static std::string NO_SESSION("(IM Session Doesn't Exist)"); +const static std::string ADHOC_NAME_SUFFIX(" Conference"); + std::string LLCallDialogManager::sPreviousSessionlName = ""; std::string LLCallDialogManager::sCurrentSessionlName = ""; LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL; @@ -116,6 +119,13 @@ void toast_callback(const LLSD& msg){ return; } + // Skip toasting if we have open window of IM with this session id + LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]); + if (open_im_floater && open_im_floater->getVisible()) + { + return; + } + LLSD args; args["MESSAGE"] = msg["message"]; args["TIME"] = msg["time"]; @@ -154,11 +164,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& mInitialTargetIDs(ids), mVoiceChannel(NULL), mSpeakers(NULL), - mCallDialogManager(NULL), mSessionInitialized(false), mCallBackEnabled(true), mTextIMPossible(true), - mOtherParticipantIsAvatar(true) + mOtherParticipantIsAvatar(true), + mStartCallOnInitialize(false) { if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type) { @@ -287,9 +297,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES LLIMModel::LLIMSession::~LLIMSession() { - delete mCallDialogManager; - mCallDialogManager = NULL; - delete mSpeakers; mSpeakers = NULL; @@ -413,6 +420,12 @@ void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, con { im_floater->sessionInitReplyReceived(new_session_id); } + + // auto-start the call on session initialization? + if (session->mStartCallOnInitialize) + { + gIMMgr->startCall(new_session_id); + } } //*TODO remove this "floater" stuff when Communicate Floater is gone @@ -448,10 +461,16 @@ void LLIMModel::testMessages() addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ."); } - +//session name should not be empty bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids) { + if (name.empty()) + { + llwarns << "Attempt to create a new session with empty name; id = " << session_id << llendl; + return false; + } + if (findIMSession(session_id)) { llwarns << "IM Session " << session_id << " already exists" << llendl; @@ -608,7 +627,7 @@ const std::string& LLIMModel::getName(const LLUUID& session_id) const if (!session) { llwarns << "session " << session_id << "does not exist " << llendl; - return LLStringUtil::null; + return NO_SESSION; } return session->mName; @@ -995,18 +1014,6 @@ bool LLIMModel::sendStartSession( return false; } -// static -void LLIMModel::sendSessionInitialized(const LLUUID &session_id) -{ - LLIMSession* session = getInstance()->findIMSession(session_id); - if (session) - { - LLSD arg; - arg["session_id"] = session_id; - getInstance()->mSessionInitializedSignal(arg); - } -} - // // Helper Functions // @@ -1079,7 +1086,7 @@ class LLViewerChatterBoxInvitationAcceptResponder : if ( 404 == statusNum ) { std::string error_string; - error_string = "does not exist"; + error_string = "session_does_not_exist_error"; gIMMgr->showSessionStartError(error_string, mSessionID); } } @@ -1268,6 +1275,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat { LLSD mCallDialogPayload; LLOutgoingCallDialog* ocd; + bool is_incoming; mCallDialogPayload["session_id"] = sSession->mSessionID; mCallDialogPayload["session_name"] = sSession->mName; @@ -1277,8 +1285,10 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat switch(new_state) { case LLVoiceChannel::STATE_CALL_STARTED : - // do not show "Calling to..." if it is incoming P2P call - if(sSession->mSessionType == LLIMModel::LLIMSession::P2P_SESSION && static_cast<LLVoiceChannelP2P*>(sSession->mVoiceChannel)->isIncomingCall()) + // do not show "Calling to..." if it is incoming call + is_incoming = LLVoiceClient::getInstance()->isSessionIncoming(sSession->mSessionID); + // *TODO: implement for AdHoc and Group voice chats + if(is_incoming) { return; } @@ -1290,6 +1300,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat ocd->getChild<LLTextBox>("leaving")->setVisible(true); ocd->getChild<LLTextBox>("connecting")->setVisible(false); ocd->getChild<LLTextBox>("noanswer")->setVisible(false); + ocd->getChild<LLButton>("Cancel")->setVisible(true); } return; @@ -1301,10 +1312,12 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat ocd->getChild<LLTextBox>("leaving")->setVisible(true); ocd->getChild<LLTextBox>("connecting")->setVisible(true); ocd->getChild<LLTextBox>("noanswer")->setVisible(false); + ocd->getChild<LLButton>("Cancel")->setVisible(true); } return; case LLVoiceChannel::STATE_ERROR : + mCallDialogPayload["start_timer"] = true; ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE)); if (ocd) { @@ -1312,6 +1325,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat ocd->getChild<LLTextBox>("leaving")->setVisible(false); ocd->getChild<LLTextBox>("connecting")->setVisible(false); ocd->getChild<LLTextBox>("noanswer")->setVisible(true); + ocd->getChild<LLButton>("Cancel")->setVisible(false); } return; @@ -1363,6 +1377,33 @@ LLCallDialog(payload) instance->onCancel(instance); } } +void LLOutgoingCallDialog::draw() +{ + if (lifetimeHasExpired()) + { + onLifetimeExpired(); + } + LLDockableFloater::draw(); +} + +bool LLOutgoingCallDialog::lifetimeHasExpired() +{ + if (mLifetimeTimer.getStarted()) + { + F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32(); + if (elapsed_time > LIFETIME) + { + return true; + } + } + return false; +} + +void LLOutgoingCallDialog::onLifetimeExpired() +{ + mLifetimeTimer.stop(); + closeFloater(); +} void LLOutgoingCallDialog::onOpen(const LLSD& key) { @@ -1391,6 +1432,13 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key) childSetTextArg("connecting", "[CALLEE_NAME]", callee_name); LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); icon->setValue(callee_id); + + // stop timer by default + mLifetimeTimer.stop(); + if(mPayload.has("start_timer")) + { + mLifetimeTimer.reset(); + } } @@ -1514,6 +1562,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response) return; LLUUID session_id = mPayload["session_id"].asUUID(); + LLUUID caller_id = mPayload["caller_id"].asUUID(); + std::string session_name = mPayload["session_name"].asString(); EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger(); LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger(); bool voice = true; @@ -1530,8 +1580,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response) { // create a normal IM session session_id = gIMMgr->addP2PSession( - mPayload["session_name"].asString(), - mPayload["caller_id"].asUUID(), + session_name, + caller_id, mPayload["session_handle"].asString(), mPayload["session_uri"].asString()); @@ -1549,10 +1599,38 @@ void LLIncomingCallDialog::processCallResponse(S32 response) } else { - LLUUID new_session_id = gIMMgr->addSession( - mPayload["session_name"].asString(), - type, - session_id); + //session name should not be empty, but it can contain spaces so we don't trim + std::string correct_session_name = session_name; + if (session_name.empty()) + { + llwarns << "Received an empty session name from a server" << llendl; + + switch(type){ + case IM_SESSION_CONFERENCE_START: + case IM_SESSION_GROUP_START: + case IM_SESSION_INVITE: + if (gAgent.isInGroup(session_id)) + { + LLGroupData data; + if (!gAgent.getGroupData(session_id, data)) break; + correct_session_name = data.mName; + } + else + { + if (gCacheName->getFullName(caller_id, correct_session_name)) + { + correct_session_name.append(ADHOC_NAME_SUFFIX); + } + } + llinfos << "Corrected session name is " << correct_session_name << llendl; + break; + default: + llwarning("Received an empty session name from a server and failed to generate a new proper session name", 0); + break; + } + } + + LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id); if (new_session_id != LLUUID::null) { LLIMFloater::show(new_session_id); @@ -1929,6 +2007,15 @@ BOOL LLIMMgr::getIMReceived() const return mIMReceived; } +void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id) +{ + LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id); + if (session) + { + session->mStartCallOnInitialize = true; + } +} + LLUUID LLIMMgr::addP2PSession(const std::string& name, const LLUUID& other_participant_id, const std::string& voice_session_handle, @@ -1979,6 +2066,12 @@ LLUUID LLIMMgr::addSession( return LLUUID::null; } + if (name.empty()) + { + llwarning("Session name cannot be null!", 0); + return LLUUID::null; + } + LLUUID session_id = computeSessionID(dialog,other_participant_id); bool new_session = !LLIMModel::getInstance()->findIMSession(session_id); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index c002434a18389b9da421114b6bc1d5ccd6e873d0..f26889ac91d9d4114b9f12e89b574e5e2556d69f 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -81,7 +81,6 @@ class LLIMModel : public LLSingleton<LLIMModel> SType mSessionType; LLUUID mOtherParticipantID; std::vector<LLUUID> mInitialTargetIDs; - LLCallDialogManager* mCallDialogManager; // connection to voice channel state change signal boost::signals2::connection mVoiceChannelStateChangeConnection; @@ -105,6 +104,7 @@ class LLIMModel : public LLSingleton<LLIMModel> bool mTextIMPossible; bool mOtherParticipantIsAvatar; + bool mStartCallOnInitialize; }; @@ -124,7 +124,6 @@ class LLIMModel : public LLSingleton<LLIMModel> typedef boost::function<void(const LLSD&)> session_callback_t; session_signal_t mNewMsgSignal; session_signal_t mNoUnreadMsgsSignal; - session_signal_t mSessionInitializedSignal; /** * Find an IM Session corresponding to session_id @@ -139,10 +138,10 @@ class LLIMModel : public LLSingleton<LLIMModel> boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); } boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); } - boost::signals2::connection addSessionInitializedCallback(session_callback_t cb ) { return mSessionInitializedSignal.connect(cb); } /** * Create new session object in a model + * @param name session name should not be empty, will return false if empty */ bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids = std::vector<LLUUID>()); @@ -213,7 +212,6 @@ class LLIMModel : public LLSingleton<LLIMModel> static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, EInstantMessage dialog); static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing); - static void sendSessionInitialized(const LLUUID &session_id); static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, const LLUUID& other_participant_id, EInstantMessage dialog); @@ -299,6 +297,7 @@ class LLIMMgr : public LLSingleton<LLIMMgr> /** * Creates a P2P session with the requisite handle for responding to voice calls. * + * @param name session name, cannot be null * @param caller_uri - sip URI of caller. It should be always be passed into the method to avoid * incorrect working of LLVoiceChannel instances. See EXT-2985. */ @@ -330,6 +329,9 @@ class LLIMMgr : public LLSingleton<LLIMMgr> void notifyNewIM(); void clearNewIMNotification(); + // automatically start a call once the session has initialized + void autoStartCallOnStartup(const LLUUID& session_id); + // IM received that you haven't seen yet BOOL getIMReceived() const; @@ -493,7 +495,16 @@ class LLOutgoingCallDialog : public LLCallDialog static void onCancel(void* user_data); + // check timer state + /*virtual*/ void draw(); + private: + // lifetime timer for NO_ANSWER notification + LLTimer mLifetimeTimer; + // lifetime duration for NO_ANSWER notification + static const S32 LIFETIME = 5; + bool lifetimeHasExpired(); + void onLifetimeExpired(); }; // Globals diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 83beae29c1d6f3b83fb34075e5648ea8573b3de9..39114d64b4ddfcc6acf2041e5cdb4254e6033742 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -42,10 +42,12 @@ #include "lldateutil.h" #include "llfloaterreporter.h" #include "llfloaterworldmap.h" +#include "llimview.h" #include "llinspect.h" #include "llmutelist.h" #include "llpanelblockedlist.h" #include "llstartup.h" +#include "llspeakers.h" #include "llviewermenu.h" #include "llvoiceclient.h" #include "llviewerobjectlist.h" @@ -99,6 +101,12 @@ class LLInspectAvatar : public LLInspect // Set the volume slider to this user's current client-side volume setting, // hiding/disabling if the user is not nearby. void updateVolumeSlider(); + + // Shows/hides moderator panel depending on voice state + void updateModeratorPanel(); + + // Moderator ability to enable/disable voice chat for avatar + void toggleSelectedVoice(bool enabled); // Button callbacks void onClickAddFriend(); @@ -205,10 +213,12 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this)); mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this)); mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this)); - mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this)); - mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject", + mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false)); + mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true)); + mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this)); + mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject", boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this)); - mVisibleCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", + mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", boost::bind(&LLInspectAvatar::onVisibleZoomIn, this)); mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this)); @@ -277,6 +287,8 @@ void LLInspectAvatar::onOpen(const LLSD& data) requestUpdate(); updateVolumeSlider(); + + updateModeratorPanel(); } // virtual @@ -366,6 +378,119 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data) mPropertiesRequest = NULL; } +void LLInspectAvatar::updateModeratorPanel() +{ + bool enable_moderator_panel = false; + + if (LLVoiceChannel::getCurrentVoiceChannel()) + { + LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID(); + + if (session_id != LLUUID::null) + { + LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id); + + if (speaker_mgr) + { + LLPointer<LLSpeaker> self_speakerp = speaker_mgr->findSpeaker(gAgent.getID()); + LLPointer<LLSpeaker> selected_speakerp = speaker_mgr->findSpeaker(mAvatarID); + + if(speaker_mgr->isVoiceActive() && selected_speakerp && + ((self_speakerp && self_speakerp->mIsModerator) || gAgent.isGodlike())) + { + getChild<LLUICtrl>("enable_voice")->setVisible(selected_speakerp->mModeratorMutedVoice); + getChild<LLUICtrl>("disable_voice")->setVisible(!selected_speakerp->mModeratorMutedVoice); + + enable_moderator_panel = true; + } + } + } + } + + if (enable_moderator_panel) + { + if (!getChild<LLUICtrl>("moderator_panel")->getVisible()) + { + getChild<LLUICtrl>("moderator_panel")->setVisible(true); + // stretch the floater so it can accommodate the moderator panel + reshape(getRect().getWidth(), getRect().getHeight() + getChild<LLUICtrl>("moderator_panel")->getRect().getHeight()); + } + } + else if (getChild<LLUICtrl>("moderator_panel")->getVisible()) + { + getChild<LLUICtrl>("moderator_panel")->setVisible(false); + // shrink the inspector floater back to original size + reshape(getRect().getWidth(), getRect().getHeight() - getChild<LLUICtrl>("moderator_panel")->getRect().getHeight()); + } +} + +void LLInspectAvatar::toggleSelectedVoice(bool enabled) +{ + LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID(); + LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id); + + if (speaker_mgr) + { + if (!gAgent.getRegion()) + return; + + std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest"); + LLSD data; + data["method"] = "mute update"; + data["session-id"] = session_id; + data["params"] = LLSD::emptyMap(); + data["params"]["agent_id"] = mAvatarID; + data["params"]["mute_info"] = LLSD::emptyMap(); + // ctrl value represents ability to type, so invert + data["params"]["mute_info"]["voice"] = !enabled; + + class MuteVoiceResponder : public LLHTTPClient::Responder + { + public: + MuteVoiceResponder(const LLUUID& session_id) + { + mSessionID = session_id; + } + + virtual void error(U32 status, const std::string& reason) + { + llwarns << status << ": " << reason << llendl; + + if ( gIMMgr ) + { + //403 == you're not a mod + //should be disabled if you're not a moderator + if ( 403 == status ) + { + gIMMgr->showSessionEventError( + "mute", + "not_a_moderator", + mSessionID); + } + else + { + gIMMgr->showSessionEventError( + "mute", + "generic", + mSessionID); + } + } + } + + private: + LLUUID mSessionID; + }; + + LLHTTPClient::post( + url, + data, + new MuteVoiceResponder(speaker_mgr->getSessionID())); + } + + closeFloater(); + +} + void LLInspectAvatar::updateVolumeSlider() { // By convention, we only display and toggle voice mutes, not all mutes diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 93cfbddc923c3d50499f8bb30cd9ffedd9f807fc..419910b5b6c77bbb6ac98ea6b92387bb25614855 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -508,12 +508,59 @@ void hide_context_entries(LLMenuGL& menu, } } +bool isWornLink(LLUUID link_id) +{ + LLViewerInventoryItem *link = gInventory.getItem(link_id); + if (!link) + return false; + LLViewerInventoryItem *item = link->getLinkedItem(); + if (!item) + return false; + + switch(item->getType()) + { + case LLAssetType::AT_OBJECT: + { + LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject(); + if(my_avatar && my_avatar->isWearingAttachment(item->getUUID())) + return true; + } + break; + + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_CLOTHING: + if(gAgentWearables.isWearingItem(item->getUUID())) + return true; + break; + + case LLAssetType::AT_GESTURE: + if (LLGestureManager::instance().isGestureActive(item->getUUID())) + return true; + break; + default: + break; + } + return false; +} + // Helper for commonly-used entries void LLInvFVBridge::getClipboardEntries(bool show_asset_id, std::vector<std::string> &items, std::vector<std::string> &disabled_items, U32 flags) { const LLInventoryObject *obj = getInventoryObject(); + + bool is_sidepanel = isInOutfitsSidePanel(); + if (is_sidepanel) + { + // Sidepanel includes restricted menu. + if (obj && obj->getIsLinkType() && !isWornLink(mUUID)) + { + items.push_back(std::string("Remove Link")); + } + return; + } + if (obj) { if (obj->getIsLinkType()) @@ -568,6 +615,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, } items.push_back(std::string("Paste Separator")); + + if (obj && obj->getIsLinkType() && !isWornLink(mUUID)) + { + items.push_back(std::string("Remove Link")); + } + items.push_back(std::string("Delete")); if (!isItemRemovable()) { @@ -716,20 +769,20 @@ BOOL LLInvFVBridge::isItemPermissive() const // static void LLInvFVBridge::changeItemParent(LLInventoryModel* model, LLViewerInventoryItem* item, - const LLUUID& new_parent, + const LLUUID& new_parent_id, BOOL restamp) { - if(item->getParentUUID() != new_parent) + if(item->getParentUUID() != new_parent_id) { LLInventoryModel::update_list_t update; LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); update.push_back(new_folder); gInventory.accountForUpdate(update); LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setParent(new_parent); + new_item->setParent(new_parent_id); new_item->updateParentOnServer(restamp); model->updateItem(new_item); model->notifyObservers(); @@ -739,24 +792,27 @@ void LLInvFVBridge::changeItemParent(LLInventoryModel* model, // static void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, LLViewerInventoryCategory* cat, - const LLUUID& new_parent, + const LLUUID& new_parent_id, BOOL restamp) { - if(cat->getParentUUID() != new_parent) + // Can't move a folder into a child of itself. + if (model->isObjectDescendentOf(new_parent_id, cat->getUUID())) { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->setParent(new_parent); - new_cat->updateParentOnServer(restamp); - model->updateCategory(new_cat); - model->notifyObservers(); + return; } + + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); + update.push_back(new_folder); + model->accountForUpdate(update); + + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->setParent(new_parent_id); + new_cat->updateParentOnServer(restamp); + model->updateCategory(new_cat); + model->notifyObservers(); } @@ -920,6 +976,16 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) } } +bool LLInvFVBridge::isInOutfitsSidePanel() const +{ + LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLPanelOutfitsInventory *outfit_panel = + dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); + if (!outfit_panel) + return false; + return outfit_panel->isAccordionPanel(my_panel); +} + // +=================================================+ // | InventoryFVBridgeBuilder | // +=================================================+ @@ -1415,13 +1481,14 @@ BOOL LLFolderBridge::isItemRemovable() { return FALSE; } + // Allow protected types to be removed, but issue a warning. - /* - if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) + // Restrict to god mode so users don't inadvertently mess up their inventory. + if(LLFolderType::lookupIsProtectedType(category->getPreferredType()) && + !gAgent.isGodlike()) { return FALSE; } - */ LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL); @@ -2256,11 +2323,6 @@ BOOL LLFolderBridge::removeItem() LLNotification::Params params("ConfirmDeleteProtectedCategory"); params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2)); - //params.functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2)); - /* - LLNotification::Params params("ChangeLindenEstate"); - params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); - */ if (LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { LLNotifications::instance().add(params); @@ -2291,14 +2353,16 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re LLInventoryModel::item_array_t descendent_items; gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - S32 i; - for (i = 0; i < descendent_items.count(); i++) + for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin(); + iter != descendent_items.end(); + ++iter) { - LLInventoryItem* item = descendent_items[i]; + const LLViewerInventoryItem* item = (*iter); + const LLUUID& item_id = item->getUUID(); if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) + && LLGestureManager::instance().isGestureActive(item_id)) { - LLGestureManager::instance().deactivateGesture(item->getUUID()); + LLGestureManager::instance().deactivateGesture(item_id); } } @@ -2319,14 +2383,16 @@ void LLFolderBridge::pasteFromClipboard() LLInventoryModel* model = getInventoryModel(); if(model && isClipboardPasteable()) { - LLInventoryItem* item = NULL; + const LLUUID parent_id(mUUID); + LLDynamicArray<LLUUID> objects; LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - const LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) + for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin(); + iter != objects.end(); + ++iter) { - item = model->getItem(objects.get(i)); + const LLUUID& item_id = (*iter); + LLInventoryItem *item = model->getItem(item_id); if (item) { if(LLInventoryClipboard::instance().isCutMode()) @@ -2355,13 +2421,15 @@ void LLFolderBridge::pasteLinkFromClipboard() const LLInventoryModel* model = getInventoryModel(); if(model) { + const LLUUID parent_id(mUUID); + LLDynamicArray<LLUUID> objects; LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) + for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin(); + iter != objects.end(); + ++iter) { - const LLUUID &object_id = objects.get(i); + const LLUUID &object_id = (*iter); #if SUPPORT_ENSEMBLES if (LLInventoryCategory *cat = model->getCategory(object_id)) { @@ -2395,19 +2463,6 @@ void LLFolderBridge::staticFolderOptionsMenu() sSelf->folderOptionsMenu(); } -bool isInOutfitsSidePanel(LLPanel *panel) -{ - LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(panel); - LLPanelOutfitsInventory *outfit_panel = - dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); - if (!outfit_panel) - return false; - return outfit_panel->isAccordionPanel(my_panel); - - //LLInventoryPanel *outfit_inv_panel = outfit_panel ? outfit_panel->getActivePanel(): NULL; - //return (my_panel && (my_panel == outfit_inv_panel)); -} - void LLFolderBridge::folderOptionsMenu() { std::vector<std::string> disabled_items; @@ -2421,13 +2476,12 @@ void LLFolderBridge::folderOptionsMenu() // BAP change once we're no longer treating regular categories as ensembles. const bool is_ensemble = category && (type == LLFolderType::FT_NONE || LLFolderType::lookupIsEnsembleType(type)); - const bool is_sidepanel = isInOutfitsSidePanel(mInventoryPanel.get()); // calling card related functionality for folders. + const bool is_sidepanel = isInOutfitsSidePanel(); if (is_sidepanel) { - mItems.clear(); mItems.push_back("Rename"); mItems.push_back("Delete"); } @@ -2468,6 +2522,8 @@ void LLFolderBridge::folderOptionsMenu() mItems.push_back(std::string("Wear As Ensemble")); } mItems.push_back(std::string("Remove From Outfit")); + + mItems.push_back(std::string("Outfit Separator")); } hide_context_entries(*mMenu, mItems, disabled_items); @@ -2495,14 +2551,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mDisabledItems.clear(); lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; + // std::vector<std::string> disabled_items; LLInventoryModel* model = getInventoryModel(); if(!model) return; const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); - mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) - mDisabledItems.clear(); //adding code to clear out disabled members from previous if (lost_and_found_id == mUUID) { // This is the lost+found folder. @@ -2531,7 +2586,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) LLViewerInventoryCategory *cat = getCategory(); // BAP removed protected check to re-enable standard ops in untyped folders. // Not sure what the right thing is to do here. - if (!isCOFFolder() && cat /*&& + if (!isCOFFolder() && cat && cat->getPreferredType()!=LLFolderType::FT_OUTFIT /*&& LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) { // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. @@ -3158,6 +3213,22 @@ void LLTextureBridge::openItem() } } +bool LLTextureBridge::canSaveTexture(void) +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) + { + return false; + } + + const LLViewerInventoryItem *item = model->getItem(mUUID); + if (item) + { + return item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); + } + return false; +} + void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; @@ -3182,6 +3253,10 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Texture Separator")); items.push_back(std::string("Save As")); + if (!canSaveTexture()) + { + disabled_items.push_back(std::string("Save As")); + } } hide_context_entries(menu, items, disabled_items); } @@ -3785,8 +3860,13 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); + bool is_sidepanel = isInOutfitsSidePanel(); + + if (!is_sidepanel) + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + } getClipboardEntries(true, items, disabled_items, flags); @@ -4110,13 +4190,18 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { - items.push_back(std::string("Properties")); + bool is_sidepanel = isInOutfitsSidePanel(); + + if (!is_sidepanel) + { + items.push_back(std::string("Properties")); + } - LLInventoryItem *item = getItem(); getClipboardEntries(true, items, disabled_items, flags); LLObjectBridge::sContextMenuItemID = mUUID; + LLInventoryItem *item = getItem(); if(item) { LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); @@ -4542,19 +4627,23 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { can_open = FALSE; } - if (can_open) + + bool is_sidepanel = isInOutfitsSidePanel(); + + if (can_open && !is_sidepanel) { items.push_back(std::string("Open")); } - items.push_back(std::string("Properties")); + if (!is_sidepanel) + { + items.push_back(std::string("Properties")); + } getClipboardEntries(true, items, disabled_items, flags); items.push_back(std::string("Wearable Separator")); - items.push_back(std::string("Wearable Wear")); - items.push_back(std::string("Wearable Add")); items.push_back(std::string("Wearable Edit")); if ((flags & FIRST_SELECTED_ITEM) == 0) @@ -4584,6 +4673,8 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) } else { + items.push_back(std::string("Wearable Wear")); + items.push_back(std::string("Wearable Add")); disabled_items.push_back(std::string("Take Off")); } break; @@ -4753,7 +4844,8 @@ void LLWearableBridge::onEditOnAvatar(void* user_data) void LLWearableBridge::editOnAvatar() { - const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); + LLUUID linked_id = gInventory.getLinkedItemID(mUUID); + const LLWearable* wearable = gAgentWearables.getWearableFromItemID(linked_id); if( wearable ) { // Set the tab to the right wearable. diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index ce5594be84874dfb05b6b2d6d1c0ab9d260002d4..5efe0c1ed4f6af9bd1beaa26c8b869efe24e4bd8 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -184,6 +184,9 @@ class LLInvFVBridge : public LLFolderViewEventListener // LLInvFVBridge functionality virtual void clearDisplayName() {} + // Allow context menus to be customized for side panel. + bool isInOutfitsSidePanel() const; + protected: LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid); @@ -379,6 +382,7 @@ class LLTextureBridge : public LLItemBridge protected: LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) : LLItemBridge(inventory, uuid), mInvType(type) {} + bool canSaveTexture(void); LLInventoryType::EType mInvType; }; diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 4c5e4d560732d2e179e2cc5a0af8731feae42638..522edd0cb5c627bada9e3d432f38e60e32942633 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -40,6 +40,7 @@ #include "llinventorymodel.h" // gInventory.backgroundFetchActive() #include "llviewercontrol.h" #include "llviewerinventory.h" +#include "llfolderview.h" // linden library includes #include "lltrans.h" @@ -63,7 +64,8 @@ LLInventoryFilter::FilterOps::FilterOps() : LLInventoryFilter::LLInventoryFilter(const std::string& name) : mName(name), mModified(FALSE), - mNeedTextRebuild(TRUE) + mNeedTextRebuild(TRUE), + mEmptyLookupMessage("InventoryNoMatchingItems") { mOrder = SO_FOLDERS_BY_NAME; // This gets overridden by a pref immediately @@ -95,26 +97,14 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item) return TRUE; } - const U16 HOURS_TO_SECONDS = 3600; - time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS; - if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest) - { - earliest = mFilterOps.mMinDate; - } - else if (!mFilterOps.mHoursAgo) - { - earliest = 0; - } - const LLFolderViewEventListener* listener = item->getListener(); mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; const BOOL passed_filtertype = checkAgainstFilterType(item); const BOOL passed = passed_filtertype && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) && - ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions) && - (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); - + ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions); + return passed; } @@ -127,27 +117,38 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const LLUUID object_id = listener->getUUID(); const LLInventoryObject *object = gInventory.getObject(object_id); - if (!object) return FALSE; - const U32 filterTypes = mFilterOps.mFilterTypes; + //////////////////////////////////////////////////////////////////////////////// + // FILTERTYPE_OBJECT // Pass if this item's type is of the correct filter type if (filterTypes & FILTERTYPE_OBJECT) { // If it has no type, pass it, unless it's a link. if (object_type == LLInventoryType::IT_NONE) { - if (object->getIsLinkType()) + if (object && object->getIsLinkType()) return FALSE; } - if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0)) + else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0)) + { return FALSE; + } } + // + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // FILTERTYPE_CATEGORY // Pass if this item is a category of the filter type, or // if its parent is a category of the filter type. if (filterTypes & FILTERTYPE_CATEGORY) { + // Can only filter categories for items in your inventory + // (e.g. versus in-world object contents). + if (!object) return FALSE; + LLUUID cat_id = object_id; if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY) { @@ -159,13 +160,45 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0)) return FALSE; } + // + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // FILTERTYPE_UUID // Pass if this item is the target UUID or if it links to the target UUID if (filterTypes & FILTERTYPE_UUID) { + if (!object) return FALSE; + if (object->getLinkedUUID() != mFilterOps.mFilterUUID) return FALSE; } + // + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // FILTERTYPE_DATE + // Pass if this item is within the date range. + if (filterTypes & FILTERTYPE_DATE) + { + const U16 HOURS_TO_SECONDS = 3600; + time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS; + if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest) + { + earliest = mFilterOps.mMinDate; + } + else if (!mFilterOps.mHoursAgo) + { + earliest = 0; + } + if (listener->getCreationDate() < earliest || + listener->getCreationDate() > mFilterOps.mMaxDate) + return FALSE; + } + // + //////////////////////////////////////////////////////////////////////////////// return TRUE; } @@ -297,7 +330,6 @@ void LLInventoryFilter::setFilterSubString(const std::string& string) mFilterSubString = string; LLStringUtil::toUpper(mFilterSubString); LLStringUtil::trimHead(mFilterSubString); - if (less_restrictive) { setModified(FILTER_LESS_RESTRICTIVE); @@ -359,6 +391,7 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date) mFilterOps.mMaxDate = llmax(mFilterOps.mMinDate, max_date); setModified(); } + mFilterOps.mFilterTypes |= FILTERTYPE_DATE; } void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl) @@ -373,12 +406,14 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl) setDateRange(0, time_max()); setModified(); } + mFilterOps.mFilterTypes |= FILTERTYPE_DATE; } BOOL LLInventoryFilter::isSinceLogoff() const { return (mFilterOps.mMinDate == (time_t)mLastLogoff) && - (mFilterOps.mMaxDate == time_max()); + (mFilterOps.mMaxDate == time_max()) && + (mFilterOps.mFilterTypes & FILTERTYPE_DATE); } void LLInventoryFilter::clearModified() @@ -410,7 +445,9 @@ void LLInventoryFilter::setHoursAgo(U32 hours) setModified(FILTER_RESTART); } } + mFilterOps.mFilterTypes |= FILTERTYPE_DATE; } + void LLInventoryFilter::setShowFolderState(EFolderShow state) { if (mFilterOps.mShowFolderState != state) @@ -475,21 +512,21 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior) // if not keeping current filter results, update last valid as well switch(mFilterBehavior) { - case FILTER_RESTART: - mMustPassGeneration = mFilterGeneration; - mMinRequiredGeneration = mFilterGeneration; - break; - case FILTER_LESS_RESTRICTIVE: - mMustPassGeneration = mFilterGeneration; - break; - case FILTER_MORE_RESTRICTIVE: - mMinRequiredGeneration = mFilterGeneration; - // must have passed either current filter generation (meaningless, as it hasn't been run yet) - // or some older generation, so keep the value - mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration); - break; - default: - llerrs << "Bad filter behavior specified" << llendl; + case FILTER_RESTART: + mMustPassGeneration = mFilterGeneration; + mMinRequiredGeneration = mFilterGeneration; + break; + case FILTER_LESS_RESTRICTIVE: + mMustPassGeneration = mFilterGeneration; + break; + case FILTER_MORE_RESTRICTIVE: + mMinRequiredGeneration = mFilterGeneration; + // must have passed either current filter generation (meaningless, as it hasn't been run yet) + // or some older generation, so keep the value + mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration); + break; + default: + llerrs << "Bad filter behavior specified" << llendl; } } else @@ -825,3 +862,14 @@ S32 LLInventoryFilter::getMustPassGeneration() const { return mMustPassGeneration; } + +void LLInventoryFilter::setEmptyLookupMessage(const std::string& message) +{ + mEmptyLookupMessage = message; +} + +const std::string& LLInventoryFilter::getEmptyLookupMessage() const +{ + return mEmptyLookupMessage; + +} diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index d65fb8f27c24258327d487bfcf4bb61da5987cf5..5ca77cb26adde25dcbf49f87dcadace6ed36cbec 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -61,7 +61,8 @@ class LLInventoryFilter FILTERTYPE_NONE = 0, FILTERTYPE_OBJECT = 1, // normal default search-by-object-type FILTERTYPE_CATEGORY = 2, // search by folder type - FILTERTYPE_UUID = 4 // find the object with UUID and any links to it + FILTERTYPE_UUID = 4, // find the object with UUID and any links to it + FILTERTYPE_DATE = 8 // search by date range }; // REFACTOR: Change this to an enum. @@ -72,13 +73,6 @@ class LLInventoryFilter LLInventoryFilter(const std::string& name); virtual ~LLInventoryFilter(); - // +-------------------------------------------------------------------+ - // + Execution And Results - // +-------------------------------------------------------------------+ - BOOL check(const LLFolderViewItem* item); - BOOL checkAgainstFilterType(const LLFolderViewItem* item); - std::string::size_type getStringMatchOffset() const; - // +-------------------------------------------------------------------+ // + Parameters // +-------------------------------------------------------------------+ @@ -103,12 +97,25 @@ class LLInventoryFilter void setHoursAgo(U32 hours); U32 getHoursAgo() const; + // +-------------------------------------------------------------------+ + // + Execution And Results + // +-------------------------------------------------------------------+ + BOOL check(const LLFolderViewItem* item); + BOOL checkAgainstFilterType(const LLFolderViewItem* item); + std::string::size_type getStringMatchOffset() const; + + // +-------------------------------------------------------------------+ + // + Presentation + // +-------------------------------------------------------------------+ void setShowFolderState( EFolderShow state); EFolderShow getShowFolderState() const; void setSortOrder(U32 order); U32 getSortOrder() const; + void setEmptyLookupMessage(const std::string& message); + const std::string& getEmptyLookupMessage() const; + // +-------------------------------------------------------------------+ // + Status // +-------------------------------------------------------------------+ @@ -187,6 +194,7 @@ class LLInventoryFilter BOOL mModified; BOOL mNeedTextRebuild; std::string mFilterText; + std::string mEmptyLookupMessage; }; #endif diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index fb9be1e04f470d035df64860f55ad1fee749d99e..0a8108899ae55d87b2d8e2656a06dbb2ae569010 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -59,7 +59,8 @@ BOOL LLInventoryModel::sBackgroundFetchActive = FALSE; BOOL LLInventoryModel::sAllFoldersFetched = FALSE; -BOOL LLInventoryModel::sFullFetchStarted = FALSE; +BOOL LLInventoryModel::sMyInventoryFetchStarted = FALSE; +BOOL LLInventoryModel::sLibraryFetchStarted = FALSE; S32 LLInventoryModel::sNumFetchRetries = 0; F32 LLInventoryModel::sMinTimeBetweenFetches = 0.3f; F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f; @@ -192,6 +193,8 @@ void LLInventoryModel::cleanupInventory() BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const { + if (obj_id == cat_id) return TRUE; + const LLInventoryObject* obj = getObject(obj_id); while(obj) { @@ -1340,11 +1343,11 @@ bool LLInventoryModel::isBulkFetchProcessingComplete() && sBulkFetchCount<=0) ? TRUE : FALSE ) ; } -class fetchDescendentsResponder: public LLHTTPClient::Responder +class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder { public: - fetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; - //fetchDescendentsResponder() {}; + LLInventoryModelFetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; + //LLInventoryModelFetchDescendentsResponder() {}; void result(const LLSD& content); void error(U32 status, const std::string& reason); public: @@ -1354,7 +1357,7 @@ class fetchDescendentsResponder: public LLHTTPClient::Responder }; //If we get back a normal response, handle it here -void fetchDescendentsResponder::result(const LLSD& content) +void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content) { if (content.has("folders")) { @@ -1421,7 +1424,8 @@ void fetchDescendentsResponder::result(const LLSD& content) LLSD category = *category_it; tcategory->fromLLSD(category); - if (LLInventoryModel::sFullFetchStarted) + if (LLInventoryModel::sMyInventoryFetchStarted || + LLInventoryModel::sLibraryFetchStarted) { sFetchQueue.push_back(tcategory->getUUID()); } @@ -1473,20 +1477,16 @@ void fetchDescendentsResponder::result(const LLSD& content) if (LLInventoryModel::isBulkFetchProcessingComplete()) { llinfos << "Inventory fetch completed" << llendl; - if (LLInventoryModel::sFullFetchStarted) - { - LLInventoryModel::sAllFoldersFetched = TRUE; - } - LLInventoryModel::stopBackgroundFetch(); + LLInventoryModel::setAllFoldersFetched(); } gInventory.notifyObservers("fetchDescendents"); } //If we get back an error (not found, etc...), handle it here -void fetchDescendentsResponder::error(U32 status, const std::string& reason) +void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason) { - llinfos << "fetchDescendentsResponder::error " + llinfos << "LLInventoryModelFetchDescendentsResponder::error " << status << ": " << reason << llendl; LLInventoryModel::incrBulkFetch(-1); @@ -1506,11 +1506,7 @@ void fetchDescendentsResponder::error(U32 status, const std::string& reason) { if (LLInventoryModel::isBulkFetchProcessingComplete()) { - if (LLInventoryModel::sFullFetchStarted) - { - LLInventoryModel::sAllFoldersFetched = TRUE; - } - LLInventoryModel::stopBackgroundFetch(); + LLInventoryModel::setAllFoldersFetched(); } } gInventory.notifyObservers("fetchDescendents"); @@ -1578,7 +1574,8 @@ void LLInventoryModel::bulkFetch(std::string url) body["folders"].append(folder_sd); folder_count++; } - if (sFullFetchStarted) + if (sMyInventoryFetchStarted || + sLibraryFetchStarted) { //Already have this folder but append child folders to list. // add all children to queue parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID()); @@ -1603,22 +1600,18 @@ void LLInventoryModel::bulkFetch(std::string url) sBulkFetchCount++; if (body["folders"].size()) { - LLHTTPClient::post(url, body, new fetchDescendentsResponder(body),300.0); + LLHTTPClient::post(url, body, new LLInventoryModelFetchDescendentsResponder(body),300.0); } if (body_lib["folders"].size()) { std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents"); - LLHTTPClient::post(url_lib, body_lib, new fetchDescendentsResponder(body_lib),300.0); + LLHTTPClient::post(url_lib, body_lib, new LLInventoryModelFetchDescendentsResponder(body_lib),300.0); } sFetchTimer.reset(); } else if (isBulkFetchProcessingComplete()) { - if (sFullFetchStarted) - { - sAllFoldersFetched = TRUE; - } - stopBackgroundFetch(); + setAllFoldersFetched(); } } @@ -1634,7 +1627,6 @@ BOOL LLInventoryModel::backgroundFetchActive() return sBackgroundFetchActive; } -//static void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id) { if (!sAllFoldersFetched) @@ -1642,9 +1634,16 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id) sBackgroundFetchActive = TRUE; if (cat_id.isNull()) { - if (!sFullFetchStarted) + if (!sMyInventoryFetchStarted) + { + sMyInventoryFetchStarted = TRUE; + sFetchQueue.push_back(gInventory.getLibraryRootFolderID()); + sFetchQueue.push_back(gInventory.getRootFolderID()); + gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); + } + if (!sLibraryFetchStarted) { - sFullFetchStarted = TRUE; + sLibraryFetchStarted = TRUE; sFetchQueue.push_back(gInventory.getLibraryRootFolderID()); sFetchQueue.push_back(gInventory.getRootFolderID()); gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); @@ -1658,6 +1657,14 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id) sFetchQueue.push_front(cat_id); gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL); } + if (cat_id == gInventory.getLibraryRootFolderID()) + { + sLibraryFetchStarted = TRUE; + } + if (cat_id == gInventory.getRootFolderID()) + { + sMyInventoryFetchStarted = TRUE; + } } } } @@ -1679,10 +1686,20 @@ void LLInventoryModel::stopBackgroundFetch() gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL); sBulkFetchCount=0; sMinTimeBetweenFetches=0.0f; -// sFullFetchStarted=FALSE; } } +// static +void LLInventoryModel::setAllFoldersFetched() +{ + if (sMyInventoryFetchStarted && + sLibraryFetchStarted) + { + sAllFoldersFetched = TRUE; + } + stopBackgroundFetch(); +} + //static void LLInventoryModel::backgroundFetch(void*) { @@ -1701,11 +1718,8 @@ void LLInventoryModel::backgroundFetch(void*) if (sFetchQueue.empty()) { llinfos << "Inventory fetch completed" << llendl; - if (sFullFetchStarted) - { - sAllFoldersFetched = TRUE; - } - stopBackgroundFetch(); + + setAllFoldersFetched(); return; } diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index b744d821c75cf068b4babe5b1719eb8b495b7233..27bbca493daf2d8e749e0a5e5cdf2bbdce28eac5 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -72,6 +72,8 @@ class LLInventoryCollectFunctor; class LLInventoryModel { public: + friend class LLInventoryModelFetchDescendentsResponder; + enum EHasChildren { CHILDREN_NO, @@ -282,9 +284,6 @@ class LLInventoryModel // Make sure we have the descendents in the structure. Returns true // if a fetch was performed. bool fetchDescendentsOf(const LLUUID& folder_id); - - // Add categories to a list to be fetched in bulk. - static void bulkFetch(std::string url); // call this method to request the inventory. //void requestFromServer(const LLUUID& agent_id); @@ -369,15 +368,7 @@ class LLInventoryModel // Utility Functions void removeItem(const LLUUID& item_id); - // start and stop background breadth-first fetching of inventory contents - // this gets triggered when performing a filter-search - static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); // start fetch process static void findLostItems(); - static BOOL backgroundFetchActive(); - static bool isEverythingFetched(); - static void backgroundFetch(void*); // background fetch idle function - static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; } - // Data about the agent's root folder and root library folder // are stored here, rather than in LLAgent where it used to be, because @@ -477,14 +468,11 @@ class LLInventoryModel LLUUID mLibraryRootFolderID; LLUUID mLibraryOwnerID; - // completing the fetch once per session should be sufficient - static BOOL sBackgroundFetchActive; static BOOL sTimelyFetchPending; static S32 sNumFetchRetries; static LLFrameTimer sFetchTimer; static F32 sMinTimeBetweenFetches; static F32 sMaxTimeBetweenFetches; - static S16 sBulkFetchCount; // Expected inventory cache version const static S32 sCurrentInvCacheVersion; @@ -510,11 +498,33 @@ class LLInventoryModel public: // *NOTE: DEBUG functionality void dumpInventory() const; - static bool isBulkFetchProcessingComplete(); + + //////////////////////////////////////////////////////////////////////////////// + // Bulk / Background Fetch + +public: + // Start and stop background breadth-first fetching of inventory contents. + // This gets triggered when performing a filter-search + void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); + static BOOL backgroundFetchActive(); + static bool isEverythingFetched(); + static void backgroundFetch(void*); // background fetch idle function + static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; } static void stopBackgroundFetch(); // stop fetch process + static bool isBulkFetchProcessingComplete(); + + // Add categories to a list to be fetched in bulk. + static void bulkFetch(std::string url); - static BOOL sFullFetchStarted; +private: + static BOOL sMyInventoryFetchStarted; + static BOOL sLibraryFetchStarted; static BOOL sAllFoldersFetched; + static void setAllFoldersFetched(); + + // completing the fetch once per session should be sufficient + static BOOL sBackgroundFetchActive; + static S16 sBulkFetchCount; }; // a special inventory model for the agent diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 4cbf27b7257b183286a09369815eaba8b42f5579..92b9dc427f5cc02c406ee73dde0f85147b64822b 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -903,13 +903,10 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open) if (!auto_open) return NULL; // D. Open the inventory side panel and use that. - LLSideTray *side_tray = LLSideTray::getInstance(); + LLSD key; LLSidepanelInventory *sidepanel_inventory = - dynamic_cast<LLSidepanelInventory *>(side_tray->getPanel("sidepanel_inventory")); - - // Use the inventory side panel only if it is already active. - // Activating it may unexpectedly switch off the currently active tab in some cases. - if (sidepanel_inventory && (LLPanel*)side_tray->getActiveTab() == (LLPanel*)sidepanel_inventory) + dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key)); + if (sidepanel_inventory) { return sidepanel_inventory->getActivePanel(); } diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index cbbd433c1dbf4cc4623f9a112bb49182bf0eb865..4f7f0a79f64a919d7ce60088cc24fdc68c5cb7b4 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -192,6 +192,7 @@ class LLInventoryPanel : public LLPanel public: BOOL getIsViewsInitialized() const { return mViewsInitialized; } const LLUUID& getStartFolderID() const { return mStartFolderID; } + const std::string& getStartFolderString() { return mStartFolderString; } protected: // Builds the UI. Call this once the inventory is usable. void initializeViews(); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 758d8ff90365dc59fd44d143ce7e59f858a349ea..98ca339f0c2a6c16b99fca8ceb7c929ea8015778 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -810,13 +810,8 @@ void LLLocationInputCtrl::updateWidgetlayout() { const LLRect& rect = getLocalRect(); const LLRect& hist_btn_rect = mButton->getRect(); - LLRect info_btn_rect = mInfoBtn->getRect(); - // info button - info_btn_rect.setOriginAndSize( - 2, (rect.getHeight() - info_btn_rect.getHeight()) / 2, - info_btn_rect.getWidth(), info_btn_rect.getHeight()); - mInfoBtn->setRect(info_btn_rect); + // Info button is set in the XUI XML location_input.xml // "Add Landmark" button LLRect al_btn_rect = mAddLandmarkBtn->getRect(); diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 2a1f42c3c4bf2828ebe43a0514c68ba2b7478cfe..1be3430e07ce653795aeeee44f8e619827e1bdf6 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -40,9 +40,12 @@ #include "llurlsimstring.h" #include "llviewercontrol.h" // gSavedSettings #include "llviewernetwork.h" // EGridInfo +#include "llviewerwindow.h" // getWindow() // library includes #include "llmd5.h" +#include "llweb.h" +#include "llwindow.h" // Must have instance to auto-register with LLCommandDispatcher @@ -174,6 +177,32 @@ bool LLLoginHandler::handle(const LLSD& tokens, return true; } + if (tokens.size() == 1 + && tokens[0].asString() == "reg") + { + LLWindow* window = gViewerWindow->getWindow(); + window->incBusyCount(); + window->setCursor(UI_CURSOR_ARROW); + + // Do this first, as it may be slow and we want to keep something + // on the user's screen as long as possible + LLWeb::loadURLExternal( "http://join.eniac15.lindenlab.com/" ); + + window->decBusyCount(); + window->setCursor(UI_CURSOR_ARROW); + + // Then hide the window + window->minimize(); + return true; + } + + // Make sure window is visible + LLWindow* window = gViewerWindow->getWindow(); + if (window->getMinimized()) + { + window->restore(); + } + parse(query_map); //if we haven't initialized stuff yet, this is diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 3c337961e1af2bdec6a2737a99416187875d1714..2694075a58c8b08a3a928f51c297045e8a326765 100755 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -58,251 +58,342 @@ // - Any request that gets a 503 still goes through the retry logic // +// +// Forward decls +// const F32 LLMediaDataClient::QUEUE_TIMER_DELAY = 1.0; // seconds(s) const F32 LLMediaDataClient::UNAVAILABLE_RETRY_TIMER_DELAY = 5.0; // secs const U32 LLMediaDataClient::MAX_RETRIES = 4; +const U32 LLMediaDataClient::MAX_SORTED_QUEUE_SIZE = 10000; +const U32 LLMediaDataClient::MAX_ROUND_ROBIN_QUEUE_SIZE = 10000; + +// << operators +std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue_t &q); +std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &q); ////////////////////////////////////////////////////////////////////////////////////// // -// LLMediaDataClient::Request +// LLMediaDataClient // ////////////////////////////////////////////////////////////////////////////////////// -/*static*/U32 LLMediaDataClient::Request::sNum = 0; -LLMediaDataClient::Request::Request(const std::string &cap_name, - const LLSD& sd_payload, - LLMediaDataClientObject *obj, - LLMediaDataClient *mdc) - : mCapName(cap_name), - mPayload(sd_payload), - mObject(obj), - mNum(++sNum), - mRetryCount(0), - mMDC(mdc) +LLMediaDataClient::LLMediaDataClient(F32 queue_timer_delay, + F32 retry_timer_delay, + U32 max_retries, + U32 max_sorted_queue_size, + U32 max_round_robin_queue_size) + : mQueueTimerDelay(queue_timer_delay), + mRetryTimerDelay(retry_timer_delay), + mMaxNumRetries(max_retries), + mMaxSortedQueueSize(max_sorted_queue_size), + mMaxRoundRobinQueueSize(max_round_robin_queue_size), + mQueueTimerIsRunning(false), + mCurrentQueueIsTheSortedQueue(true) { } -LLMediaDataClient::Request::~Request() +LLMediaDataClient::~LLMediaDataClient() { - LL_DEBUGS("LLMediaDataClient") << "~Request" << (*this) << LL_ENDL; - mMDC = NULL; - mObject = NULL; -} + stopQueueTimer(); - -std::string LLMediaDataClient::Request::getCapability() const -{ - return getObject()->getCapabilityUrl(getCapName()); + // This should clear the queue, and hopefully call all the destructors. + LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClient destructor: queue: " << + (isEmpty() ? "<empty> " : "<not empty> ") << LL_ENDL; + + mSortedQueue.clear(); + mRoundRobinQueue.clear(); } -// Helper function to get the "type" of request, which just pokes around to -// discover it. -LLMediaDataClient::Request::Type LLMediaDataClient::Request::getType() const +bool LLMediaDataClient::isEmpty() const { - if (mCapName == "ObjectMediaNavigate") - { - return NAVIGATE; - } - else if (mCapName == "ObjectMedia") - { - const std::string &verb = mPayload["verb"]; - if (verb == "GET") - { - return GET; - } - else if (verb == "UPDATE") - { - return UPDATE; - } - } - llassert(false); - return GET; + return mSortedQueue.empty() && mRoundRobinQueue.empty(); } -const char *LLMediaDataClient::Request::getTypeAsString() const +bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) { - Type t = getType(); - switch (t) - { - case GET: - return "GET"; - break; - case UPDATE: - return "UPDATE"; - break; - case NAVIGATE: - return "NAVIGATE"; - break; - } - return ""; + return (LLMediaDataClient::findOrRemove(mSortedQueue, object, false/*remove*/, LLMediaDataClient::Request::ANY).notNull() + || (LLMediaDataClient::findOrRemove(mRoundRobinQueue, object, false/*remove*/, LLMediaDataClient::Request::ANY).notNull())); } - -void LLMediaDataClient::Request::reEnqueue() const +bool LLMediaDataClient::removeFromQueue(const LLMediaDataClientObject::ptr_t &object) { - // I sure hope this doesn't deref a bad pointer: - mMDC->enqueue(this); + bool removedFromSortedQueue = LLMediaDataClient::findOrRemove(mSortedQueue, object, true/*remove*/, LLMediaDataClient::Request::ANY).notNull(); + bool removedFromRoundRobinQueue = LLMediaDataClient::findOrRemove(mRoundRobinQueue, object, true/*remove*/, LLMediaDataClient::Request::ANY).notNull(); + return removedFromSortedQueue || removedFromRoundRobinQueue; } -F32 LLMediaDataClient::Request::getRetryTimerDelay() const +//static +LLMediaDataClient::request_ptr_t LLMediaDataClient::findOrRemove(request_queue_t &queue, const LLMediaDataClientObject::ptr_t &obj, bool remove, LLMediaDataClient::Request::Type type) { - return (mMDC == NULL) ? LLMediaDataClient::UNAVAILABLE_RETRY_TIMER_DELAY : - mMDC->mRetryTimerDelay; + request_ptr_t result; + request_queue_t::iterator iter = queue.begin(); + request_queue_t::iterator end = queue.end(); + while (iter != end) + { + if (obj->getID() == (*iter)->getObject()->getID() && (type == LLMediaDataClient::Request::ANY || type == (*iter)->getType())) + { + result = *iter; + if (remove) queue.erase(iter); + break; + } + iter++; + } + return result; } -U32 LLMediaDataClient::Request::getMaxNumRetries() const +void LLMediaDataClient::request(const LLMediaDataClientObject::ptr_t &object, const LLSD &payload) { - return (mMDC == NULL) ? LLMediaDataClient::MAX_RETRIES : mMDC->mMaxNumRetries; + if (object.isNull() || ! object->hasMedia()) return; + + // Push the object on the queue + enqueue(new Request(getCapabilityName(), payload, object, this)); } -std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &r) +void LLMediaDataClient::enqueue(const Request *request) { - s << "<request>" - << "<num>" << r.getNum() << "</num>" - << "<type>" << r.getTypeAsString() << "</type>" - << "<object_id>" << r.getObject()->getID() << "</object_id>" - << "<num_retries>" << r.getRetryCount() << "</num_retries>" - << "</request> "; - return s; + if (request->isNew()) + { + // Add to sorted queue + if (LLMediaDataClient::findOrRemove(mSortedQueue, request->getObject(), true/*remove*/, request->getType()).notNull()) + { + LL_DEBUGS("LLMediaDataClient") << "REMOVING OLD request for " << *request << " ALREADY THERE!" << LL_ENDL; + } + + LL_DEBUGS("LLMediaDataClient") << "Queuing SORTED request for " << *request << LL_ENDL; + + // Sadly, we have to const-cast because items put into the queue are not const + mSortedQueue.push_back(const_cast<LLMediaDataClient::Request*>(request)); + + LL_DEBUGS("LLMediaDataClient") << "SORTED queue:" << mSortedQueue << LL_ENDL; + } + else { + if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize) + { + LL_INFOS_ONCE("LLMediaDataClient") << "RR QUEUE MAXED OUT!!!" << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "Not queuing " << *request << LL_ENDL; + return; + } + + // ROUND ROBIN: if it is there, and it is a GET request, leave it. If not, put at front! + request_ptr_t existing_request; + if (request->getType() == Request::GET) + { + existing_request = LLMediaDataClient::findOrRemove(mRoundRobinQueue, request->getObject(), false/*remove*/, request->getType()); + } + if (existing_request.isNull()) + { + LL_DEBUGS("LLMediaDataClient") << "Queuing RR request for " << *request << LL_ENDL; + // Push the request on the pending queue + // Sadly, we have to const-cast because items put into the queue are not const + mRoundRobinQueue.push_front(const_cast<LLMediaDataClient::Request*>(request)); + + LL_DEBUGS("LLMediaDataClient") << "RR queue:" << mRoundRobinQueue << LL_ENDL; + } + else + { + LL_DEBUGS("LLMediaDataClient") << "ALREADY THERE: NOT Queuing request for " << *request << LL_ENDL; + + existing_request->markSent(false); + } + } + // Start the timer if not already running + startQueueTimer(); } - -////////////////////////////////////////////////////////////////////////////////////// -// -// LLMediaDataClient::Responder::RetryTimer -// -////////////////////////////////////////////////////////////////////////////////////// - -LLMediaDataClient::Responder::RetryTimer::RetryTimer(F32 time, Responder *mdr) - : LLEventTimer(time), mResponder(mdr) +void LLMediaDataClient::startQueueTimer() { + if (! mQueueTimerIsRunning) + { + LL_DEBUGS("LLMediaDataClient") << "starting queue timer (delay=" << mQueueTimerDelay << " seconds)" << LL_ENDL; + // LLEventTimer automagically takes care of the lifetime of this object + new QueueTimer(mQueueTimerDelay, this); + } + else { + LL_DEBUGS("LLMediaDataClient") << "not starting queue timer (it's already running, right???)" << LL_ENDL; + } } -// virtual -LLMediaDataClient::Responder::RetryTimer::~RetryTimer() +void LLMediaDataClient::stopQueueTimer() { - LL_DEBUGS("LLMediaDataClient") << "~RetryTimer" << *(mResponder->getRequest()) << LL_ENDL; - - // XXX This is weird: Instead of doing the work in tick() (which re-schedules - // a timer, which might be risky), do it here, in the destructor. Yes, it is very odd. - // Instead of retrying, we just put the request back onto the queue - LL_INFOS("LLMediaDataClient") << "RetryTimer fired for: " << *(mResponder->getRequest()) << "retrying" << LL_ENDL; - mResponder->getRequest()->reEnqueue(); - - // Release the ref to the responder. - mResponder = NULL; + mQueueTimerIsRunning = false; } -// virtual -BOOL LLMediaDataClient::Responder::RetryTimer::tick() +bool LLMediaDataClient::processQueueTimer() { - // Don't fire again - return TRUE; + sortQueue(); + + if(!isEmpty()) + { + LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is: " << mSortedQueue.size() + << ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue is: " << mSortedQueue << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, RR queue is: " << mRoundRobinQueue << LL_ENDL; + } + + serviceQueue(); + + LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue size is: " << mSortedQueue.size() + << ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue is: " << mSortedQueue << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, RR queue is: " << mRoundRobinQueue << LL_ENDL; + + return isEmpty(); } - -////////////////////////////////////////////////////////////////////////////////////// -// -// LLMediaDataClient::Responder -// -////////////////////////////////////////////////////////////////////////////////////// - -LLMediaDataClient::Responder::Responder(const request_ptr_t &request) - : mRequest(request) +void LLMediaDataClient::sortQueue() { + if(!mSortedQueue.empty()) + { + // Score all items first + request_queue_t::iterator iter = mSortedQueue.begin(); + request_queue_t::iterator end = mSortedQueue.end(); + while (iter != end) + { + (*iter)->updateScore(); + iter++; + } + + // Re-sort the list... + // NOTE: should this be a stable_sort? If so we need to change to using a vector. + mSortedQueue.sort(LLMediaDataClient::compareRequests); + + // ...then cull items over the max + U32 size = mSortedQueue.size(); + if (size > mMaxSortedQueueSize) + { + U32 num_to_cull = (size - mMaxSortedQueueSize); + LL_INFOS("LLMediaDataClient") << "sorted queue MAXED OUT! Culling " + << num_to_cull << " items" << LL_ENDL; + while (num_to_cull-- > 0) + { + mSortedQueue.pop_back(); + } + } + } } -LLMediaDataClient::Responder::~Responder() +// static +bool LLMediaDataClient::compareRequests(const request_ptr_t &o1, const request_ptr_t &o2) { - LL_DEBUGS("LLMediaDataClient") << "~Responder" << *(getRequest()) << LL_ENDL; - mRequest = NULL; + if (o2.isNull()) return true; + if (o1.isNull()) return false; + return ( o1->getScore() > o2->getScore() ); } -/*virtual*/ -void LLMediaDataClient::Responder::error(U32 status, const std::string& reason) -{ - if (status == HTTP_SERVICE_UNAVAILABLE) +void LLMediaDataClient::serviceQueue() +{ + request_queue_t *queue_p = getCurrentQueue(); + + // quick retry loop for cases where we shouldn't wait for the next timer tick + while(true) { - F32 retry_timeout = mRequest->getRetryTimerDelay(); - - mRequest->incRetryCount(); + if (queue_p->empty()) + { + LL_DEBUGS("LLMediaDataClient") << "queue empty: " << (*queue_p) << LL_ENDL; + break; + } - if (mRequest->getRetryCount() < mRequest->getMaxNumRetries()) + // Peel one off of the items from the queue, and execute request + request_ptr_t request = queue_p->front(); + llassert(!request.isNull()); + const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject(); + llassert(NULL != object); + + // Check for conditions that would make us just pop and rapidly loop through + // the queue. + if(request.isNull() || + request->isMarkedSent() || + NULL == object || + object->isDead() || + !object->hasMedia()) { - LL_INFOS("LLMediaDataClient") << *mRequest << "got SERVICE_UNAVAILABLE...retrying in " << retry_timeout << " seconds" << LL_ENDL; + if (request.isNull()) + { + LL_INFOS("LLMediaDataClient") << "Skipping NULL request" << LL_ENDL; + } + else { + LL_INFOS("LLMediaDataClient") << "Skipping : " << *request << " " + << ((request->isMarkedSent()) ? " request is marked sent" : + ((NULL == object) ? " object is NULL " : + ((object->isDead()) ? "object is dead" : + ((!object->hasMedia()) ? "object has no media!" : "BADNESS!")))) << LL_ENDL; + } + queue_p->pop_front(); + continue; // jump back to the start of the quick retry loop + } + + // Next, ask if this is "interesting enough" to fetch. If not, just stop + // and wait for the next timer go-round. Only do this for the sorted + // queue. + if (mCurrentQueueIsTheSortedQueue && !object->isInterestingEnough()) + { + LL_DEBUGS("LLMediaDataClient") << "Not fetching " << *request << ": not interesting enough" << LL_ENDL; + break; + } + + // Finally, try to send the HTTP message to the cap url + std::string url = request->getCapability(); + bool maybe_retry = false; + if (!url.empty()) + { + const LLSD &sd_payload = request->getPayload(); + LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL; + + // Call the subclass for creating the responder + LLHTTPClient::post(url, sd_payload, createResponder(request)); + } + else { + LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL; + maybe_retry = true; + } - // Start timer (instances are automagically tracked by - // InstanceTracker<> and LLEventTimer) - new RetryTimer(F32(retry_timeout/*secs*/), this); + bool exceeded_retries = request->getRetryCount() > mMaxNumRetries; + if (maybe_retry && ! exceeded_retries) // Try N times before giving up + { + // We got an empty cap, but in that case we will retry again next + // timer fire. + request->incRetryCount(); } else { - LL_INFOS("LLMediaDataClient") << *mRequest << "got SERVICE_UNAVAILABLE...retry count " << - mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL; + if (exceeded_retries) + { + LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " + << mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; + // XXX Should we bring up a warning dialog?? + } + + queue_p->pop_front(); + + if (! mCurrentQueueIsTheSortedQueue) { + // Round robin + request->markSent(true); + mRoundRobinQueue.push_back(request); + } } + + // end of quick loop -- any cases where we want to loop will use 'continue' to jump back to the start. + break; } - else { - std::string msg = boost::lexical_cast<std::string>(status) + ": " + reason; - LL_WARNS("LLMediaDataClient") << *mRequest << " http error(" << msg << ")" << LL_ENDL; - } + + swapCurrentQueue(); } - -/*virtual*/ -void LLMediaDataClient::Responder::result(const LLSD& content) +void LLMediaDataClient::swapCurrentQueue() { - LL_INFOS("LLMediaDataClient") << *mRequest << "result : " << ll_print_sd(content) << LL_ENDL; + // Swap + mCurrentQueueIsTheSortedQueue = !mCurrentQueueIsTheSortedQueue; + // If its empty, swap back + if (getCurrentQueue()->empty()) + { + mCurrentQueueIsTheSortedQueue = !mCurrentQueueIsTheSortedQueue; + } } - -////////////////////////////////////////////////////////////////////////////////////// -// -// LLMediaDataClient::Comparator -// -////////////////////////////////////////////////////////////////////////////////////// - -// static -bool LLMediaDataClient::compareRequests(const request_ptr_t &o1, const request_ptr_t &o2) +LLMediaDataClient::request_queue_t *LLMediaDataClient::getCurrentQueue() { - if (o2.isNull()) return true; - if (o1.isNull()) return false; - - // The score is intended to be a measure of how close an object is or - // how much screen real estate (interest) it takes up - // Further away = lower score. - // Lesser interest = lower score - // For instance, here are some cases: - // 1: Two items with no impl, closest one wins - // 2: Two items with an impl: interest should rule, but distance is - // still taken into account (i.e. something really close might take - // precedence over a large item far away) - // 3: One item with an impl, another without: item with impl wins - // (XXX is that what we want?) - // Calculate the scores for each. - F64 o1_score = getObjectScore(o1->getObject()); - F64 o2_score = getObjectScore(o2->getObject()); - return ( o1_score > o2_score ); + return (mCurrentQueueIsTheSortedQueue) ? &mSortedQueue : &mRoundRobinQueue; } -// static -F64 LLMediaDataClient::getObjectScore(const LLMediaDataClientObject::ptr_t &obj) -{ - // *TODO: make this less expensive? - F64 dist = obj->getDistanceFromAvatar() + 0.1; // avoids div by 0 - // square the distance so that they are in the same "unit magnitude" as - // the interest (which is an area) - dist *= dist; - F64 interest = obj->getTotalMediaInterest() + 1.0; - - return interest/dist; -} - -////////////////////////////////////////////////////////////////////////////////////// -// -// LLMediaDataClient::PriorityQueue -// Queue of LLMediaDataClientObject smart pointers to request media for. -// -////////////////////////////////////////////////////////////////////////////////////// - // dump the queue std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue_t &q) { @@ -318,22 +409,6 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue return s; } -// find the given object in the queue. -bool LLMediaDataClient::find(const LLMediaDataClientObject::ptr_t &obj) const -{ - request_queue_t::const_iterator iter = pRequestQueue->begin(); - request_queue_t::const_iterator end = pRequestQueue->end(); - while (iter != end) - { - if (obj->getID() == (*iter)->getObject()->getID()) - { - return true; - } - iter++; - } - return false; -} - ////////////////////////////////////////////////////////////////////////////////////// // // LLMediaDataClient::QueueTimer @@ -342,7 +417,7 @@ bool LLMediaDataClient::find(const LLMediaDataClientObject::ptr_t &obj) const ////////////////////////////////////////////////////////////////////////////////////// LLMediaDataClient::QueueTimer::QueueTimer(F32 time, LLMediaDataClient *mdc) - : LLEventTimer(time), mMDC(mdc) +: LLEventTimer(time), mMDC(mdc) { mMDC->setIsRunning(true); } @@ -357,177 +432,224 @@ LLMediaDataClient::QueueTimer::~QueueTimer() // virtual BOOL LLMediaDataClient::QueueTimer::tick() { - if (NULL == mMDC->pRequestQueue) - { - // Shutting down? stop. - LL_DEBUGS("LLMediaDataClient") << "queue gone" << LL_ENDL; - return TRUE; - } - - request_queue_t &queue = *(mMDC->pRequestQueue); + if (mMDC.isNull()) return TRUE; + return mMDC->processQueueTimer(); +} - if(!queue.empty()) - { - LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is: " << queue << LL_ENDL; - // Re-sort the list every time... - // XXX Is this really what we want? - queue.sort(LLMediaDataClient::compareRequests); - } +////////////////////////////////////////////////////////////////////////////////////// +// +// LLMediaDataClient::Responder::RetryTimer +// +////////////////////////////////////////////////////////////////////////////////////// + +LLMediaDataClient::Responder::RetryTimer::RetryTimer(F32 time, Responder *mdr) +: LLEventTimer(time), mResponder(mdr) +{ +} + +// virtual +LLMediaDataClient::Responder::RetryTimer::~RetryTimer() +{ + LL_DEBUGS("LLMediaDataClient") << "~RetryTimer" << *(mResponder->getRequest()) << LL_ENDL; - // quick retry loop for cases where we shouldn't wait for the next timer tick - while(true) - { - if (queue.empty()) - { - LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL; - return TRUE; - } + // XXX This is weird: Instead of doing the work in tick() (which re-schedules + // a timer, which might be risky), do it here, in the destructor. Yes, it is very odd. + // Instead of retrying, we just put the request back onto the queue + LL_INFOS("LLMediaDataClient") << "RetryTimer fired for: " << *(mResponder->getRequest()) << " retrying" << LL_ENDL; + mResponder->getRequest()->reEnqueue(); - // Peel one off of the items from the queue, and execute request - request_ptr_t request = queue.front(); - llassert(!request.isNull()); - const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject(); - bool performed_request = false; - bool error = false; - llassert(NULL != object); + // Release the ref to the responder. + mResponder = NULL; +} - if(object->isDead()) - { - // This object has been marked dead. Pop it and move on to the next item in the queue immediately. - LL_INFOS("LLMediaDataClient") << "Skipping " << *request << ": object is dead!" << LL_ENDL; - queue.pop_front(); - continue; // jump back to the start of the quick retry loop - } +// virtual +BOOL LLMediaDataClient::Responder::RetryTimer::tick() +{ + // Don't fire again + return TRUE; +} - if (NULL != object && object->hasMedia()) - { - std::string url = request->getCapability(); - if (!url.empty()) - { - const LLSD &sd_payload = request->getPayload(); - LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL; - // Call the subclass for creating the responder - LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request)); - performed_request = true; - } - else { - LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL; - } - } - else { - if (request.isNull()) - { - LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL; - } - else if (NULL == object) - { - LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL; - } - else if (!object->hasMedia()) - { - LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL; - } - error = true; - } - bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries; - if (performed_request || exceeded_retries || error) // Try N times before giving up - { - if (exceeded_retries) - { - LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " - << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; - // XXX Should we bring up a warning dialog?? - } - queue.pop_front(); - } - else { - request->incRetryCount(); - } - - // end of quick retry loop -- any cases where we want to loop will use 'continue' to jump back to the start. - break; - } +////////////////////////////////////////////////////////////////////////////////////// +// +// LLMediaDataClient::Request +// +////////////////////////////////////////////////////////////////////////////////////// +/*static*/U32 LLMediaDataClient::Request::sNum = 0; - LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, queue is now: " << (*(mMDC->pRequestQueue)) << LL_ENDL; +LLMediaDataClient::Request::Request(const char *cap_name, + const LLSD& sd_payload, + LLMediaDataClientObject *obj, + LLMediaDataClient *mdc) +: mCapName(cap_name), + mPayload(sd_payload), + mObject(obj), + mNum(++sNum), + mRetryCount(0), + mMDC(mdc), + mMarkedSent(false), + mScore((F64)0.0) +{ +} - return queue.empty(); +LLMediaDataClient::Request::~Request() +{ + LL_DEBUGS("LLMediaDataClient") << "~Request" << (*this) << LL_ENDL; + mMDC = NULL; + mObject = NULL; } - -void LLMediaDataClient::startQueueTimer() + + +std::string LLMediaDataClient::Request::getCapability() const { - if (! mQueueTimerIsRunning) + return getObject()->getCapabilityUrl(getCapName()); +} + +// Helper function to get the "type" of request, which just pokes around to +// discover it. +LLMediaDataClient::Request::Type LLMediaDataClient::Request::getType() const +{ + if (0 == strcmp(mCapName, "ObjectMediaNavigate")) { - LL_INFOS("LLMediaDataClient") << "starting queue timer (delay=" << mQueueTimerDelay << " seconds)" << LL_ENDL; - // LLEventTimer automagically takes care of the lifetime of this object - new QueueTimer(mQueueTimerDelay, this); + return NAVIGATE; } - else { - LL_DEBUGS("LLMediaDataClient") << "not starting queue timer (it's already running, right???)" << LL_ENDL; + else if (0 == strcmp(mCapName, "ObjectMedia")) + { + const std::string &verb = mPayload["verb"]; + if (verb == "GET") + { + return GET; + } + else if (verb == "UPDATE") + { + return UPDATE; + } } + llassert(false); + return GET; } - -void LLMediaDataClient::stopQueueTimer() + +const char *LLMediaDataClient::Request::getTypeAsString() const { - mQueueTimerIsRunning = false; + Type t = getType(); + switch (t) + { + case GET: + return "GET"; + break; + case UPDATE: + return "UPDATE"; + break; + case NAVIGATE: + return "NAVIGATE"; + break; + case ANY: + return "ANY"; + break; + } + return ""; } - -void LLMediaDataClient::request(const LLMediaDataClientObject::ptr_t &object, const LLSD &payload) + + +void LLMediaDataClient::Request::reEnqueue() const { - if (object.isNull() || ! object->hasMedia()) return; + // I sure hope this doesn't deref a bad pointer: + mMDC->enqueue(this); +} - // Push the object on the priority queue - enqueue(new Request(getCapabilityName(), payload, object, this)); +F32 LLMediaDataClient::Request::getRetryTimerDelay() const +{ + return (mMDC == NULL) ? LLMediaDataClient::UNAVAILABLE_RETRY_TIMER_DELAY : + mMDC->mRetryTimerDelay; } -void LLMediaDataClient::enqueue(const Request *request) +U32 LLMediaDataClient::Request::getMaxNumRetries() const { - LL_INFOS("LLMediaDataClient") << "Queuing request for " << *request << LL_ENDL; - // Push the request on the priority queue - // Sadly, we have to const-cast because items put into the queue are not const - pRequestQueue->push_back(const_cast<LLMediaDataClient::Request*>(request)); - LL_DEBUGS("LLMediaDataClient") << "Queue:" << (*pRequestQueue) << LL_ENDL; - // Start the timer if not already running - startQueueTimer(); + return (mMDC == NULL) ? LLMediaDataClient::MAX_RETRIES : mMDC->mMaxNumRetries; } +void LLMediaDataClient::Request::markSent(bool flag) +{ + if (mMarkedSent != flag) + { + mMarkedSent = flag; + if (!mMarkedSent) + { + mNum = ++sNum; + } + } +} + +void LLMediaDataClient::Request::updateScore() +{ + F64 tmp = mObject->getMediaInterest(); + if (tmp != mScore) + { + LL_DEBUGS("LLMediaDataClient") << "Score for " << mObject->getID() << " changed from " << mScore << " to " << tmp << LL_ENDL; + mScore = tmp; + } +} + +std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &r) +{ + s << "request: num=" << r.getNum() + << " type=" << r.getTypeAsString() + << " ID=" << r.getObject()->getID() + << " #retries=" << r.getRetryCount(); + return s; +} + + ////////////////////////////////////////////////////////////////////////////////////// // -// LLMediaDataClient +// LLMediaDataClient::Responder // ////////////////////////////////////////////////////////////////////////////////////// -LLMediaDataClient::LLMediaDataClient(F32 queue_timer_delay, - F32 retry_timer_delay, - U32 max_retries) - : mQueueTimerDelay(queue_timer_delay), - mRetryTimerDelay(retry_timer_delay), - mMaxNumRetries(max_retries), - mQueueTimerIsRunning(false) +LLMediaDataClient::Responder::Responder(const request_ptr_t &request) +: mRequest(request) { - pRequestQueue = new request_queue_t(); } -LLMediaDataClient::~LLMediaDataClient() +LLMediaDataClient::Responder::~Responder() { - stopQueueTimer(); - - // This should clear the queue, and hopefully call all the destructors. - LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClient destructor: queue: " << - (pRequestQueue->empty() ? "<empty> " : "<not empty> ") << (*pRequestQueue) << LL_ENDL; - delete pRequestQueue; - pRequestQueue = NULL; + LL_DEBUGS("LLMediaDataClient") << "~Responder" << *(getRequest()) << LL_ENDL; + mRequest = NULL; } -bool LLMediaDataClient::isEmpty() const +/*virtual*/ +void LLMediaDataClient::Responder::error(U32 status, const std::string& reason) { - return (NULL == pRequestQueue) ? true : pRequestQueue->empty(); + if (status == HTTP_SERVICE_UNAVAILABLE) + { + F32 retry_timeout = mRequest->getRetryTimerDelay(); + + mRequest->incRetryCount(); + + if (mRequest->getRetryCount() < mRequest->getMaxNumRetries()) + { + LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retrying in " << retry_timeout << " seconds" << LL_ENDL; + + // Start timer (instances are automagically tracked by + // InstanceTracker<> and LLEventTimer) + new RetryTimer(F32(retry_timeout/*secs*/), this); + } + else { + LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retry count " << + mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL; + } + } + else { + std::string msg = boost::lexical_cast<std::string>(status) + ": " + reason; + LL_WARNS("LLMediaDataClient") << *mRequest << " http error(" << msg << ")" << LL_ENDL; + } } -bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) const +/*virtual*/ +void LLMediaDataClient::Responder::result(const LLSD& content) { - return (NULL == pRequestQueue) ? false : find(object); + LL_DEBUGS("LLMediaDataClient") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL; } ////////////////////////////////////////////////////////////////////////////////////// @@ -569,7 +691,7 @@ void LLObjectMediaDataClient::updateMedia(LLMediaDataClientObject *object) } sd_payload[LLTextureEntry::OBJECT_MEDIA_DATA_KEY] = object_media_data; - LL_INFOS("LLMediaDataClient") << "update media data: " << object->getID() << " " << ll_print_sd(sd_payload) << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << "update media data: " << object->getID() << " " << ll_print_sd(sd_payload) << LL_ENDL; request(object, sd_payload); } @@ -581,7 +703,7 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content) llassert(type == LLMediaDataClient::Request::GET || type == LLMediaDataClient::Request::UPDATE) if (type == LLMediaDataClient::Request::GET) { - LL_INFOS("LLMediaDataClient") << *(getRequest()) << "GET returned: " << ll_print_sd(content) << LL_ENDL; + LL_DEBUGS("LLMediaDataClient") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL; // Look for an error if (content.has("error")) @@ -598,12 +720,13 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content) if (object_id != getRequest()->getObject()->getID()) { // NOT good, wrong object id!! - LL_WARNS("LLMediaDataClient") << *(getRequest()) << "DROPPING response with wrong object id (" << object_id << ")" << LL_ENDL; + LL_WARNS("LLMediaDataClient") << *(getRequest()) << " DROPPING response with wrong object id (" << object_id << ")" << LL_ENDL; return; } // Otherwise, update with object media data - getRequest()->getObject()->updateObjectMediaData(content[LLTextureEntry::OBJECT_MEDIA_DATA_KEY]); + getRequest()->getObject()->updateObjectMediaData(content[LLTextureEntry::OBJECT_MEDIA_DATA_KEY], + content[LLTextureEntry::MEDIA_VERSION_KEY]); } } else if (type == LLMediaDataClient::Request::UPDATE) diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index 812e9cbdec808b7308ba1ada10d0b4a5b400ecfc..75d32e707b49cc7f8801d4902ca7ac0353c8b5cb 100755 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -55,15 +55,19 @@ class LLMediaDataClientObject : public LLRefCount // Does this object have media? virtual bool hasMedia() const = 0; // Update the object's media data to the given array - virtual void updateObjectMediaData(LLSD const &media_data_array) = 0; - // Return the distance from the object to the avatar - virtual F64 getDistanceFromAvatar() const = 0; + virtual void updateObjectMediaData(LLSD const &media_data_array, const std::string &version_string) = 0; // Return the total "interest" of the media (on-screen area) - virtual F64 getTotalMediaInterest() const = 0; + virtual F64 getMediaInterest() const = 0; // Return the given cap url virtual std::string getCapabilityUrl(const std::string &name) const = 0; // Return whether the object has been marked dead virtual bool isDead() const = 0; + // Returns a media version number for the object + virtual U32 getMediaVersion() const = 0; + // Returns whether the object is "interesting enough" to fetch + virtual bool isInterestingEnough() const = 0; + // Returns whether we've seen this object yet or not + virtual bool isNew() const = 0; // smart pointer typedef LLPointer<LLMediaDataClientObject> ptr_t; @@ -79,11 +83,15 @@ class LLMediaDataClient : public LLRefCount const static F32 QUEUE_TIMER_DELAY;// = 1.0; // seconds(s) const static F32 UNAVAILABLE_RETRY_TIMER_DELAY;// = 5.0; // secs const static U32 MAX_RETRIES;// = 4; + const static U32 MAX_SORTED_QUEUE_SIZE;// = 10000; + const static U32 MAX_ROUND_ROBIN_QUEUE_SIZE;// = 10000; // Constructor LLMediaDataClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY, F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY, - U32 max_retries = MAX_RETRIES); + U32 max_retries = MAX_RETRIES, + U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE, + U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE); // Make the request void request(const LLMediaDataClientObject::ptr_t &object, const LLSD &payload); @@ -94,7 +102,13 @@ class LLMediaDataClient : public LLRefCount bool isEmpty() const; // Returns true iff the given object is in the queue - bool isInQueue(const LLMediaDataClientObject::ptr_t &object) const; + bool isInQueue(const LLMediaDataClientObject::ptr_t &object); + + // Remove the given object from the queue. Returns true iff the given object is removed. + bool removeFromQueue(const LLMediaDataClientObject::ptr_t &object); + + // Called only by the Queue timer and tests (potentially) + bool processQueueTimer(); protected: // Destructor @@ -107,11 +121,12 @@ class LLMediaDataClient : public LLRefCount enum Type { GET, UPDATE, - NAVIGATE + NAVIGATE, + ANY }; - Request(const std::string &cap_name, const LLSD& sd_payload, LLMediaDataClientObject *obj, LLMediaDataClient *mdc); - const std::string &getCapName() const { return mCapName; } + Request(const char *cap_name, const LLSD& sd_payload, LLMediaDataClientObject *obj, LLMediaDataClient *mdc); + const char *getCapName() const { return mCapName; } const LLSD &getPayload() const { return mPayload; } LLMediaDataClientObject *getObject() const { return mObject; } @@ -132,6 +147,12 @@ class LLMediaDataClient : public LLRefCount F32 getRetryTimerDelay() const; U32 getMaxNumRetries() const; + bool isNew() const { return mObject.notNull() ? mObject->isNew() : false; } + void markSent(bool flag); + bool isMarkedSent() const { return mMarkedSent; } + void updateScore(); + F64 getScore() const { return mScore; } + public: friend std::ostream& operator<<(std::ostream &s, const Request &q); @@ -139,14 +160,16 @@ class LLMediaDataClient : public LLRefCount virtual ~Request(); // use unref(); private: - std::string mCapName; + const char *mCapName; LLSD mPayload; LLMediaDataClientObject::ptr_t mObject; // Simple tracking - const U32 mNum; + U32 mNum; static U32 sNum; U32 mRetryCount; - + F64 mScore; + bool mMarkedSent; + // Back pointer to the MDC...not a ref! LLMediaDataClient *mMDC; }; @@ -184,18 +207,23 @@ class LLMediaDataClient : public LLRefCount }; protected: - - void enqueue(const Request*); - + // Subclasses must override this factory method to return a new responder virtual Responder *createResponder(const request_ptr_t &request) const = 0; // Subclasses must override to return a cap name virtual const char *getCapabilityName() const = 0; -private: + virtual void sortQueue(); + virtual void serviceQueue(); +private: typedef std::list<request_ptr_t> request_queue_t; + + void enqueue(const Request*); + + // Return whether the given object is/was in the queue + static LLMediaDataClient::request_ptr_t findOrRemove(request_queue_t &queue, const LLMediaDataClientObject::ptr_t &obj, bool remove, Request::Type type); // Comparator for sorting static bool compareRequests(const request_ptr_t &o1, const request_ptr_t &o2); @@ -215,34 +243,40 @@ class LLMediaDataClient : public LLRefCount // back-pointer LLPointer<LLMediaDataClient> mMDC; }; - - // Return whether the given object is in the queue - bool find(const LLMediaDataClientObject::ptr_t &obj) const; void startQueueTimer(); void stopQueueTimer(); void setIsRunning(bool val) { mQueueTimerIsRunning = val; } - + + void swapCurrentQueue(); + request_queue_t *getCurrentQueue(); + const F32 mQueueTimerDelay; const F32 mRetryTimerDelay; const U32 mMaxNumRetries; + const U32 mMaxSortedQueueSize; + const U32 mMaxRoundRobinQueueSize; bool mQueueTimerIsRunning; - request_queue_t *pRequestQueue; + request_queue_t mSortedQueue; + request_queue_t mRoundRobinQueue; + bool mCurrentQueueIsTheSortedQueue; }; -// MediaDataResponder specific for the ObjectMedia cap +// MediaDataClient specific for the ObjectMedia cap class LLObjectMediaDataClient : public LLMediaDataClient { public: LLObjectMediaDataClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY, F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY, - U32 max_retries = MAX_RETRIES) + U32 max_retries = MAX_RETRIES, + U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE, + U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE) : LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries) {} - ~LLObjectMediaDataClient() {} + virtual ~LLObjectMediaDataClient() {} void fetchMedia(LLMediaDataClientObject *object); void updateMedia(LLMediaDataClientObject *object); @@ -264,7 +298,7 @@ class LLObjectMediaDataClient : public LLMediaDataClient }; -// MediaDataResponder specific for the ObjectMediaNavigate cap +// MediaDataClient specific for the ObjectMediaNavigate cap class LLObjectMediaNavigateClient : public LLMediaDataClient { public: @@ -273,10 +307,12 @@ class LLObjectMediaNavigateClient : public LLMediaDataClient LLObjectMediaNavigateClient(F32 queue_timer_delay = QUEUE_TIMER_DELAY, F32 retry_timer_delay = UNAVAILABLE_RETRY_TIMER_DELAY, - U32 max_retries = MAX_RETRIES) + U32 max_retries = MAX_RETRIES, + U32 max_sorted_queue_size = MAX_SORTED_QUEUE_SIZE, + U32 max_round_robin_queue_size = MAX_ROUND_ROBIN_QUEUE_SIZE) : LLMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries) {} - ~LLObjectMediaNavigateClient() {} + virtual ~LLObjectMediaNavigateClient() {} void navigate(LLMediaDataClientObject *object, U8 texture_index, const std::string &url); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index e65b7d8a0c61a2ee7742e75bd76ac6a69d27df65..08bc1fac8b3fbbb7a8d7ac7e37b43e4db0532962 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -82,9 +82,24 @@ class LLTeleportHistoryMenuItem : public LLMenuItemCallGL struct Params : public LLInitParam::Block<Params, LLMenuItemCallGL::Params> { - Mandatory<EType> item_type; - - Params() {} + Mandatory<EType> item_type; + Optional<const LLFontGL*> back_item_font, + current_item_font, + forward_item_font; + Optional<std::string> back_item_image, + forward_item_image; + Optional<S32> image_hpad, + image_vpad; + Params() + : item_type(), + back_item_font("back_item_font"), + current_item_font("current_item_font"), + forward_item_font("forward_item_font"), + back_item_image("back_item_image"), + forward_item_image("forward_item_image"), + image_hpad("image_hpad"), + image_vpad("image_vpad") + {} }; /*virtual*/ void draw(); @@ -97,33 +112,36 @@ class LLTeleportHistoryMenuItem : public LLMenuItemCallGL static const S32 ICON_WIDTH = 16; static const S32 ICON_HEIGHT = 16; - static const std::string ICON_IMG_BACKWARD; - static const std::string ICON_IMG_FORWARD; LLIconCtrl* mArrowIcon; }; -const std::string LLTeleportHistoryMenuItem::ICON_IMG_BACKWARD("teleport_history_backward.tga"); -const std::string LLTeleportHistoryMenuItem::ICON_IMG_FORWARD("teleport_history_forward.tga"); +static LLDefaultChildRegistry::Register<LLTeleportHistoryMenuItem> r("teleport_history_menu_item"); + LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p) : LLMenuItemCallGL(p), mArrowIcon(NULL) { // Set appearance depending on the item type. - if (p.item_type == TYPE_CURRENT) + if (p.item_type == TYPE_BACKWARD) + { + setFont( p.back_item_font ); + } + else if (p.item_type == TYPE_CURRENT) { - setFont(LLFontGL::getFontSansSerifBold()); + setFont( p.current_item_font ); } else { - setFont(LLFontGL::getFontSansSerif()); - setLabel(std::string(" ") + std::string(p.label)); + setFont( p.forward_item_font ); } LLIconCtrl::Params icon_params; icon_params.name("icon"); - icon_params.rect(LLRect(0, ICON_HEIGHT, ICON_WIDTH, 0)); + LLRect rect(0, ICON_HEIGHT, ICON_WIDTH, 0); + rect.translate( p.image_hpad, p.image_vpad ); + icon_params.rect( rect ); icon_params.mouse_opaque(false); icon_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP); icon_params.visible(false); @@ -132,9 +150,9 @@ LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p) // no image for the current item if (p.item_type == TYPE_BACKWARD) - mArrowIcon->setValue(ICON_IMG_BACKWARD); + mArrowIcon->setValue( p.back_item_image() ); else if (p.item_type == TYPE_FORWARD) - mArrowIcon->setValue(ICON_IMG_FORWARD); + mArrowIcon->setValue( p.forward_item_image() ); addChild(mArrowIcon); } diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 5c240aa54a367cc3c15233e3e235e345f6873b2b..83a8dcd9f075b2b6b36d6c8459e8c53c80d09802 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -265,6 +265,11 @@ class LLHandlerUtil */ static bool canLogToIM(const LLNotificationPtr& notification); + /** + * Checks sufficient conditions to log notification message to nearby chat session. + */ + static bool canLogToNearbyChat(const LLNotificationPtr& notification); + /** * Checks sufficient conditions to spawn IM session. */ @@ -287,6 +292,11 @@ class LLHandlerUtil * Writes group notice notification message to IM group session. */ static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification); + + /** + * Writes notification message to nearby chat. + */ + static void logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type); }; } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 6748bd79823757675f5c84ed49e75d9415821ff8..5b54092c5cdea3d5bcd6ff81a914490ced6afdf0 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -37,6 +37,8 @@ #include "llnotifications.h" #include "llimview.h" #include "llagent.h" +#include "llfloaterreg.h" +#include "llnearbychat.h" using namespace LLNotificationsUI; @@ -47,7 +49,9 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"), ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"), USER_GIVE_ITEM("UserGiveItem"), OFFER_FRIENDSHIP("OfferFriendship"), FRIENDSHIP_ACCEPTED("FriendshipAccepted"), - FRIENDSHIP_OFFERED("FriendshipOffered"); + FRIENDSHIP_OFFERED("FriendshipOffered"), + FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"), + SERVER_OBJECT_MESSAGE("ServerObjectMessage"); // static bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) @@ -55,7 +59,16 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) return GRANTED_MODIFY_RIGHTS == notification->getName() || REVOKED_MODIFY_RIGHTS == notification->getName() || PAYMENT_RECIVED == notification->getName() - || FRIENDSHIP_OFFERED == notification->getName(); + || FRIENDSHIP_OFFERED == notification->getName() + || SERVER_OBJECT_MESSAGE == notification->getName(); +} + +// static +bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification) +{ + return notification->getType() == "notifytip" + && FRIEND_ONLINE != notification->getName() + && FRIEND_OFFLINE != notification->getName(); } // static @@ -144,3 +157,15 @@ void LLHandlerUtil::logGroupNoticeToIMGroup( payload["group_id"], sender_id); } +// static +void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type) +{ + LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); + if(nearby_chat) + { + LLChat chat_msg(notification->getMessage()); + chat_msg.mSourceType = type; + nearby_chat->addMessage(chat_msg); + } +} + diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 95f5ec801c454c1f382351b193cc3d450fcd8a34..9afaddae82ee0578c476e778277b3fc792364571 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -88,18 +88,17 @@ bool LLTipHandler::processNotification(const LLSD& notify) if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") { // archive message in nearby chat - LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); - if(nearby_chat) + if (LLHandlerUtil::canLogToNearbyChat(notification)) { - LLChat chat_msg(notification->getMessage()); - chat_msg.mSourceType = CHAT_SOURCE_SYSTEM; - nearby_chat->addMessage(chat_msg); + LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM); // don't show toast if Nearby Chat is opened + LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance< + LLNearbyChat>("nearby_chat", LLSD()); if (nearby_chat->getVisible()) { return true; - } + } } LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index eb9cb10d56476e9d5f74d0e80b0f0ec0b876b63c..b9f422ca6f6fae0878e7e3a11476fd9ad5dc5a0b 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -51,6 +51,7 @@ #include "llfloaterworldmap.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" +#include "llvoiceclient.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLDropTarget @@ -395,6 +396,7 @@ void LLPanelProfileTab::updateButtons() && gAgent.isGodlike() || is_agent_mappable(getAvatarId()); childSetEnabled("show_on_map_btn", enable_map_btn); + childSetEnabled("call", LLVoiceClient::voiceEnabled()); } ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 2cb3967685efe2b561e77774ddff3615fdcbb8b8..fff257589381a39f76ba5364f1faab042569720a 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -90,6 +90,7 @@ LLPanelGroup::LLPanelGroup() : LLPanel(), LLGroupMgrObserver( LLUUID() ), mAllowEdit( TRUE ) + ,mShowingNotifyDialog(false) { // Set up the factory callbacks. // Roles sub tabs @@ -538,3 +539,69 @@ void LLPanelGroup::showNotice(const std::string& subject, } +bool LLPanelGroup::canClose() +{ + if(getVisible() == false) + return true; + + bool need_save = false; + std::string mesg; + for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) + if(need_save|=(*it)->needsApply(mesg)) + break; + if(!need_save) + return false; + // If no message was provided, give a generic one. + if (mesg.empty()) + { + mesg = mDefaultNeedsApplyMesg; + } + // Create a notify box, telling the user about the unapplied tab. + LLSD args; + args["NEEDS_APPLY_MESSAGE"] = mesg; + args["WANT_APPLY_MESSAGE"] = mWantApplyMesg; + + LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2)); + + mShowingNotifyDialog = true; + + return false; +} + +bool LLPanelGroup::notifyChildren(const LLSD& info) +{ + if(info.has("request") && mID.isNull() ) + { + std::string str_action = info["request"]; + + if (str_action == "quit" ) + { + canClose(); + return true; + } + if(str_action == "wait_quit") + return mShowingNotifyDialog; + } + return false; +} +bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + mShowingNotifyDialog = false; + switch (option) + { + case 0: // "Apply Changes" + apply(); + break; + case 1: // "Ignore Changes" + break; + case 2: // "Cancel" + default: + // Do nothing. The user is canceling the action. + // If we were quitting, we didn't really mean it. + LLAppViewer::instance()->abortQuit(); + break; + } + return false; +} + diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 306e6575fc7122a3ecfec663f8c35b6bbe873d45..f6aefdb676d85cc043262d1a7376b32e4ad124e0 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -89,7 +89,10 @@ class LLPanelGroup : public LLPanel, const std::string& inventory_name, LLOfferInfo* inventory_offer); - + + bool notifyChildren (const LLSD& info); + bool handleNotifyCallback(const LLSD&, const LLSD&); + protected: virtual void update(LLGroupChange gc); @@ -107,6 +110,9 @@ class LLPanelGroup : public LLPanel, protected: bool apply(LLPanelGroupTab* tab); + bool canClose(); + + bool mShowingNotifyDialog; LLTimer mRefreshTimer; diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 8c19865550a539ce28c5c3c13458e36c35ad3f85..4f76d32ad59209aa6c2fdf0cbf178a17226cc54d 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -101,14 +101,6 @@ void LLPanelChatControlPanel::draw() && callback_enabled; childSetEnabled("call_btn", enable_connect); - // send a signal when the floater is fully initialized - // this lets LLAvatarActions::startAdhocCall() start the call - if (enable_connect && !mInitialized) - { - LLIMModel::sendSessionInitialized(mSessionId); - mInitialized = true; - } - LLPanel::draw(); } diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 871779b2737415b7f5db56c909caaed89d981c2b..711340efc77111ad73c1616b3caae286fa958f03 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -45,8 +45,7 @@ class LLPanelChatControlPanel : public LLPanel { public: LLPanelChatControlPanel() : - mSessionId(LLUUID()), - mInitialized(false) {}; + mSessionId(LLUUID()) {}; ~LLPanelChatControlPanel(); virtual BOOL postBuild(); @@ -63,7 +62,6 @@ class LLPanelChatControlPanel : public LLPanel private: LLUUID mSessionId; - bool mInitialized; // connection to voice channel state change signal boost::signals2::connection mVoiceChannelStateChangeConnection; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index e87b70f6a58c4c475ff888fd12b9986b89426c36..e56ed00dcba05bd69a64af19f1a36a799fa365fa 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -66,6 +66,30 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn"; // helper functions static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string); +static void save_folder_state_if_no_filter(LLInventorySubTreePanel* inventory_list); + +/** + * Bridge to support knowing when the inventory has changed to update folder (open/close) state + * for landmarks panels. + * + * Due to Inventory data are loaded in background we need to save folder state each time + * next level is loaded. See EXT-3094. + */ +class LLLandmarksPanelObserver : public LLInventoryObserver +{ +public: + LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {} + virtual ~LLLandmarksPanelObserver() {} + /*virtual*/ void changed(U32 mask); + +private: + LLLandmarksPanel* mLP; +}; + +void LLLandmarksPanelObserver::changed(U32 mask) +{ + mLP->saveFolderStateIfNoFilter(); +} LLLandmarksPanel::LLLandmarksPanel() : LLPanelPlacesTab() @@ -78,11 +102,18 @@ LLLandmarksPanel::LLLandmarksPanel() , mGearFolderMenu(NULL) , mGearLandmarkMenu(NULL) { + mInventoryObserver = new LLLandmarksPanelObserver(this); + gInventory.addObserver(mInventoryObserver); + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml"); } LLLandmarksPanel::~LLLandmarksPanel() { + if (gInventory.containsObserver(mInventoryObserver)) + { + gInventory.removeObserver(mInventoryObserver); + } } BOOL LLLandmarksPanel::postBuild() @@ -226,6 +257,14 @@ void LLLandmarksPanel::onSelectorButtonClicked() } } +void LLLandmarksPanel::saveFolderStateIfNoFilter() +{ + save_folder_state_if_no_filter(mFavoritesInventoryPanel); + save_folder_state_if_no_filter(mLandmarksInventoryPanel); + save_folder_state_if_no_filter(mMyInventoryPanel); + save_folder_state_if_no_filter(mLibraryInventoryPanel); +} + ////////////////////////////////////////////////////////////////////////// // PROTECTED METHODS ////////////////////////////////////////////////////////////////////////// @@ -327,6 +366,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel() mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list"); initLandmarksPanel(mFavoritesInventoryPanel); + mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems"); initAccordion("tab_favorites", mFavoritesInventoryPanel); } @@ -389,9 +429,6 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis } root_folder->setParentLandmarksPanel(this); - - // save initial folder state to avoid incorrect work while switching between Landmarks & Teleport History tabs - // See EXT-1609. inventory_list->saveFolderState(); } @@ -747,7 +784,7 @@ void LLLandmarksPanel::updateFilteredAccordions() { LLInventoryPanel* inventory_list = NULL; LLAccordionCtrlTab* accordion_tab = NULL; -// bool needs_arrange = false; + bool needs_arrange = false; for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) { @@ -759,7 +796,7 @@ void LLLandmarksPanel::updateFilteredAccordions() if (NULL == inventory_list) continue; // This doesn't seem to work correctly. Disabling for now. -Seraph - /* + // Enabled to show/hide accordions with/without landmarks. See EXT-2346. (Seth PE) LLFolderView* fv = inventory_list->getRootFolder(); // arrange folder view contents to draw its descendants if it has any @@ -770,17 +807,17 @@ void LLLandmarksPanel::updateFilteredAccordions() needs_arrange = true; accordion_tab->setVisible(has_descendants); - */ - accordion_tab->setVisible(TRUE); + + //accordion_tab->setVisible(TRUE); } // we have to arrange accordion tabs for cases when filter string is less restrictive but // all items are still filtered. -// if (needs_arrange) -// { + if (needs_arrange) + { static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); accordion->arrange(); -// } + } } /* @@ -995,15 +1032,17 @@ void LLLandmarksPanel::doCreatePick(LLLandmark* landmark) ////////////////////////////////////////////////////////////////////////// static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string) { + // When search is cleared, restore the old folder state. if (string == "") { inventory_list->setFilterSubString(LLStringUtil::null); - - // re-open folders that were initially open + // Re-open folders that were open before inventory_list->restoreFolderState(); } - gInventory.startBackgroundFetch(); + // Open the immediate children of the root folder, since those + // are invisible in the UI and thus must always be open. + inventory_list->getRootFolder()->openTopLevelFolders(); if (inventory_list->getFilterSubString().empty() && string.empty()) { @@ -1017,7 +1056,17 @@ static void filter_list(LLInventorySubTreePanel* inventory_list, const std::stri inventory_list->saveFolderState(); } - // set new filter string + // Set new filter string inventory_list->setFilterSubString(string); + +} + +static void save_folder_state_if_no_filter(LLInventorySubTreePanel* inventory_list) +{ + // save current folder open state if no filter currently applied + if (inventory_list->getRootFolder() && inventory_list->getRootFolder()->getFilterSubString().empty()) + { + // inventory_list->saveFolderState(); // *TODO: commented out to fix build + } } // EOF diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index bee141d05168a014394a19b761644c68b5e8f704..b0e537f647174ae33681df9d6dfb08a8508f49ff 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -67,6 +67,11 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver mCurrentSelectedList = inventory_list; } + /** + * Saves folder state for all Inventory Panels if there are no applied filter. + */ + void saveFolderStateIfNoFilter(); + protected: /** * @return true - if current selected panel is not null and selected item is a landmark @@ -151,6 +156,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver LLMenuGL* mGearFolderMenu; LLMenuGL* mMenuAdd; LLInventorySubTreePanel* mCurrentSelectedList; + LLInventoryObserver* mInventoryObserver; LLPanel* mListCommands; bool mSortByDate; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index a729b8c06ffc994088db83c309753d005797b305..a5bfa18851f3f0cae3ef51b6b501f1db78983e80 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -73,6 +73,11 @@ #include "llfloatertos.h" #include "lltrans.h" #include "llglheaders.h" +#include "llpanelloginlistener.h" + +#if LL_WINDOWS +#pragma warning(disable: 4355) // 'this' used in initializer list +#endif // LL_WINDOWS #define USE_VIEWER_AUTH 0 @@ -166,7 +171,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mLogoImage(), mCallback(callback), mCallbackData(cb_data), - mHtmlAvailable( TRUE ) + mHtmlAvailable( TRUE ), + mListener(new LLPanelLoginListener(this)) { setFocusRoot(TRUE); @@ -452,7 +458,7 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask) if ( KEY_F1 == key ) { LLViewerHelp* vhelp = LLViewerHelp::getInstance(); - vhelp->showTopic(vhelp->getTopicFromFocus()); + vhelp->showTopic(vhelp->f1HelpTopic()); return TRUE; } @@ -972,7 +978,7 @@ void LLPanelLogin::onClickHelp(void*) if (sInstance) { LLViewerHelp* vhelp = LLViewerHelp::getInstance(); - vhelp->showTopic(vhelp->getTopicFromFocus()); + vhelp->showTopic(vhelp->preLoginTopic()); } } diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index e3d30d7d0c028892e9ee553f6506e58abc08dfac..97350ce5c72a09654abb1145c0e3039bb7ef8f4d 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -36,10 +36,11 @@ #include "llpanel.h" #include "llpointer.h" // LLPointer<> #include "llmediactrl.h" // LLMediaCtrlObserver +#include <boost/scoped_ptr.hpp> class LLLineEditor; class LLUIImage; - +class LLPanelLoginListener; class LLPanelLogin: public LLPanel, @@ -90,6 +91,7 @@ class LLPanelLogin: /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); private: + friend class LLPanelLoginListener; void reshapeBrowser(); static void onClickConnect(void*); static void onClickNewAccount(void*); @@ -103,6 +105,7 @@ class LLPanelLogin: private: LLPointer<LLUIImage> mLogoImage; + boost::scoped_ptr<LLPanelLoginListener> mListener; void (*mCallback)(S32 option, void *userdata); void* mCallbackData; diff --git a/indra/newview/llpanelloginlistener.cpp b/indra/newview/llpanelloginlistener.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f7e59aaf54c6abaef7a710b6109daa0c25d201c5 --- /dev/null +++ b/indra/newview/llpanelloginlistener.cpp @@ -0,0 +1,34 @@ +/** + * @file llpanelloginlistener.cpp + * @author Nat Goodspeed + * @date 2009-12-10 + * @brief Implementation for llpanelloginlistener. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llpanelloginlistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llpanellogin.h" + +LLPanelLoginListener::LLPanelLoginListener(LLPanelLogin* instance): + LLEventAPI("LLPanelLogin", "Access to LLPanelLogin methods"), + mPanel(instance) +{ + add("onClickConnect", + "Pretend user clicked the \"Log In\" button", + &LLPanelLoginListener::onClickConnect); +} + +void LLPanelLoginListener::onClickConnect(const LLSD&) const +{ + mPanel->onClickConnect(NULL); +} diff --git a/indra/newview/llpanelloginlistener.h b/indra/newview/llpanelloginlistener.h new file mode 100644 index 0000000000000000000000000000000000000000..0a56c75422d345f6ea73713abe34a53008ec48d6 --- /dev/null +++ b/indra/newview/llpanelloginlistener.h @@ -0,0 +1,30 @@ +/** + * @file llpanelloginlistener.h + * @author Nat Goodspeed + * @date 2009-12-10 + * @brief LLEventAPI for LLPanelLogin + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLPANELLOGINLISTENER_H) +#define LL_LLPANELLOGINLISTENER_H + +#include "lleventapi.h" +class LLPanelLogin; +class LLSD; + +class LLPanelLoginListener: public LLEventAPI +{ +public: + LLPanelLoginListener(LLPanelLogin* instance); + +private: + void onClickConnect(const LLSD&) const; + + LLPanelLogin* mPanel; +}; + +#endif /* ! defined(LL_LLPANELLOGINLISTENER_H) */ diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 9fd92725dc2539779d259284b8dda4c070471f33..cef21e85d6d584593b0115e4e740771e4eaca013 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llpanelmaininventory.h" +#include "llagent.h" #include "lldndbutton.h" #include "llfilepicker.h" #include "llfloaterinventory.h" @@ -863,7 +864,6 @@ void LLPanelMainInventory::initListCommandsHandlers() mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2)); mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - } void LLPanelMainInventory::updateListCommands() @@ -909,6 +909,22 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata) getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); } +void LLPanelMainInventory::saveTexture(const LLSD& userdata) +{ + LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + + const LLUUID& item_id = current_item->getListener()->getUUID(); + LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES); + if (preview_texture) + { + preview_texture->openToSave(); + } +} + void LLPanelMainInventory::onCustomAction(const LLSD& userdata) { if (!isActionEnabled(userdata)) @@ -953,18 +969,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) } if (command_name == "save_texture") { - LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return; - } - - const LLUUID& item_id = current_item->getListener()->getUUID(); - LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES); - if (preview_texture) - { - preview_texture->openToSave(); - } + saveTexture(userdata); } // This doesn't currently work, since the viewer can't change an assetID an item. if (command_name == "regenerate_link") @@ -1008,6 +1013,22 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) } } +bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata) +{ + LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (current_item) + { + LLViewerInventoryItem *inv_item = current_item->getInventoryItem(); + if(inv_item) + { + bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); + LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType(); + return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT); + } + } + return false; +} + BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) { const std::string command_name = userdata.asString(); @@ -1020,6 +1041,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) can_delete = TRUE; std::set<LLUUID> selection_set; folder->getSelectionList(selection_set); + if (selection_set.empty()) return FALSE; for (std::set<LLUUID>::iterator iter = selection_set.begin(); iter != selection_set.end(); ++iter) @@ -1034,12 +1056,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) } if (command_name == "save_texture") { - LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (current_item) - { - return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE); - } - return FALSE; + return isSaveTextureEnabled(userdata); } if (command_name == "find_original") { diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index ae78d3bec82b0d1195c957b142fe4594596f8377..92443df369b28070a536c1432011b455895ed42c 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -110,6 +110,8 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver void doCreate(const LLSD& userdata); void resetFilters(); void setSortBy(const LLSD& userdata); + void saveTexture(const LLSD& userdata); + bool isSaveTextureEnabled(const LLSD& userdata); private: LLFloaterInventoryFinder* getFinder(); diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 3fa0e7bf8f882cd4724a18b3103cd1739a5c9bd8..88eba14553425ed758bef0eb3d32bd053e520e29 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -94,7 +94,7 @@ BOOL LLPanelMediaSettingsGeneral::postBuild() mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY ); mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY ); mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY ); - mCurrentURL = getChild< LLLineEditor >( LLMediaEntry::CURRENT_URL_KEY ); + mCurrentURL = getChild< LLTextBox >( LLMediaEntry::CURRENT_URL_KEY ); mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY ); mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY ); mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY ); @@ -284,7 +284,7 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_ { LLMediaEntry::AUTO_SCALE_KEY, self->mAutoScale, "LLCheckBoxCtrl" }, { LLMediaEntry::AUTO_ZOOM_KEY, self->mAutoZoom, "LLCheckBoxCtrl" }, { LLMediaEntry::CONTROLS_KEY, self->mControls, "LLComboBox" }, - { LLMediaEntry::CURRENT_URL_KEY, self->mCurrentURL, "LLLineEditor" }, + { LLMediaEntry::CURRENT_URL_KEY, self->mCurrentURL, "LLTextBox" }, { LLMediaEntry::HEIGHT_PIXELS_KEY, self->mHeightPixels, "LLSpinCtrl" }, { LLMediaEntry::HOME_URL_KEY, self->mHomeURL, "LLLineEditor" }, { LLMediaEntry::FIRST_CLICK_INTERACT_KEY, self->mFirstClick, "LLCheckBoxCtrl" }, @@ -518,4 +518,9 @@ void LLPanelMediaSettingsGeneral::updateCurrentUrl() bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_current_url, value_str ); mCurrentURL->setText(value_str); mCurrentURL->setTentative(identical); + + if ( LLPanelMediaSettingsGeneral::isMultiple() ) + { + mCurrentURL->setText(LLTrans::getString("Multiple Media")); + } } diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h index 7782b25d63c5df37e37f8da8aa62701092101df8..c6895b1dc9f5cd0de7b5a3e66a5af15fb6f84ac6 100644 --- a/indra/newview/llpanelmediasettingsgeneral.h +++ b/indra/newview/llpanelmediasettingsgeneral.h @@ -99,7 +99,7 @@ class LLPanelMediaSettingsGeneral : public LLPanel LLSpinCtrl* mWidthPixels; LLSpinCtrl* mHeightPixels; LLLineEditor* mHomeURL; - LLLineEditor* mCurrentURL; + LLTextBox* mCurrentURL; LLMediaCtrl* mPreviewMedia; LLTextBox* mFailWhiteListText; }; diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index d87c7608d5f6076dffbeee7b285cda495bc8a15c..aea6b0aa3b5deacdad2c0f83f1f737c931f89a42 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -167,6 +167,9 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); }; }; + + // initial update - hides/shows status messages etc. + self->updateWhitelistEnableStatus(); } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 11c65a39f9348f107a90479a0629bd1d622d692e..0a63032751f0de3905d68158fef14b572478e52a 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -157,7 +157,7 @@ LLInventoryItem* LLTaskInvFVBridge::findItem() const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if(object) { - return (LLInventoryItem*)(object->getInventoryObject(mUUID)); + return dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID)); } return NULL; } @@ -712,6 +712,7 @@ class LLTaskCategoryBridge : public LLTaskInvFVBridge virtual LLUIImagePtr getIcon() const; virtual const std::string& getDisplayName() const { return getName(); } virtual BOOL isItemRenameable() const; + // virtual BOOL isItemCopyable() const { return FALSE; } virtual BOOL renameItem(const std::string& new_name); virtual BOOL isItemRemovable(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); @@ -1814,7 +1815,7 @@ void LLPanelObjectInventory::updateInventory() mFolders->requestArrange(); mInventoryNeedsUpdate = FALSE; - LLEditMenuHandler::gEditMenuHandler = mFolders; + // Edit menu handler is set in onFocusReceived } // *FIX: This is currently a very expensive operation, because we have diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 6aba8c0ebb66c6a5616acfdc7b262814a1564f70..4511bca23a55c35e3d1c52a3315449a19dea91f1 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -136,6 +136,24 @@ void LLPanelOutfitsInventory::onWear() } } +void LLPanelOutfitsInventory::onAdd() +{ + LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); + if (listenerp) + { + listenerp->performAction(NULL, NULL,"addtooutfit"); + } +} + +void LLPanelOutfitsInventory::onRemove() +{ + LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); + if (listenerp) + { + listenerp->performAction(NULL, NULL,"removefromoutfit"); + } +} + void LLPanelOutfitsInventory::onEdit() { } @@ -224,8 +242,10 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() , _7 // EAcceptance* accept )); - mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action", boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2)); - mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable", boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2)); + mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action", + boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2)); + mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable", + boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2)); mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); } @@ -290,6 +310,22 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata) { onWear(); } + if (command_name == "add") + { + onAdd(); + } + if (command_name == "remove") + { + onRemove(); + } + if (command_name == "rename") + { + onClipboardAction("rename"); + } + if (command_name == "remove_link") + { + onClipboardAction("delete"); + } if (command_name == "delete") { onClipboardAction("delete"); @@ -320,8 +356,33 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) } return FALSE; } + if (command_name == "remove_link") + { + BOOL can_delete = FALSE; + LLFolderView *folder = getActivePanel()->getRootFolder(); + if (folder) + { + can_delete = TRUE; + std::set<LLUUID> selection_set; + folder->getSelectionList(selection_set); + for (std::set<LLUUID>::iterator iter = selection_set.begin(); + iter != selection_set.end(); + ++iter) + { + const LLUUID &item_id = (*iter); + LLViewerInventoryItem *item = gInventory.getItem(item_id); + if (!item || !item->getIsLinkType()) + return FALSE; + } + return can_delete; + } + return FALSE; + } if (command_name == "edit" || - command_name == "wear") + command_name == "wear" || + command_name == "add" || + command_name == "remove" + ) { return (getCorrectListenerForAction() != NULL); } diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index aa0ab4efbc5c7fa9900a922957d3befdb6838e1b..afeaef485d93ee907577516c8590d568561485fd 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -55,6 +55,8 @@ class LLPanelOutfitsInventory : public LLPanel void onSearchEdit(const std::string& string); void onWear(); + void onAdd(); + void onRemove(); void onEdit(); void onNew(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 1e4682701e7124f1542b1cd4d85cc1d0a52ea072..5fb7dab7be9267fe6d9fbd546bcd4e4437cf3557 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -775,7 +775,7 @@ void LLPanelPeople::updateButtons() buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front())); buttonSetEnabled("view_profile_btn", item_selected); buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection - buttonSetEnabled("call_btn", multiple_selected); + buttonSetEnabled("call_btn", multiple_selected && LLVoiceClient::voiceEnabled()); buttonSetEnabled("share_btn", item_selected); // not implemented yet bool none_group_selected = item_selected && selected_id.isNull(); diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 57f3d86d539ca6c1522428c263c0e9425156667d..04fe42de9f9840d006ecbeb5f3ebf1aa79154f08 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -100,7 +100,7 @@ LLContextMenu* NearbyMenu::createMenu() registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id)); registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this)); registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented - registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented + registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id)); registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id)); registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id)); diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 6a29d76aad4f84160f85a6d69f034f880f6c9cfd..8b8b1bed3756ed9070c8a7ffce6c61fd7ce1954f 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -181,6 +181,85 @@ LLPanelPermissions::~LLPanelPermissions() } +void LLPanelPermissions::disableAll() +{ + childSetEnabled("perm_modify", FALSE); + childSetText("perm_modify", LLStringUtil::null); + + childSetEnabled("Creator:", FALSE); + childSetText("Creator Name", LLStringUtil::null); + childSetEnabled("Creator Name", FALSE); + + childSetEnabled("Owner:", FALSE); + childSetText("Owner Name", LLStringUtil::null); + childSetEnabled("Owner Name", FALSE); + + childSetEnabled("Group:", FALSE); + childSetText("Group Name", LLStringUtil::null); + childSetEnabled("Group Name", FALSE); + childSetEnabled("button set group", FALSE); + + childSetText("Object Name", LLStringUtil::null); + childSetEnabled("Object Name", FALSE); + childSetEnabled("Name:", FALSE); + childSetText("Group Name", LLStringUtil::null); + childSetEnabled("Group Name", FALSE); + childSetEnabled("Description:", FALSE); + childSetText("Object Description", LLStringUtil::null); + childSetEnabled("Object Description", FALSE); + + childSetEnabled("Permissions:", FALSE); + + childSetValue("checkbox share with group", FALSE); + childSetEnabled("checkbox share with group", FALSE); + childSetEnabled("button deed", FALSE); + + childSetValue("checkbox allow everyone move", FALSE); + childSetEnabled("checkbox allow everyone move", FALSE); + childSetValue("checkbox allow everyone copy", FALSE); + childSetEnabled("checkbox allow everyone copy", FALSE); + + //Next owner can: + childSetEnabled("Next owner can:", FALSE); + childSetValue("checkbox next owner can modify", FALSE); + childSetEnabled("checkbox next owner can modify", FALSE); + childSetValue("checkbox next owner can copy", FALSE); + childSetEnabled("checkbox next owner can copy", FALSE); + childSetValue("checkbox next owner can transfer", FALSE); + childSetEnabled("checkbox next owner can transfer", FALSE); + + //checkbox for sale + childSetValue("checkbox for sale", FALSE); + childSetEnabled("checkbox for sale", FALSE); + + //checkbox include in search + childSetValue("search_check", FALSE); + childSetEnabled("search_check", FALSE); + + LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); + combo_sale_type->setValue(LLSaleInfo::FS_COPY); + combo_sale_type->setEnabled(FALSE); + + childSetEnabled("Cost", FALSE); + childSetText("Cost", getString("Cost Default")); + childSetText("Edit Cost", LLStringUtil::null); + childSetEnabled("Edit Cost", FALSE); + + childSetEnabled("label click action", FALSE); + LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction"); + if (combo_click_action) + { + combo_click_action->setEnabled(FALSE); + combo_click_action->clear(); + } + childSetVisible("B:", FALSE); + childSetVisible("O:", FALSE); + childSetVisible("G:", FALSE); + childSetVisible("E:", FALSE); + childSetVisible("N:", FALSE); + childSetVisible("F:", FALSE); +} + void LLPanelPermissions::refresh() { LLButton* BtnDeedToGroup = getChild<LLButton>("button deed"); @@ -215,136 +294,58 @@ void LLPanelPermissions::refresh() if(!nodep || !objectp)// || attachment_selected) { // ...nothing selected - childSetEnabled("perm_modify",false); - childSetText("perm_modify",LLStringUtil::null); - - childSetEnabled("Creator:",false); - childSetText("Creator Name",LLStringUtil::null); - childSetEnabled("Creator Name",false); - - childSetEnabled("Owner:",false); - childSetText("Owner Name",LLStringUtil::null); - childSetEnabled("Owner Name",false); - - childSetEnabled("Group:",false); - childSetText("Group Name",LLStringUtil::null); - childSetEnabled("Group Name",false); - childSetEnabled("button set group",false); - - childSetText("Object Name",LLStringUtil::null); - childSetEnabled("Object Name",false); - childSetEnabled("Name:",false); - childSetText("Group Name",LLStringUtil::null); - childSetEnabled("Group Name",false); - childSetEnabled("Description:",false); - childSetText("Object Description",LLStringUtil::null); - childSetEnabled("Object Description",false); - - childSetEnabled("Permissions:",false); - - childSetValue("checkbox share with group",FALSE); - childSetEnabled("checkbox share with group",false); - childSetEnabled("button deed",false); - - childSetValue("checkbox allow everyone move",FALSE); - childSetEnabled("checkbox allow everyone move",false); - childSetValue("checkbox allow everyone copy",FALSE); - childSetEnabled("checkbox allow everyone copy",false); - - //Next owner can: - childSetEnabled("Next owner can:",false); - childSetValue("checkbox next owner can modify",FALSE); - childSetEnabled("checkbox next owner can modify",false); - childSetValue("checkbox next owner can copy",FALSE); - childSetEnabled("checkbox next owner can copy",false); - childSetValue("checkbox next owner can transfer",FALSE); - childSetEnabled("checkbox next owner can transfer",false); - - //checkbox for sale - childSetValue("checkbox for sale",FALSE); - childSetEnabled("checkbox for sale",false); - - //checkbox include in search - childSetValue("search_check", FALSE); - childSetEnabled("search_check", false); - - LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); - combo_sale_type->setValue(LLSaleInfo::FS_COPY); - combo_sale_type->setEnabled(FALSE); - - childSetEnabled("Cost",false); - childSetText("Cost",getString("Cost Default")); - childSetText("Edit Cost",LLStringUtil::null); - childSetEnabled("Edit Cost",false); - - childSetEnabled("label click action",false); - LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); - if(ComboClickAction) - { - ComboClickAction->setEnabled(FALSE); - ComboClickAction->clear(); - } - childSetVisible("B:",false); - childSetVisible("O:",false); - childSetVisible("G:",false); - childSetVisible("E:",false); - childSetVisible("N:",false); - childSetVisible("F:",false); - + disableAll(); return; } // figure out a few variables - BOOL is_one_object = (object_count == 1); - + const BOOL is_one_object = (object_count == 1); + // BUG: fails if a root and non-root are both single-selected. BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode() - && LLSelectMgr::getInstance()->selectGetRootsModify()) - || LLSelectMgr::getInstance()->selectGetModify(); + && LLSelectMgr::getInstance()->selectGetRootsModify()) + || LLSelectMgr::getInstance()->selectGetModify(); const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); + S32 string_index = 0; std::string MODIFY_INFO_STRINGS[] = - { - getString("text modify info 1"), - getString("text modify info 2"), - getString("text modify info 3"), - getString("text modify info 4") - }; - if(!is_perm_modify) + { + getString("text modify info 1"), + getString("text modify info 2"), + getString("text modify info 3"), + getString("text modify info 4") + }; + if (!is_perm_modify) { string_index += 2; } - if(!is_one_object) + if (!is_one_object) { ++string_index; } - childSetEnabled("perm_modify",true); - childSetText("perm_modify",MODIFY_INFO_STRINGS[string_index]); + childSetEnabled("perm_modify", TRUE); + childSetText("perm_modify", MODIFY_INFO_STRINGS[string_index]); - childSetEnabled("Permissions:",true); + childSetEnabled("Permissions:", TRUE); // Update creator text field - childSetEnabled("Creator:",true); + childSetEnabled("Creator:", TRUE); BOOL creators_identical; std::string creator_name; creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, - creator_name); + creator_name); - childSetText("Creator Name",creator_name); - childSetEnabled("Creator Name",TRUE); + childSetText("Creator Name", creator_name); + childSetEnabled("Creator Name", TRUE); // Update owner text field - childSetEnabled("Owner:",true); + childSetEnabled("Owner:", TRUE); - BOOL owners_identical; std::string owner_name; - owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name); - -// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl; - + const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name); if (mOwnerID.isNull()) { - if(LLSelectMgr::getInstance()->selectIsGroupOwned()) + if (LLSelectMgr::getInstance()->selectIsGroupOwned()) { // Group owned already displayed by selectGetOwner } @@ -359,61 +360,53 @@ void LLPanelPermissions::refresh() if (!mLastOwnerID.isNull() && !last_owner_name.empty()) { owner_name.append(", last "); - owner_name.append( last_owner_name ); + owner_name.append(last_owner_name); } } } - - childSetText("Owner Name",owner_name); - childSetEnabled("Owner Name",TRUE); + childSetText("Owner Name", owner_name); + childSetEnabled("Owner Name", TRUE); // update group text field - childSetEnabled("Group:",true); - childSetText("Group Name",LLStringUtil::null); + childSetEnabled("Group:", TRUE); + childSetText("Group Name", LLStringUtil::null); LLUUID group_id; BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id); if (groups_identical) { - if(mLabelGroupName) + if (mLabelGroupName) { - mLabelGroupName->setNameID(group_id, TRUE); + mLabelGroupName->setNameID(group_id,TRUE); mLabelGroupName->setEnabled(TRUE); } } else { - if(mLabelGroupName) + if (mLabelGroupName) { mLabelGroupName->setNameID(LLUUID::null, TRUE); - mLabelGroupName->refresh(LLUUID::null, LLStringUtil::null, LLStringUtil::null, TRUE); + mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE); mLabelGroupName->setEnabled(FALSE); } } - childSetEnabled("button set group",owners_identical && (mOwnerID == gAgent.getID())); - - // figure out the contents of the name, description, & category - BOOL edit_name_desc = FALSE; - if(is_one_object && objectp->permModify()) - { - edit_name_desc = TRUE; - } + childSetEnabled("button set group", owners_identical && (mOwnerID == gAgent.getID())); - childSetEnabled("Name:",true); + childSetEnabled("Name:", TRUE); LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name"); - childSetEnabled("Description:",true); - LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description"); + childSetEnabled("Description:", TRUE); + LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description"); - if(is_one_object) + if (is_one_object) { - if(keyboard_focus_view != LineEditorObjectName) + if (keyboard_focus_view != LineEditorObjectName) { childSetText("Object Name",nodep->mName); } - if(LineEditorObjectDesc) + if (LineEditorObjectDesc) { - if(keyboard_focus_view != LineEditorObjectDesc) + if (keyboard_focus_view != LineEditorObjectDesc) { LineEditorObjectDesc->setText(nodep->mDescription); } @@ -421,19 +414,25 @@ void LLPanelPermissions::refresh() } else { - childSetText("Object Name",LLStringUtil::null); + childSetText("Object Name", LLStringUtil::null); LineEditorObjectDesc->setText(LLStringUtil::null); } - if(edit_name_desc) + // figure out the contents of the name, description, & category + BOOL edit_name_desc = FALSE; + if (is_one_object && objectp->permModify()) { - childSetEnabled("Object Name",true); - childSetEnabled("Object Description",true); + edit_name_desc = TRUE; + } + if (edit_name_desc) + { + childSetEnabled("Object Name", TRUE); + childSetEnabled("Object Description", TRUE); } else { - childSetEnabled("Object Name",false); - childSetEnabled("Object Description",false); + childSetEnabled("Object Name", FALSE); + childSetEnabled("Object Description", FALSE); } S32 total_sale_price = 0; @@ -442,10 +441,10 @@ void LLPanelPermissions::refresh() BOOL is_sale_price_mixed = FALSE; U32 num_for_sale = FALSE; LLSelectMgr::getInstance()->selectGetAggregateSaleInfo(num_for_sale, - is_for_sale_mixed, - is_sale_price_mixed, - total_sale_price, - individual_sale_price); + is_for_sale_mixed, + is_sale_price_mixed, + total_sale_price, + individual_sale_price); const BOOL self_owned = (gAgent.getID() == mOwnerID); const BOOL group_owned = LLSelectMgr::getInstance()->selectIsGroupOwned() ; @@ -453,35 +452,35 @@ void LLPanelPermissions::refresh() const BOOL can_transfer = LLSelectMgr::getInstance()->selectGetRootsTransfer(); const BOOL can_copy = LLSelectMgr::getInstance()->selectGetRootsCopy(); - if(!owners_identical) + if (!owners_identical) { - childSetEnabled("Cost",false); - childSetText("Edit Cost",LLStringUtil::null); - childSetEnabled("Edit Cost",false); + childSetEnabled("Cost", FALSE); + childSetText("Edit Cost", LLStringUtil::null); + childSetEnabled("Edit Cost", FALSE); } // You own these objects. - else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) + else if (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) { // If there are multiple items for sale then set text to PRICE PER UNIT. if (num_for_sale > 1) { - childSetText("Cost",getString("Cost Per Unit")); + childSetText("Cost", getString("Cost Per Unit")); } else { - childSetText("Cost",getString("Cost Default")); + childSetText("Cost", getString("Cost Default")); } LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); - if(!edit_price->hasFocus()) + if (!edit_price->hasFocus()) { // If the sale price is mixed then set the cost to MIXED, otherwise // set to the actual cost. - if (num_for_sale > 0 && is_for_sale_mixed) + if ((num_for_sale > 0) && is_for_sale_mixed) { edit_price->setTentative(TRUE); } - else if (num_for_sale > 0 && is_sale_price_mixed) + else if ((num_for_sale > 0) && is_sale_price_mixed) { edit_price->setTentative(TRUE); } @@ -492,303 +491,279 @@ void LLPanelPermissions::refresh() } // The edit fields are only enabled if you can sell this object // and the sale price is not mixed. - bool enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : false; - childSetEnabled("Cost",enable_edit); - childSetEnabled("Edit Cost",enable_edit); + BOOL enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : FALSE; + childSetEnabled("Cost", enable_edit); + childSetEnabled("Edit Cost", enable_edit); } // Someone, not you, owns these objects. - else if(!public_owned) + else if (!public_owned) { - childSetEnabled("Cost",false); - childSetEnabled("Edit Cost",false); + childSetEnabled("Cost", FALSE); + childSetEnabled("Edit Cost", FALSE); // Don't show a price if none of the items are for sale. if (num_for_sale) - childSetText("Edit Cost",llformat("%d",total_sale_price)); + childSetText("Edit Cost", llformat("%d",total_sale_price)); else - childSetText("Edit Cost",LLStringUtil::null); + childSetText("Edit Cost", LLStringUtil::null); // If multiple items are for sale, set text to TOTAL PRICE. if (num_for_sale > 1) - childSetText("Cost",getString("Cost Total")); + childSetText("Cost", getString("Cost Total")); else - childSetText("Cost",getString("Cost Default")); + childSetText("Cost", getString("Cost Default")); } // This is a public object. else { - childSetEnabled("Cost",false); - childSetText("Cost",getString("Cost Default")); + childSetEnabled("Cost", FALSE); + childSetText("Cost", getString("Cost Default")); - childSetText("Edit Cost",LLStringUtil::null); - childSetEnabled("Edit Cost",false); + childSetText("Edit Cost", LLStringUtil::null); + childSetEnabled("Edit Cost", FALSE); } // Enable and disable the permissions checkboxes // based on who owns the object. // TODO: Creator permissions - BOOL valid_base_perms = FALSE; - BOOL valid_owner_perms = FALSE; - BOOL valid_group_perms = FALSE; - BOOL valid_everyone_perms = FALSE; - BOOL valid_next_perms = FALSE; - - U32 base_mask_on; - U32 base_mask_off; - U32 owner_mask_on; - U32 owner_mask_off; - U32 group_mask_on; - U32 group_mask_off; - U32 everyone_mask_on; - U32 everyone_mask_off; - U32 next_owner_mask_on = 0; - U32 next_owner_mask_off = 0; - - valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE, - &base_mask_on, - &base_mask_off); - - valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, - &owner_mask_on, - &owner_mask_off); - - valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP, - &group_mask_on, - &group_mask_off); + U32 base_mask_on = 0; + U32 base_mask_off = 0; + U32 owner_mask_off = 0; + U32 owner_mask_on = 0; + U32 group_mask_on = 0; + U32 group_mask_off = 0; + U32 everyone_mask_on = 0; + U32 everyone_mask_off = 0; + U32 next_owner_mask_on = 0; + U32 next_owner_mask_off = 0; + + BOOL valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE, + &base_mask_on, + &base_mask_off); + //BOOL valid_owner_perms =// + LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, + &owner_mask_on, + &owner_mask_off); + BOOL valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP, + &group_mask_on, + &group_mask_off); - valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE, - &everyone_mask_on, - &everyone_mask_off); + BOOL valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE, + &everyone_mask_on, + &everyone_mask_off); - valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER, - &next_owner_mask_on, - &next_owner_mask_off); + BOOL valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER, + &next_owner_mask_on, + &next_owner_mask_off); - if( gSavedSettings.getBOOL("DebugPermissions") ) + if (gSavedSettings.getBOOL("DebugPermissions") ) { - std::string perm_string; if (valid_base_perms) { - perm_string = "B: "; - perm_string += mask_to_string(base_mask_on); - childSetText("B:",perm_string); - childSetVisible("B:",true); + childSetText("B:", "B: " + mask_to_string(base_mask_on)); + childSetVisible("B:", TRUE); - perm_string = "O: "; - perm_string += mask_to_string(owner_mask_on); - childSetText("O:",perm_string); - childSetVisible("O:",true); + childSetText("O:", "O: " + mask_to_string(owner_mask_on)); + childSetVisible("O:", TRUE); - perm_string = "G: "; - perm_string += mask_to_string(group_mask_on); - childSetText("G:",perm_string); - childSetVisible("G:",true); + childSetText("G:", "G: " + mask_to_string(group_mask_on)); + childSetVisible("G:", TRUE); - perm_string = "E: "; - perm_string += mask_to_string(everyone_mask_on); - childSetText("E:",perm_string); - childSetVisible("E:",true); + childSetText("E:", "E: " + mask_to_string(everyone_mask_on)); + childSetVisible("E:", TRUE); - perm_string = "N: "; - perm_string += mask_to_string(next_owner_mask_on); - childSetText("N:",perm_string); - childSetVisible("N:",true); + childSetText("N:", "N: " + mask_to_string(next_owner_mask_on)); + childSetVisible("N:", TRUE); } - perm_string = "F: "; + U32 flag_mask = 0x0; - if (objectp->permMove()) - flag_mask |= PERM_MOVE; - if (objectp->permModify()) - flag_mask |= PERM_MODIFY; - if (objectp->permCopy()) - flag_mask |= PERM_COPY; - if (objectp->permTransfer()) - flag_mask |= PERM_TRANSFER; - perm_string += mask_to_string(flag_mask); - childSetText("F:",perm_string); - childSetVisible("F:",true); + if (objectp->permMove()) flag_mask |= PERM_MOVE; + if (objectp->permModify()) flag_mask |= PERM_MODIFY; + if (objectp->permCopy()) flag_mask |= PERM_COPY; + if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER; + + childSetText("F:", "F:" + mask_to_string(flag_mask)); + childSetVisible("F:", TRUE); } else { - childSetVisible("B:",false); - childSetVisible("O:",false); - childSetVisible("G:",false); - childSetVisible("E:",false); - childSetVisible("N:",false); - childSetVisible("F:",false); + childSetVisible("B:", FALSE); + childSetVisible("O:", FALSE); + childSetVisible("G:", FALSE); + childSetVisible("E:", FALSE); + childSetVisible("N:", FALSE); + childSetVisible("F:", FALSE); } - bool has_change_perm_ability = false; - bool has_change_sale_ability = false; + BOOL has_change_perm_ability = FALSE; + BOOL has_change_sale_ability = FALSE; - if(valid_base_perms - && (self_owned - || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE)))) + if (valid_base_perms && + (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE)))) { - has_change_perm_ability = true; + has_change_perm_ability = TRUE; } - if(valid_base_perms - && (self_owned - || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE)))) + if (valid_base_perms && + (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE)))) { - has_change_sale_ability = true; + has_change_sale_ability = TRUE; } if (!has_change_perm_ability && !has_change_sale_ability && !root_selected) { // ...must select root to choose permissions - childSetValue("perm_modify", getString("text modify warning")); + childSetValue("perm_modify", getString("text modify warning")); } if (has_change_perm_ability) { - childSetEnabled("checkbox share with group",true); - childSetEnabled("checkbox allow everyone move",owner_mask_on & PERM_MOVE); - childSetEnabled("checkbox allow everyone copy",owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER); + childSetEnabled("checkbox share with group", TRUE); + childSetEnabled("checkbox allow everyone move", owner_mask_on & PERM_MOVE); + childSetEnabled("checkbox allow everyone copy", owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER); } else { - childSetEnabled("checkbox share with group", FALSE); - childSetEnabled("checkbox allow everyone move", FALSE); - childSetEnabled("checkbox allow everyone copy", FALSE); + childSetEnabled("checkbox share with group", FALSE); + childSetEnabled("checkbox allow everyone move", FALSE); + childSetEnabled("checkbox allow everyone copy", FALSE); } if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER)) { - childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale)); + childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale)); // Set the checkbox to tentative if the prices of each object selected // are not the same. - childSetTentative("checkbox for sale", is_for_sale_mixed); - childSetEnabled("sale type",num_for_sale && can_transfer && !is_sale_price_mixed); + childSetTentative("checkbox for sale", is_for_sale_mixed); + childSetEnabled("sale type", num_for_sale && can_transfer && !is_sale_price_mixed); - childSetEnabled("Next owner can:", TRUE); - childSetEnabled("checkbox next owner can modify",base_mask_on & PERM_MODIFY); - childSetEnabled("checkbox next owner can copy",base_mask_on & PERM_COPY); - childSetEnabled("checkbox next owner can transfer",next_owner_mask_on & PERM_COPY); + childSetEnabled("Next owner can:", TRUE); + childSetEnabled("checkbox next owner can modify", base_mask_on & PERM_MODIFY); + childSetEnabled("checkbox next owner can copy", base_mask_on & PERM_COPY); + childSetEnabled("checkbox next owner can transfer", next_owner_mask_on & PERM_COPY); } else { - childSetEnabled("checkbox for sale",FALSE); - childSetEnabled("sale type",FALSE); + childSetEnabled("checkbox for sale", FALSE); + childSetEnabled("sale type", FALSE); - childSetEnabled("Next owner can:",FALSE); - childSetEnabled("checkbox next owner can modify",FALSE); - childSetEnabled("checkbox next owner can copy",FALSE); - childSetEnabled("checkbox next owner can transfer",FALSE); + childSetEnabled("Next owner can:", FALSE); + childSetEnabled("checkbox next owner can modify", FALSE); + childSetEnabled("checkbox next owner can copy", FALSE); + childSetEnabled("checkbox next owner can transfer", FALSE); } - if(valid_group_perms) + if (valid_group_perms) { - if((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE)) + if ((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE)) { - childSetValue("checkbox share with group",TRUE); - childSetTentative("checkbox share with group",FALSE); - childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); + childSetValue("checkbox share with group", TRUE); + childSetTentative("checkbox share with group", FALSE); + childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); } - else if((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE)) + else if ((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE)) { - childSetValue("checkbox share with group",FALSE); - childSetTentative("checkbox share with group",false); - childSetEnabled("button deed",false); + childSetValue("checkbox share with group", FALSE); + childSetTentative("checkbox share with group", FALSE); + childSetEnabled("button deed", FALSE); } else { - childSetValue("checkbox share with group",TRUE); - childSetTentative("checkbox share with group",true); - childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); + childSetValue("checkbox share with group", TRUE); + childSetTentative("checkbox share with group", TRUE); + childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); } } - if(valid_everyone_perms) + if (valid_everyone_perms) { // Move - if(everyone_mask_on & PERM_MOVE) + if (everyone_mask_on & PERM_MOVE) { - childSetValue("checkbox allow everyone move",TRUE); - childSetTentative("checkbox allow everyone move",false); + childSetValue("checkbox allow everyone move", TRUE); + childSetTentative("checkbox allow everyone move", FALSE); } - else if(everyone_mask_off & PERM_MOVE) + else if (everyone_mask_off & PERM_MOVE) { - childSetValue("checkbox allow everyone move",FALSE); - childSetTentative("checkbox allow everyone move",false); + childSetValue("checkbox allow everyone move", FALSE); + childSetTentative("checkbox allow everyone move", FALSE); } else { - childSetValue("checkbox allow everyone move",TRUE); - childSetTentative("checkbox allow everyone move",true); + childSetValue("checkbox allow everyone move", TRUE); + childSetTentative("checkbox allow everyone move", TRUE); } // Copy == everyone can't copy - if(everyone_mask_on & PERM_COPY) + if (everyone_mask_on & PERM_COPY) { - childSetValue("checkbox allow everyone copy",TRUE); - childSetTentative("checkbox allow everyone copy",!can_copy || !can_transfer); + childSetValue("checkbox allow everyone copy", TRUE); + childSetTentative("checkbox allow everyone copy", !can_copy || !can_transfer); } - else if(everyone_mask_off & PERM_COPY) + else if (everyone_mask_off & PERM_COPY) { - childSetValue("checkbox allow everyone copy",FALSE); - childSetTentative("checkbox allow everyone copy",false); + childSetValue("checkbox allow everyone copy", FALSE); + childSetTentative("checkbox allow everyone copy", FALSE); } else { - childSetValue("checkbox allow everyone copy",TRUE); - childSetTentative("checkbox allow everyone copy",true); + childSetValue("checkbox allow everyone copy", TRUE); + childSetTentative("checkbox allow everyone copy", TRUE); } } - if(valid_next_perms) + if (valid_next_perms) { // Modify == next owner canot modify - if(next_owner_mask_on & PERM_MODIFY) + if (next_owner_mask_on & PERM_MODIFY) { - childSetValue("checkbox next owner can modify",TRUE); - childSetTentative("checkbox next owner can modify",false); + childSetValue("checkbox next owner can modify", TRUE); + childSetTentative("checkbox next owner can modify", FALSE); } - else if(next_owner_mask_off & PERM_MODIFY) + else if (next_owner_mask_off & PERM_MODIFY) { - childSetValue("checkbox next owner can modify",FALSE); - childSetTentative("checkbox next owner can modify",false); + childSetValue("checkbox next owner can modify", FALSE); + childSetTentative("checkbox next owner can modify", FALSE); } else { - childSetValue("checkbox next owner can modify",TRUE); - childSetTentative("checkbox next owner can modify",true); + childSetValue("checkbox next owner can modify", TRUE); + childSetTentative("checkbox next owner can modify", TRUE); } // Copy == next owner cannot copy - if(next_owner_mask_on & PERM_COPY) + if (next_owner_mask_on & PERM_COPY) { - childSetValue("checkbox next owner can copy",TRUE); - childSetTentative("checkbox next owner can copy",!can_copy); + childSetValue("checkbox next owner can copy", TRUE); + childSetTentative("checkbox next owner can copy", !can_copy); } - else if(next_owner_mask_off & PERM_COPY) + else if (next_owner_mask_off & PERM_COPY) { - childSetValue("checkbox next owner can copy",FALSE); - childSetTentative("checkbox next owner can copy",FALSE); + childSetValue("checkbox next owner can copy", FALSE); + childSetTentative("checkbox next owner can copy", FALSE); } else { - childSetValue("checkbox next owner can copy",TRUE); - childSetTentative("checkbox next owner can copy",TRUE); + childSetValue("checkbox next owner can copy", TRUE); + childSetTentative("checkbox next owner can copy", TRUE); } // Transfer == next owner cannot transfer - if(next_owner_mask_on & PERM_TRANSFER) + if (next_owner_mask_on & PERM_TRANSFER) { - childSetValue("checkbox next owner can transfer",TRUE); - childSetTentative("checkbox next owner can transfer",!can_transfer); + childSetValue("checkbox next owner can transfer", TRUE); + childSetTentative("checkbox next owner can transfer", !can_transfer); } - else if(next_owner_mask_off & PERM_TRANSFER) + else if (next_owner_mask_off & PERM_TRANSFER) { - childSetValue("checkbox next owner can transfer",FALSE); - childSetTentative("checkbox next owner can transfer",FALSE); + childSetValue("checkbox next owner can transfer", FALSE); + childSetTentative("checkbox next owner can transfer", FALSE); } else { - childSetValue("checkbox next owner can transfer",TRUE); - childSetTentative("checkbox next owner can transfer",TRUE); + childSetValue("checkbox next owner can transfer", TRUE); + childSetTentative("checkbox next owner can transfer", TRUE); } } @@ -800,48 +775,51 @@ void LLPanelPermissions::refresh() LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); if (valid_sale_info) { - combo_sale_type->setValue(sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type); - combo_sale_type->setTentative(FALSE); // unfortunately this doesn't do anything at the moment. + combo_sale_type->setValue( sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type); + combo_sale_type->setTentative( FALSE); // unfortunately this doesn't do anything at the moment. } else { // default option is sell copy, determined to be safest - combo_sale_type->setValue(LLSaleInfo::FS_COPY); - combo_sale_type->setTentative(TRUE); // unfortunately this doesn't do anything at the moment. + combo_sale_type->setValue( LLSaleInfo::FS_COPY); + combo_sale_type->setTentative( TRUE); // unfortunately this doesn't do anything at the moment. } - childSetValue("checkbox for sale", num_for_sale != 0); + childSetValue("checkbox for sale", (num_for_sale != 0)); // HACK: There are some old objects in world that are set for sale, // but are no-transfer. We need to let users turn for-sale off, but only // if for-sale is set. bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY); - if (num_for_sale && has_change_sale_ability && cannot_actually_sell) + if (cannot_actually_sell) { - childSetEnabled("checkbox for sale", true); + if (num_for_sale && has_change_sale_ability) + { + childSetEnabled("checkbox for sale", true); + } } - + // Check search status of objects - BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); + const BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); bool include_in_search; - bool all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search); - childSetEnabled("search_check", has_change_sale_ability && all_volume); - childSetValue("search_check", include_in_search); - childSetTentative("search_check", ! all_include_in_search); + const BOOL all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search); + childSetEnabled("search_check", has_change_sale_ability && all_volume); + childSetValue("search_check", include_in_search); + childSetTentative("search_check", !all_include_in_search); // Click action (touch, sit, buy) U8 click_action = 0; if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action)) { - LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); - if(ComboClickAction) + LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction"); + if(combo_click_action) { - std::string combo_value = click_action_to_string_value(click_action); - ComboClickAction->setValue(LLSD(combo_value)); + const std::string combo_value = click_action_to_string_value(click_action); + combo_click_action->setValue(LLSD(combo_value)); } } - childSetEnabled("label click action",is_perm_modify && all_volume); - childSetEnabled("clickaction",is_perm_modify && all_volume); + childSetEnabled("label click action", is_perm_modify && all_volume); + childSetEnabled("clickaction", is_perm_modify && all_volume); } diff --git a/indra/newview/llpanelpermissions.h b/indra/newview/llpanelpermissions.h index 805a4dbe97dccda10b0fcf389baea2d3994e740d..38d3be532f9be542bb1054d7e509d2cd165591c3 100644 --- a/indra/newview/llpanelpermissions.h +++ b/indra/newview/llpanelpermissions.h @@ -84,6 +84,9 @@ class LLPanelPermissions : public LLPanel static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*); protected: + void disableAll(); + +private: LLNameBox* mLabelGroupName; // group name LLUUID mCreatorID; diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 59a68bc12d04bb40e8ffa3176e823cb29e983051..7d21867efcbfaab673ba37797b091677ad3bb760 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -37,6 +37,7 @@ #include "llagent.h" #include "llagentpicksinfo.h" #include "llavatarconstants.h" +#include "llcommandhandler.h" #include "llflatlistview.h" #include "llfloaterreg.h" #include "llfloaterworldmap.h" @@ -55,6 +56,8 @@ #include "llpanelprofile.h" #include "llpanelpick.h" #include "llpanelclassified.h" +#include "llpanelprofileview.h" +#include "llsidetray.h" static const std::string XML_BTN_NEW = "new_btn"; static const std::string XML_BTN_DELETE = "trash_btn"; @@ -72,6 +75,83 @@ static const std::string CLASSIFIED_NAME("classified_name"); static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks"); +class LLClassifiedHandler : + public LLCommandHandler, + public LLAvatarPropertiesObserver +{ +public: + // throttle calls from untrusted browsers + LLClassifiedHandler() : LLCommandHandler("classified", UNTRUSTED_THROTTLE) {} + + std::set<LLUUID> mClassifiedIds; + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + if (params.size() < 2) + { + return false; + } + + // get the ID for the classified + LLUUID classified_id; + if (!classified_id.set(params[0], FALSE)) + { + return false; + } + + // show the classified in the side tray. + // need to ask the server for more info first though... + const std::string verb = params[1].asString(); + if (verb == "about") + { + mClassifiedIds.insert(classified_id); + LLAvatarPropertiesProcessor::getInstance()->addObserver(LLUUID(), this); + LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(classified_id); + return true; + } + + return false; + } + + /*virtual*/ void processProperties(void* data, EAvatarProcessorType type) + { + if (APT_CLASSIFIED_INFO != type) + { + return; + } + + // is this the classified that we asked for? + LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data); + if (!c_info || mClassifiedIds.find(c_info->classified_id) == mClassifiedIds.end()) + { + return; + } + + // open the people profile page for the classified's owner + LLSD params; + params["id"] = c_info->creator_id; + params["classified"] = c_info->classified_id; + params["open_tab_name"] = "panel_profile"; + LLPanelProfileView *profile = dynamic_cast<LLPanelProfileView*>(LLSideTray::getInstance()->showPanel("panel_profile_view", params)); + + // then open the classified panel on this user's profile panel + if (profile) + { + LLPanelPicks* panel_picks = profile->getChild<LLPanelPicks>("panel_picks"); + if (panel_picks) + { + panel_picks->openClassifiedInfo(c_info); + } + } + + // remove our observer now that we're done + mClassifiedIds.erase(c_info->classified_id); + LLAvatarPropertiesProcessor::getInstance()->removeObserver(LLUUID(), this); + } + +}; +LLClassifiedHandler gClassifiedHandler; + ////////////////////////////////////////////////////////////////////////// /** @@ -624,6 +704,25 @@ void LLPanelPicks::openClassifiedInfo() getProfilePanel()->openPanel(mPanelClassifiedInfo, params); } +void LLPanelPicks::openClassifiedInfo(LLAvatarClassifiedInfo *c_info) +{ + if (! c_info) + { + return; + } + + createClassifiedInfoPanel(); + + LLSD params; + params["classified_id"] = c_info->classified_id; + params["avatar_id"] = c_info->creator_id; + params["snapshot_id"] = c_info->snapshot_id; + params["name"] = c_info->name; + params["desc"] = c_info->description; + + getProfilePanel()->openPanel(mPanelClassifiedInfo, params); +} + void LLPanelPicks::showAccordion(const std::string& name, bool show) { LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name); diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 21794d56b2fe06ee952a33da2c3912d2cde5d132..893a0c53a3b1bcf0fc9ceb4a034a229089e8075f 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -86,6 +86,9 @@ class LLPanelPicks // parent panels failed to work (picks related code was in my profile panel) void setProfilePanel(LLPanelProfile* profile_panel); + // display the info panel for the given classified + void openClassifiedInfo(LLAvatarClassifiedInfo *c_info); + protected: /*virtual*/void updateButtons(); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index f7f3c5830d5691537d06aadddf9c6712b0f33986..685104a8b1f10ae2257641e235c8bef6845760be 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -54,6 +54,7 @@ #include "llavatarpropertiesprocessor.h" #include "llfloaterworldmap.h" #include "llinventorybridge.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" @@ -62,6 +63,7 @@ #include "llpanelpick.h" #include "llpanelplaceprofile.h" #include "llpanelteleporthistory.h" +#include "llremoteparcelrequest.h" #include "llteleporthistorystorage.h" #include "lltoggleablemenu.h" #include "llviewerinventory.h" @@ -85,8 +87,10 @@ static void onSLURLBuilt(std::string& slurl); class LLPlacesParcelObserver : public LLParcelObserver { public: - LLPlacesParcelObserver(LLPanelPlaces* places_panel) - : mPlaces(places_panel) {} + LLPlacesParcelObserver(LLPanelPlaces* places_panel) : + LLParcelObserver(), + mPlaces(places_panel) + {} /*virtual*/ void changed() { @@ -101,8 +105,10 @@ class LLPlacesParcelObserver : public LLParcelObserver class LLPlacesInventoryObserver : public LLInventoryObserver { public: - LLPlacesInventoryObserver(LLPanelPlaces* places_panel) - : mPlaces(places_panel) {} + LLPlacesInventoryObserver(LLPanelPlaces* places_panel) : + LLInventoryObserver(), + mPlaces(places_panel) + {} /*virtual*/ void changed(U32 mask) { @@ -114,6 +120,59 @@ class LLPlacesInventoryObserver : public LLInventoryObserver LLPanelPlaces* mPlaces; }; +class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver +{ +public: + LLPlacesRemoteParcelInfoObserver(LLPanelPlaces* places_panel) : + LLRemoteParcelInfoObserver(), + mPlaces(places_panel) + {} + + ~LLPlacesRemoteParcelInfoObserver() + { + // remove any in-flight observers + std::set<LLUUID>::iterator it; + for (it = mParcelIDs.begin(); it != mParcelIDs.end(); ++it) + { + const LLUUID &id = *it; + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(id, this); + } + mParcelIDs.clear(); + } + + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data) + { + if (mPlaces) + { + mPlaces->changedGlobalPos(LLVector3d(parcel_data.global_x, + parcel_data.global_y, + parcel_data.global_z)); + } + + mParcelIDs.erase(parcel_data.parcel_id); + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_data.parcel_id, this); + } + /*virtual*/ void setParcelID(const LLUUID& parcel_id) + { + if (!parcel_id.isNull()) + { + mParcelIDs.insert(parcel_id); + LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); + LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); + } + } + /*virtual*/ void setErrorStatus(U32 status, const std::string& reason) + { + llerrs << "Can't complete remote parcel request. Http Status: " + << status << ". Reason : " << reason << llendl; + } + +private: + std::set<LLUUID> mParcelIDs; + LLPanelPlaces* mPlaces; +}; + + static LLRegisterPanelClassWrapper<LLPanelPlaces> t_places("panel_places"); LLPanelPlaces::LLPanelPlaces() @@ -131,6 +190,7 @@ LLPanelPlaces::LLPanelPlaces() { mParcelObserver = new LLPlacesParcelObserver(this); mInventoryObserver = new LLPlacesInventoryObserver(this); + mRemoteParcelObserver = new LLPlacesRemoteParcelInfoObserver(this); gInventory.addObserver(mInventoryObserver); @@ -149,6 +209,7 @@ LLPanelPlaces::~LLPanelPlaces() delete mInventoryObserver; delete mParcelObserver; + delete mRemoteParcelObserver; } BOOL LLPanelPlaces::postBuild() @@ -239,7 +300,6 @@ void LLPanelPlaces::onOpen(const LLSD& key) mItem = NULL; isLandmarkEditModeOn = false; togglePlaceInfoPanel(TRUE); - updateVerbs(); if (mPlaceInfoType == AGENT_INFO_TYPE) { @@ -278,12 +338,24 @@ void LLPanelPlaces::onOpen(const LLSD& key) } else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); + if (key.has("id")) + { + LLUUID parcel_id = key["id"].asUUID(); + mPlaceProfile->setParcelID(parcel_id); + + // query the server to get the global 3D position of this + // parcel - we need this for teleport/mapping functions. + mRemoteParcelObserver->setParcelID(parcel_id); + } + else + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) { @@ -298,6 +370,8 @@ void LLPanelPlaces::onOpen(const LLSD& key) mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } + updateVerbs(); + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); if (!parcel_mgr) return; @@ -829,6 +903,12 @@ void LLPanelPlaces::changedInventory(U32 mask) gInventory.removeObserver(mInventoryObserver); } +void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos) +{ + mPosGlobal = global_pos; + updateVerbs(); +} + void LLPanelPlaces::updateVerbs() { bool is_place_info_visible; @@ -845,6 +925,7 @@ void LLPanelPlaces::updateVerbs() bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE; + bool have_3d_pos = ! mPosGlobal.isExactlyZero(); mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); @@ -854,6 +935,7 @@ void LLPanelPlaces::updateVerbs() mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); + mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible); if (is_place_info_visible) @@ -862,12 +944,12 @@ void LLPanelPlaces::updateVerbs() { // We don't need to teleport to the current location // so check if the location is not within the current parcel. - mTeleportBtn->setEnabled(!mPosGlobal.isExactlyZero() && + mTeleportBtn->setEnabled(have_3d_pos && !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal)); } else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { - mTeleportBtn->setEnabled(TRUE); + mTeleportBtn->setEnabled(have_3d_pos); } } else diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 5f9aed63571cf4bcb3e41a06551859a73f69ec39..5ee87049926cd55545d6538c9ebf44e37621b431 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -47,6 +47,7 @@ class LLPanelPlacesTab; class LLParcelSelection; class LLPlacesInventoryObserver; class LLPlacesParcelObserver; +class LLRemoteParcelInfoObserver; class LLTabContainer; class LLToggleableMenu; @@ -65,6 +66,8 @@ class LLPanelPlaces : public LLPanel void changedParcelSelection(); // Called on agent inventory change to find out when inventory gets usable. void changedInventory(U32 mask); + // Called when we receive the global 3D position of a parcel. + void changedGlobalPos(const LLVector3d &global_pos); void setItem(LLInventoryItem* item); @@ -112,6 +115,7 @@ class LLPanelPlaces : public LLPanel LLPlacesInventoryObserver* mInventoryObserver; LLPlacesParcelObserver* mParcelObserver; + LLRemoteParcelInfoObserver* mRemoteParcelObserver; // Pointer to a landmark item or to a linked landmark LLPointer<LLInventoryItem> mItem; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index aa2b7d4554b0f61b827552ff87e0d5d2acc016d0..3fe51106e4b34a56af0709feb45186ecf6d87191 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -150,7 +150,7 @@ BOOL LLPanelPrimMediaControls::postBuild() mSkipFwdCtrl = getChild<LLUICtrl>("skip_forward"); mSkipBackCtrl = getChild<LLUICtrl>("skip_back"); mVolumeCtrl = getChild<LLUICtrl>("media_volume"); - mVolumeBtn = getChild<LLButton>("media_volume_button"); + mMuteBtn = getChild<LLButton>("media_mute_button"); mVolumeUpCtrl = getChild<LLUICtrl>("volume_up"); mVolumeDownCtrl = getChild<LLUICtrl>("volume_down"); mVolumeSliderCtrl = getChild<LLSliderCtrl>("volume_slider"); @@ -200,7 +200,7 @@ BOOL LLPanelPrimMediaControls::postBuild() mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this); mScrollDownCtrl->setMouseUpCallback(onScrollStop, this); } - + mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this )); mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout"); mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime"); @@ -215,11 +215,15 @@ void LLPanelPrimMediaControls::setMediaFace(LLPointer<LLViewerObject> objectp, S { if (media_impl.notNull() && objectp.notNull()) { + LLUUID prev_id = mTargetImplID; mTargetImplID = media_impl->getMediaTextureID(); mTargetObjectID = objectp->getID(); mTargetObjectFace = face; mTargetObjectNormal = pick_normal; mClearFaceOnFade = false; + + if (prev_id != mTargetImplID) + mVolumeSliderCtrl->setValue(media_impl->getVolume()); } else { @@ -308,13 +312,12 @@ void LLPanelPrimMediaControls::updateShape() enabled = dynamic_cast<LLVOVolume*>(objectp)->hasMediaPermission(media_data, LLVOVolume::MEDIA_PERM_CONTROL); mini_controls = (LLMediaEntry::MINI == media_data->getControls()); } - const bool is_hud = objectp->isHUDAttachment(); // // Set the state of the buttons // - + // XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in, // and that only the proper controls get made visible/enabled according to that mode. mBackCtrl->setVisible(has_focus); @@ -343,7 +346,7 @@ void LLPanelPrimMediaControls::updateShape() mStopCtrl->setEnabled(has_focus && can_navigate); mHomeCtrl->setEnabled(has_focus && can_navigate); LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE; - + if(media_plugin && media_plugin->pluginSupportsMediaTime()) { mReloadCtrl->setEnabled(false); @@ -360,14 +363,14 @@ void LLPanelPrimMediaControls::updateShape() mSkipFwdCtrl->setEnabled(has_focus && !mini_controls); mSkipBackCtrl->setVisible(has_focus && !mini_controls); mSkipBackCtrl->setEnabled(has_focus && !mini_controls); - + mVolumeCtrl->setVisible(has_focus); mVolumeUpCtrl->setVisible(has_focus); mVolumeDownCtrl->setVisible(has_focus); mVolumeCtrl->setEnabled(has_focus); mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible); mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible); - + mWhitelistIcon->setVisible(false); mSecureLockIcon->setVisible(false); if (mMediaPanelScroll) @@ -378,7 +381,7 @@ void LLPanelPrimMediaControls::updateShape() mScrollRightCtrl->setVisible(false); mScrollDownCtrl->setVisible(false); } - + F32 volume = media_impl->getVolume(); // movie's url changed if(mCurrentURL!=mPreviousURL) @@ -386,7 +389,7 @@ void LLPanelPrimMediaControls::updateShape() mMovieDuration = media_plugin->getDuration(); mPreviousURL = mCurrentURL; } - + if(mMovieDuration == 0) { mMovieDuration = media_plugin->getDuration(); @@ -394,7 +397,7 @@ void LLPanelPrimMediaControls::updateShape() mMediaPlaySliderCtrl->setEnabled(false); } // TODO: What if it's not fully loaded - + if(mUpdateSlider && mMovieDuration!= 0) { F64 current_time = media_plugin->getCurrentTime(); @@ -402,29 +405,27 @@ void LLPanelPrimMediaControls::updateShape() mMediaPlaySliderCtrl->setValue(percent); mMediaPlaySliderCtrl->setEnabled(true); } - + // video vloume if(volume <= 0.0) { mVolumeUpCtrl->setEnabled(TRUE); mVolumeDownCtrl->setEnabled(FALSE); - media_impl->setVolume(0.0); - mVolumeBtn->setToggleState(true); + mMuteBtn->setToggleState(true); } else if (volume >= 1.0) { mVolumeUpCtrl->setEnabled(FALSE); mVolumeDownCtrl->setEnabled(TRUE); - media_impl->setVolume(1.0); - mVolumeBtn->setToggleState(false); + mMuteBtn->setToggleState(false); } else { + mMuteBtn->setToggleState(false); mVolumeUpCtrl->setEnabled(TRUE); mVolumeDownCtrl->setEnabled(TRUE); } - mVolumeSliderCtrl->setValue(volume); - + switch(result) { case LLPluginClassMediaOwner::MEDIA_PLAYING: @@ -453,7 +454,7 @@ void LLPanelPrimMediaControls::updateShape() { mCurrentURL.clear(); } - + mPlayCtrl->setVisible(FALSE); mPauseCtrl->setVisible(FALSE); mMediaStopCtrl->setVisible(FALSE); @@ -465,7 +466,7 @@ void LLPanelPrimMediaControls::updateShape() mSkipFwdCtrl->setEnabled(FALSE); mSkipBackCtrl->setVisible(FALSE); mSkipBackCtrl->setEnabled(FALSE); - + mVolumeCtrl->setVisible(FALSE); mVolumeUpCtrl->setVisible(FALSE); mVolumeDownCtrl->setVisible(FALSE); @@ -491,13 +492,13 @@ void LLPanelPrimMediaControls::updateShape() { mSecureLockIcon->setVisible(has_focus); } - + if(mCurrentURL!=mPreviousURL) { setCurrentURL(); mPreviousURL = mCurrentURL; } - + if(result == LLPluginClassMediaOwner::MEDIA_LOADING) { mReloadCtrl->setEnabled(FALSE); @@ -513,7 +514,7 @@ void LLPanelPrimMediaControls::updateShape() mStopCtrl->setVisible(FALSE); } } - + if(media_plugin) { @@ -530,7 +531,7 @@ void LLPanelPrimMediaControls::updateShape() mMediaProgressPanel->setVisible(false); } } - + if(media_impl) { // @@ -538,28 +539,28 @@ void LLPanelPrimMediaControls::updateShape() // switch (mScrollState) { - case SCROLL_UP: - media_impl->scrollWheel(0, -1, MASK_NONE); - break; - case SCROLL_DOWN: - media_impl->scrollWheel(0, 1, MASK_NONE); - break; - case SCROLL_LEFT: - media_impl->scrollWheel(1, 0, MASK_NONE); -// media_impl->handleKeyHere(KEY_LEFT, MASK_NONE); - break; - case SCROLL_RIGHT: - media_impl->scrollWheel(-1, 0, MASK_NONE); -// media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE); - break; - case SCROLL_NONE: - default: - break; + case SCROLL_UP: + media_impl->scrollWheel(0, -1, MASK_NONE); + break; + case SCROLL_DOWN: + media_impl->scrollWheel(0, 1, MASK_NONE); + break; + case SCROLL_LEFT: + media_impl->scrollWheel(1, 0, MASK_NONE); + // media_impl->handleKeyHere(KEY_LEFT, MASK_NONE); + break; + case SCROLL_RIGHT: + media_impl->scrollWheel(-1, 0, MASK_NONE); + // media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE); + break; + case SCROLL_NONE: + default: + break; } } setVisible(enabled); - + // // Calculate position and shape of the controls // @@ -569,31 +570,31 @@ void LLPanelPrimMediaControls::updateShape() std::vector<LLVector3>::iterator vert_it; std::vector<LLVector3>::iterator vert_end; std::vector<LLVector3> vect_face; - + LLVolume* volume = objectp->getVolume(); - + if (volume) { const LLVolumeFace& vf = volume->getVolumeFace(mTargetObjectFace); - + const LLVector3* ext = vf.mExtents; - + LLVector3 center = (ext[0]+ext[1])*0.5f; LLVector3 size = (ext[1]-ext[0])*0.5f; LLVector3 vert[] = - { - center + size.scaledVec(LLVector3(1,1,1)), - center + size.scaledVec(LLVector3(-1,1,1)), - center + size.scaledVec(LLVector3(1,-1,1)), - center + size.scaledVec(LLVector3(-1,-1,1)), - center + size.scaledVec(LLVector3(1,1,-1)), - center + size.scaledVec(LLVector3(-1,1,-1)), - center + size.scaledVec(LLVector3(1,-1,-1)), - center + size.scaledVec(LLVector3(-1,-1,-1)), - }; - + { + center + size.scaledVec(LLVector3(1,1,1)), + center + size.scaledVec(LLVector3(-1,1,1)), + center + size.scaledVec(LLVector3(1,-1,1)), + center + size.scaledVec(LLVector3(-1,-1,1)), + center + size.scaledVec(LLVector3(1,1,-1)), + center + size.scaledVec(LLVector3(-1,1,-1)), + center + size.scaledVec(LLVector3(1,-1,-1)), + center + size.scaledVec(LLVector3(-1,-1,-1)), + }; + LLVOVolume* vo = (LLVOVolume*) objectp; - + for (U32 i = 0; i < 8; i++) { vect_face.push_back(vo->volumePositionToAgent(vert[i])); @@ -601,7 +602,7 @@ void LLPanelPrimMediaControls::updateShape() } vert_it = vect_face.begin(); vert_end = vect_face.end(); - + min = LLVector3(1,1,1); max = LLVector3(-1,-1,-1); for(; vert_it != vert_end; ++vert_it) @@ -609,19 +610,19 @@ void LLPanelPrimMediaControls::updateShape() // project silhouette vertices into screen space glh::vec3f screen_vert = glh::vec3f(vert_it->mV); mat.mult_matrix_vec(screen_vert); - + // add to screenspace bounding box update_min_max(min, max, LLVector3(screen_vert.v)); } - + LLCoordGL screen_min; screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f); screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f); - + LLCoordGL screen_max; screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f); screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f); - + // grow panel so that screenspace bounding box fits inside "media_region" element of HUD LLRect media_controls_rect; S32 volume_slider_height = mVolumeSliderCtrl->getRect().getHeight() - /*fudge*/ 2; @@ -636,19 +637,19 @@ void LLPanelPrimMediaControls::updateShape() // clamp to minimum size, keeping centered media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(), - llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight())); - + llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight())); + setShape(media_controls_rect, true); - + // Test mouse position to see if the cursor is stationary LLCoordWindow cursor_pos_window; getWindow()->getCursorPosition(&cursor_pos_window); - + // If last pos is not equal to current pos, the mouse has moved // We need to reset the timer, and make sure the panel is visible if(cursor_pos_window.mX != mLastCursorPos.mX || - cursor_pos_window.mY != mLastCursorPos.mY || - mScrollState != SCROLL_NONE) + cursor_pos_window.mY != mLastCursorPos.mY || + mScrollState != SCROLL_NONE) { mInactivityTimer.start(); mLastCursorPos = cursor_pos_window; @@ -673,7 +674,7 @@ void LLPanelPrimMediaControls::updateShape() else { // I don't think this is correct anymore. This is done in draw() after the fade has completed. -// setVisible(FALSE); + // setVisible(FALSE); } } } @@ -1193,7 +1194,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp() } media_impl->setVolume(volume); - mVolumeBtn->setToggleState(false); + mMuteBtn->setToggleState(false); } } @@ -1213,7 +1214,7 @@ void LLPanelPrimMediaControls::onCommitVolumeDown() } media_impl->setVolume(volume); - mVolumeBtn->setToggleState(false); + mMuteBtn->setToggleState(false); } } @@ -1243,7 +1244,7 @@ void LLPanelPrimMediaControls::onToggleMute() } else { - media_impl->setVolume(0.5); + media_impl->setVolume(mVolumeSliderCtrl->getValueF32()); } } } diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 06163051a5d39066cff3bad1a68d21f7b5871689..17e65b8b0c3698eec57b4079524bcbb288647da5 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -153,7 +153,7 @@ class LLPanelPrimMediaControls : public LLPanel LLUICtrl *mMediaPlaySliderPanel; LLUICtrl *mMediaPlaySliderCtrl; LLUICtrl *mVolumeCtrl; - LLButton *mVolumeBtn; + LLButton *mMuteBtn; LLUICtrl *mVolumeUpCtrl; LLUICtrl *mVolumeDownCtrl; LLSliderCtrl *mVolumeSliderCtrl; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 13f195a1bea447ad429d927f5e741be451c04f72..48a7a32a3b1c7b80111b7649c1884b7f809d01c8 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -278,6 +278,16 @@ void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_lis // bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { + /** + * We need to filter speaking objects. These objects shouldn't appear in the list + * @c LLFloaterChat::addChat() in llviewermessage.cpp to get detailed call hierarchy + */ + const LLUUID& speaker_id = event->getValue().asUUID(); + LLPointer<LLSpeaker> speaker = mParent.mSpeakerMgr->findSpeaker(speaker_id); + if(speaker.isNull() || speaker->mType == LLSpeaker::SPEAKER_OBJECT) + { + return false; + } return mParent.onAddItemEvent(event, userdata); } @@ -314,6 +324,8 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu() registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2)); registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2)); + registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2)); + enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2)); enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2)); @@ -322,6 +334,28 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu() "menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); } +void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y) +{ + LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y); + + if (uuids.size() == 0) return; + + const LLUUID speaker_id = mUUIDs.front(); + BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagVoiceChat); + + if (is_muted) + { + LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false); + LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false); + } + else + { + LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false); + LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false); + } + +} + void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata) { const LLUUID speaker_id = mUUIDs.front(); @@ -379,10 +413,10 @@ void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& u new MuteTextResponder(mParent.mSpeakerMgr->getSessionID())); } -void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata) +void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags) { const LLUUID speaker_id = mUUIDs.front(); - BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagTextChat); + BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, flags); std::string name; //fill in name using voice client's copy of name cache @@ -398,12 +432,54 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userda if (!is_muted) { - LLMuteList::getInstance()->add(mute, LLMute::flagTextChat); + LLMuteList::getInstance()->add(mute, flags); } else { - LLMuteList::getInstance()->remove(mute, LLMute::flagTextChat); + LLMuteList::getInstance()->remove(mute, flags); + } +} + +void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata) +{ + toggleMute(userdata, LLMute::flagTextChat); +} + +void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userdata) +{ + toggleMute(userdata, LLMute::flagVoiceChat); +} + +void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata) +{ + +} +void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLSD& userdata) +{ + LLSpeakerMgr::speaker_list_t speakers; + mParent.mSpeakerMgr->getSpeakerList(&speakers, true); + + const LLUUID& excluded_avatar_id = mUUIDs.front(); + bool should_mute = userdata.asString() == "mute"; + for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin(); + iter != speakers.end(); ++iter) + { + LLSpeaker* speakerp = (*iter).get(); + LLUUID speaker_id = speakerp->mID; + if (excluded_avatar_id == speaker_id) continue; + + LLMute mute(speaker_id, speakerp->mDisplayName, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT); + + if (should_mute) + { + LLMuteList::getInstance()->add(mute, LLMute::flagVoiceChat); + } + else + { + LLMuteList::getInstance()->remove(mute, LLMute::flagVoiceChat); + } } + } bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata) @@ -414,7 +490,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& return mUUIDs.front() != gAgentID; } else - if (item == "can_allow_text_chat") + if (item == "can_allow_text_chat" || "can_moderate_voice" == item) { LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID()); return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator; diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 86b38f5f1e832148b6a3360243c78995ebed6c6c..83191a5b8d0b682dd673b821a399bc5728c89574 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -117,6 +117,7 @@ class LLParticipantList public: LLParticipantListMenu(LLParticipantList& parent):mParent(parent){}; /*virtual*/ LLContextMenu* createMenu(); + /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y); protected: LLParticipantList& mParent; private: @@ -124,8 +125,13 @@ class LLParticipantList bool checkContextMenuItem(const LLSD& userdata); void toggleAllowTextChat(const LLSD& userdata); + void toggleMute(const LLSD& userdata, U32 flags); void toggleMuteText(const LLSD& userdata); + void toggleMuteVoice(const LLSD& userdata); + // Voice moderation support + void moderateVoice(const LLSD& userdata); + void moderateVoiceOtherParticipants(const LLSD& userdata); }; private: diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 0362fdbf56014d31197657443577c870ce5aea6f..8d8031076909abe9e07e43e3c59f684d712a0d8d 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -54,6 +54,7 @@ #include "llscrolllistcell.h" #include "llslider.h" #include "lscript_rt_interface.h" +#include "lscript_library.h" #include "lscript_export.h" #include "lltextbox.h" #include "lltooldraganddrop.h" diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 698f6152b4ade605720148bd8f1b82fcc50e24ba..26694ac433cf03b3b8dc7de93b1741d510bdc838 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -76,29 +76,12 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mAspectRatio(0.f), mPreviewToSave(FALSE) { - const LLInventoryItem *item = getItem(); + const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); if(item) { mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); mImageID = item->getAssetUUID(); - const LLPermissions& perm = item->getPermissions(); - U32 mask = PERM_NONE; - if(perm.getOwner() == gAgent.getID()) - { - mask = perm.getMaskBase(); - } - else if(gAgent.isInGroup(perm.getGroup())) - { - mask = perm.getMaskGroup(); - } - else - { - mask = perm.getMaskEveryone(); - } - if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) - { - mIsCopyable = TRUE; - } + mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); } else // not an item, assume it's an asset id { @@ -145,6 +128,9 @@ BOOL LLPreviewTexture::postBuild() childSetVisible("Discard", false); } + childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this); + childSetVisible("save_tex_btn", canSaveAs()); + if (!mCopyToInv) { const LLInventoryItem* item = getItem(); @@ -164,6 +150,13 @@ BOOL LLPreviewTexture::postBuild() return LLPreview::postBuild(); } +// static +void LLPreviewTexture::onSaveAsBtn(void* data) +{ + LLPreviewTexture* self = (LLPreviewTexture*)data; + self->saveAs(); +} + void LLPreviewTexture::draw() { if (mUpdateDimensions) @@ -576,6 +569,7 @@ void LLPreviewTexture::loadAsset() mImage->forceToSaveRawImage(0) ; mAssetStatus = PREVIEW_ASSET_LOADING; updateDimensions(); + childSetVisible("save_tex_btn", canSaveAs()); } LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 9b3c91d831253fff05ffe91cbbc67bd20dfbdeb7..980aecee6d63f8a3b9d946a156377da37b119d55 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -58,7 +58,6 @@ class LLPreviewTexture : public LLPreview virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); virtual void onFocusReceived(); - static void saveToFile(void* userdata); static void onFileLoadedForSave( BOOL success, LLViewerFetchedTexture *src_vi, @@ -68,6 +67,8 @@ class LLPreviewTexture : public LLPreview BOOL final, void* userdata ); void openToSave(); + + static void onSaveAsBtn(void* data); protected: void init(); /* virtual */ BOOL postBuild(); diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 4f0c873c616a97f08fd399081f4acd0af9e7ba87..f66f725070a68199dc1877d773ebb8adc4c04fe9 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -78,6 +78,22 @@ LLScreenChannelBase::~LLScreenChannelBase() { mWorldViewRectConnection.disconnect(); } + +bool LLScreenChannelBase::isHovering() +{ + bool res = mHoveredToast != NULL; + if (!res) + { + return res; + } + + S32 x, y; + mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), + gViewerWindow->getCurrentMouseY(), &x, &y); + res = mHoveredToast->pointInView(x, y) == TRUE; + return res; +} + void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) { S32 top_delta = old_world_rect.mTop - new_world_rect.mTop; @@ -125,6 +141,8 @@ LLScreenChannelBase(id) void LLScreenChannel::init(S32 channel_left, S32 channel_right) { LLScreenChannelBase::init(channel_left, channel_right); + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); + updatePositionAndSize(world_rect, world_rect); } //-------------------------------------------------------------------------- @@ -136,7 +154,23 @@ LLScreenChannel::~LLScreenChannel() //-------------------------------------------------------------------------- void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) { - LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect); + S32 right_delta = old_world_rect.mRight - new_world_rect.mRight; + LLRect this_rect = getRect(); + + this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio()); + switch(mChannelAlignment) + { + case CA_LEFT : + break; + case CA_CENTRE : + this_rect.setCenterAndSize(new_world_rect.getWidth() / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight()); + break; + case CA_RIGHT : + this_rect.mLeft -= right_delta; + this_rect.mRight -= right_delta; + } + setRect(this_rect); + redrawToasts(); } //-------------------------------------------------------------------------- @@ -169,6 +203,7 @@ void LLScreenChannel::addToast(const LLToast::Params& p) if(show_toast) { mToastList.push_back(new_toast_elem); + updateShowToastsState(); redrawToasts(); } else // store_toast @@ -224,6 +259,7 @@ void LLScreenChannel::deleteToast(LLToast* toast) if(mHoveredToast == toast) { mHoveredToast = NULL; + startFadingToasts(); } // close the toast @@ -405,26 +441,27 @@ void LLScreenChannel::showToastsBottom() { if( it != mToastList.rend()-1) { - stop_showing_toasts = ((*it).toast->getRect().mTop + gSavedSettings.getS32("OverflowToastHeight") + gSavedSettings.getS32("ToastGap")) > getRect().mTop; + S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap"); + stop_showing_toasts = toast_top > getRect().mTop; } } + // at least one toast should be visible + if(it == mToastList.rbegin()) + { + stop_showing_toasts = false; + } + if(stop_showing_toasts) break; if( !(*it).toast->getVisible() ) { - if((*it).toast->isFirstLook()) - { - (*it).toast->setVisible(TRUE); - } - else - { - // HACK - // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts - (*it).toast->setVisible(TRUE); - gFloaterView->sendChildToBack((*it).toast); - } + // HACK + // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts + (*it).toast->setVisible(TRUE); + // Show toast behind floaters. (EXT-3089) + gFloaterView->sendChildToBack((*it).toast); } } @@ -566,6 +603,21 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) mStartUpToastPanel->setVisible(TRUE); } +// static -------------------------------------------------------------------------- +F32 LLScreenChannel::getHeightRatio() +{ + F32 ratio = gSavedSettings.getF32("NotificationChannelHeightRatio"); + if(0.0f > ratio) + { + ratio = 0.0f; + } + else if(1.0f < ratio) + { + ratio = 1.0f; + } + return ratio; +} + //-------------------------------------------------------------------------- void LLScreenChannel::updateStartUpString(S32 num) { @@ -608,7 +660,7 @@ void LLNotificationsUI::LLScreenChannel::startFadingToasts() if (!mToastList.size()) return; //because onMouseLeave is processed after onMouseEnter - if (mHoveredToast) return; + if (isHovering()) return; std::vector<ToastElem>::iterator it = mToastList.begin(); while (it != mToastList.end()) @@ -685,39 +737,28 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id) //-------------------------------------------------------------------------- void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter) { - // because of LLViewerWindow::updateUI() that ALWAYS calls onMouseEnter BEFORE onMouseLeave - // we must check this to prevent incorrect setting for hovering in a channel - std::map<LLToast*, bool>::iterator it_first, it_second; - S32 stack_size = mToastEventStack.size(); - if(mouse_enter) - { - mHoveredToast = toast; - } - else + // because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave + // we must check hovering directly to prevent incorrect setting for hovering in a channel + S32 x,y; + if (mouse_enter) { - mHoveredToast = NULL; - } - - switch(stack_size) - { - case 0: - mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter)); - break; - case 1: - it_first = mToastEventStack.begin(); - if((*it_first).second && !mouse_enter && ((*it_first).first != toast) ) + toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), + gViewerWindow->getCurrentMouseY(), &x, &y); + bool hover = toast->pointInView(x, y) == TRUE; + if (hover) { - mToastEventStack.clear(); mHoveredToast = toast; } - else + } + else if (mHoveredToast != NULL) + { + mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(), + gViewerWindow->getCurrentMouseY(), &x, &y); + bool hover = mHoveredToast->pointInView(x, y) == TRUE; + if (!hover) { - mToastEventStack.clear(); - mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter)); + mHoveredToast = NULL; } - break; - default: - LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl; } if(!isHovering()) @@ -727,7 +768,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter) //-------------------------------------------------------------------------- void LLScreenChannel::updateShowToastsState() { - LLFloater* floater = LLDockableFloater::getInstanceHandle().get(); + LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get()); if(!floater) { @@ -735,27 +776,17 @@ void LLScreenChannel::updateShowToastsState() return; } - // for IM floaters showed in a docked state - prohibit showing of ani toast - if(dynamic_cast<LLIMFloater*>(floater) - || dynamic_cast<LLScriptFloater*>(floater) ) - { - setShowToasts(!(floater->getVisible() && floater->isDocked())); - if (!getShowToasts()) - { - removeAndStoreAllStorableToasts(); - } - } - // *TODO: mantipov: what we have to do with derived classes: LLNotificationWellWindow & LLIMWelWindow? // See EXT-3081 for details // for Message Well floater showed in a docked state - adjust channel's height - if(dynamic_cast<LLSysWellWindow*>(floater)) + if(dynamic_cast<LLSysWellWindow*>(floater) || dynamic_cast<LLIMFloater*>(floater)) { S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");; LLRect this_rect = getRect(); if(floater->getVisible() && floater->isDocked()) { - channel_bottom += (floater->getRect().getHeight() + gSavedSettings.getS32("ToastGap")); + channel_bottom += floater->getRect().getHeight(); + channel_bottom += floater->getDockControl()->getTongueHeight(); } if(channel_bottom != this_rect.mBottom) diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 67f1c9bdc66938948d5b99e382553b211a80dd02..b8efbb148f1478ab49e9fcf445df348f1e6347d5 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -95,7 +95,7 @@ class LLScreenChannelBase : public LLUICtrl virtual void setControlHovering(bool control) { mControlHovering = control; } - bool isHovering() { return mHoveredToast != NULL; } + bool isHovering(); void setCanStoreToasts(bool store) { mCanStoreToasts = store; } @@ -265,6 +265,11 @@ class LLScreenChannel : public LLScreenChannelBase // create the StartUp Toast void createStartUpToast(S32 notif_num, F32 timer); + /** + * Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio). + */ + static F32 getHeightRatio(); + // Channel's flags static bool mWasStartUpToastShown; @@ -274,7 +279,6 @@ class LLScreenChannel : public LLScreenChannelBase std::vector<ToastElem> mToastList; std::vector<ToastElem> mStoredToastList; - std::map<LLToast*, bool> mToastEventStack; }; } diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 8de99a48aa5c1433bd4ca61af7112d3f72e41b4e..5c4f6e88603c9e0cc26624e54a03af284b8bfd5a 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -39,6 +39,7 @@ #include "llfloaterreg.h" #include "llnotifications.h" #include "llscreenchannel.h" +#include "llsyswellwindow.h" #include "lltoastnotifypanel.h" #include "llviewerwindow.h" #include "llimfloater.h" @@ -240,6 +241,14 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id) LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id); } + LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message); + + LLSD data; + data["object_id"] = object_id; + data["new_message"] = set_new_message; + data["unread"] = 1; // each object has got only one floater + mNewObjectSignal(data); + toggleScriptFloater(object_id, set_new_message); } @@ -267,6 +276,8 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) // remove related chiclet LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id); + LLIMWellWindow::getInstance()->removeObjectRow(object_id); + // close floater LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id); if(floater) @@ -291,13 +302,6 @@ void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_i void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message) { - // hide "new message" icon from chiclet - LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id); - if(chiclet) - { - chiclet->setShowNewMessagesIcon(set_new_message); - } - // kill toast using namespace LLNotificationsUI; LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID( @@ -307,6 +311,11 @@ void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool s channel->killToastByNotificationID(findNotificationToastId(object_id)); } + LLSD data; + data["object_id"] = object_id; + data["new_message"] = set_new_message; + mToggleFloaterSignal(data); + // toggle floater LLScriptFloater::toggle(object_id); } diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index 8de7a28d0fc5fdedbf5c20d055abadc8973e9a5b..95ec5a4d9cda0089720aeb48858bd674d1c5f92d 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -88,6 +88,11 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager> */ static void onToastButtonClick(const LLSD¬ification, const LLSD&response); + typedef boost::signals2::signal<void(const LLSD&)> object_signal_t; + + boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); } + boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); } + private: struct LLNotificationData @@ -100,6 +105,9 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager> typedef std::map<LLUUID, LLNotificationData> script_notification_map_t; script_notification_map_t mNotifications; + + object_signal_t mNewObjectSignal; + object_signal_t mToggleFloaterSignal; }; /** diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d965b3031e254a65c1130f530662c5e9434016c5..77048f0d8af36fc241089967de320b2f6f4a3577 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -104,6 +104,7 @@ const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f; const S32 MAX_ACTION_QUEUE_SIZE = 20; const S32 MAX_SILS_PER_FRAME = 50; const S32 MAX_OBJECTS_PER_PACKET = 254; +const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF; // // Globals @@ -5109,7 +5110,7 @@ LLSelectNode::~LLSelectNode() void LLSelectNode::selectAllTEs(BOOL b) { - mTESelectMask = b ? 0xFFFFFFFF : 0x0; + mTESelectMask = b ? TE_SELECT_MASK_ALL : 0x0; mLastTESelected = 0; } @@ -5831,8 +5832,22 @@ void LLSelectMgr::redo() //----------------------------------------------------------------------------- BOOL LLSelectMgr::canDoDelete() const { + bool can_delete = false; + // This function is "logically const" - it does not change state in + // a way visible outside the selection manager. + LLSelectMgr* self = const_cast<LLSelectMgr*>(this); + LLViewerObject* obj = self->mSelectedObjects->getFirstDeleteableObject(); // Note: Can only delete root objects (see getFirstDeleteableObject() for more info) - return const_cast<LLSelectMgr*>(this)->mSelectedObjects->getFirstDeleteableObject() != NULL; // HACK: casting away constness - MG + if (obj!= NULL) + { + // all the faces needs to be selected + if(self->mSelectedObjects->contains(obj,SELECT_ALL_TES )) + { + can_delete = true; + } + } + + return can_delete; } //----------------------------------------------------------------------------- @@ -6267,8 +6282,14 @@ BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te) LLSelectNode* nodep = *iter; if (nodep->getObject() == object) { + // Optimization + if (nodep->getTESelectMask() == TE_SELECT_MASK_ALL) + { + return TRUE; + } + BOOL all_selected = TRUE; - for (S32 i = 0; i < SELECT_MAX_TES; i++) + for (S32 i = 0; i < object->getNumTEs(); i++) { all_selected = all_selected && nodep->isTESelected(i); } diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index d5f01418c61c9ffc4fb219f414bd7d2ede794a80..eb3695a3719a75487fa2921532e50bffab7dc3d2 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -67,6 +67,26 @@ class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver LLSidepanelAppearance *mPanel; }; +class LLWatchForOutfitRenameObserver : public LLInventoryObserver +{ +public: + LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) : + mPanel(panel) + {} + virtual void changed(U32 mask); + +private: + LLSidepanelAppearance *mPanel; +}; + +void LLWatchForOutfitRenameObserver::changed(U32 mask) +{ + if (mask & LABEL) + { + mPanel->refreshCurrentOutfitName(); + } +} + LLSidepanelAppearance::LLSidepanelAppearance() : LLPanel(), mFilterSubString(LLStringUtil::null), @@ -76,6 +96,8 @@ LLSidepanelAppearance::LLSidepanelAppearance() : { //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() mFetchWorn = new LLCurrentlyWornFetchObserver(this); + + mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this); } LLSidepanelAppearance::~LLSidepanelAppearance() @@ -135,6 +157,8 @@ BOOL LLSidepanelAppearance::postBuild() mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook"); + gInventory.addObserver(mOutfitRenameWatcher); + return TRUE; } @@ -299,7 +323,7 @@ void LLSidepanelAppearance::updateVerbs() } } -void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name) +void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name) { if (name == "") { diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index b335fd910d9e2a9bc50b28bd3b61b4b2aa055fc2..9c870f631a9fad7aa0f766d156928e9f29cc3aee 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -40,6 +40,7 @@ class LLFilterEditor; class LLCurrentlyWornFetchObserver; +class LLWatchForOutfitRenameObserver; class LLPanelEditWearable; class LLWearable; class LLPanelOutfitsInventory; @@ -53,7 +54,7 @@ class LLSidepanelAppearance : public LLPanel /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); - void refreshCurrentOutfitName(const std::string name = ""); + void refreshCurrentOutfitName(const std::string& name = ""); static void editWearable(LLWearable *wearable, void *data); @@ -91,6 +92,9 @@ class LLSidepanelAppearance : public LLPanel // Used to make sure the user's inventory is in memory. LLCurrentlyWornFetchObserver* mFetchWorn; + // Used to update title when currently worn outfit gets renamed. + LLWatchForOutfitRenameObserver* mOutfitRenameWatcher; + // Search string for filtering landmarks and teleport // history locations std::string mFilterSubString; diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index ca7a3b663a7105b5fbe2e15b44c45d8638370b59..5383158cd3f4d14ccd3d1d468c043a3f15c76009 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -235,8 +235,10 @@ void LLSidepanelInventory::updateVerbs() if (!item) return; - mInfoBtn->setEnabled(TRUE); - mShareBtn->setEnabled(TRUE); + bool is_single_selection = getSelectedCount() == 1; + + mInfoBtn->setEnabled(is_single_selection); + mShareBtn->setEnabled(is_single_selection); switch(item->getInventoryType()) { @@ -274,6 +276,14 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem() return item; } +U32 LLSidepanelInventory::getSelectedCount() +{ + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + std::set<LLUUID> selection_list; + panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(selection_list); + return selection_list.size(); +} + LLInventoryPanel *LLSidepanelInventory::getActivePanel() { if (!getVisible()) diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 231cdac9e1e923ad679b5980f8177f835d17aaa0..ee11fb6b5446e3ae0a09a5411a8971574d3c9489 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -56,6 +56,7 @@ class LLSidepanelInventory : public LLPanel protected: // Tracks highlighted (selected) item in inventory panel. LLInventoryItem *getSelectedItem(); + U32 getSelectedCount(); void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); // "wear", "teleport", etc. void performActionOnSelection(const std::string &action); diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp index 23931defdd2295e8df10e578c096dccb11547aec..793904faa8c4aad20390e66c400fb464e0038010 100644 --- a/indra/newview/llsidepanelinventorysubpanel.cpp +++ b/indra/newview/llsidepanelinventorysubpanel.cpp @@ -57,7 +57,6 @@ LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel() : LLPanel(), mIsDirty(TRUE), mIsEditing(FALSE), - mEditBtn(NULL), mCancelBtn(NULL), mSaveBtn(NULL) { @@ -71,9 +70,6 @@ LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel() // virtual BOOL LLSidepanelInventorySubpanel::postBuild() { - mEditBtn = getChild<LLButton>("edit_btn"); - mEditBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onEditButtonClicked, this)); - mSaveBtn = getChild<LLButton>("save_btn"); mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this)); @@ -111,9 +107,9 @@ void LLSidepanelInventorySubpanel::draw() { if (mIsDirty) { - mIsDirty = FALSE; refresh(); updateVerbs(); + mIsDirty = FALSE; } LLPanel::draw(); @@ -127,7 +123,6 @@ void LLSidepanelInventorySubpanel::dirty() void LLSidepanelInventorySubpanel::updateVerbs() { - mEditBtn->setVisible(!mIsEditing); mSaveBtn->setVisible(mIsEditing); mCancelBtn->setVisible(mIsEditing); } diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h index a74f4fdee61120100deba01f7c58c92606026b3c..b7bee6809f9e42e7596a4fa0c6ebb9148c55776d 100644 --- a/indra/newview/llsidepanelinventorysubpanel.h +++ b/indra/newview/llsidepanelinventorysubpanel.h @@ -70,7 +70,6 @@ class LLSidepanelInventorySubpanel : public LLPanel void onEditButtonClicked(); void onSaveButtonClicked(); void onCancelButtonClicked(); - LLButton* mEditBtn; LLButton* mSaveBtn; LLButton* mCancelBtn; diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index ad6428e5153e33e05263c72851162c348c79fa2f..25518d87d6e4f31ea0d073c28d1cbc8e9c4c165b 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -109,19 +109,30 @@ BOOL LLSidepanelItemInfo::postBuild() { LLSidepanelInventorySubpanel::postBuild(); - // build the UI - // item name & description childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); - //getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); + getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); - //getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); - + getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); // Creator information getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); - // owner information getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this)); - + // acquired date + // owner permissions + // Permissions debug text + // group permissions + getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + // everyone permissions + getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + // next owner permissions + getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + // Mark for sale or not, and sale info + getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); + getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleType, this)); + // "Price" label for edit + getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); refresh(); return TRUE; } @@ -159,7 +170,6 @@ void LLSidepanelItemInfo::refresh() setIsEditing(FALSE); return; } - mEditBtn->setEnabled(FALSE); } if (!getIsEditing()) @@ -251,6 +261,18 @@ void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item) GP_OBJECT_MANIPULATE) && is_obj_modify && is_complete; + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + bool item_in_trash = item->getUUID() == trash_id || gInventory.isObjectDescendentOf(item->getUUID(), trash_id); + + if (is_modifiable && !item_in_trash) + { + setIsEditing(TRUE); + } + else + { + setIsEditing(FALSE); + } + childSetEnabled("LabelItemNameTitle",TRUE); childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards childSetText("LabelItemName",item->getName()); @@ -858,25 +880,6 @@ LLInventoryItem* LLSidepanelItemInfo::findItem() const return item; } -// virtual -void LLSidepanelItemInfo::updateVerbs() -{ - LLSidepanelInventorySubpanel::updateVerbs(); - - const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); - if (item) - { - const LLPermissions& perm = item->getPermissions(); - BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, - GP_OBJECT_MANIPULATE); - - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - bool item_in_trash = item->getUUID() == trash_id || gInventory.isObjectDescendentOf(item->getUUID(), trash_id); - mEditBtn->setEnabled(is_modifiable && !item_in_trash); - - } -} - // virtual void LLSidepanelItemInfo::save() { diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 4bfbd56ea795096409c9bf13d3fd87dbc88f3c0b..21002327bcd4a444de43ee5532784c9deaec6395 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -62,7 +62,6 @@ class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel protected: /*virtual*/ void refresh(); /*virtual*/ void save(); - /*virtual*/ void updateVerbs(); LLInventoryItem* findItem() const; LLViewerObject* findObject() const; diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 09e067b5f950c8ebc7e490f820f999eb6190f996..2c40e948de7182e708740dc6dc3af2c14fdc130c 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -104,11 +104,10 @@ BOOL LLSidepanelTaskInfo::postBuild() childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe); childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe); -// getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); -// childSetAction("button deed",LLSidepanelTaskInfo::onClickDeedToGroup,this); - mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); + childSetCommitCallback("checkbox for sale",onClickForSale,this); + return TRUE; } @@ -119,6 +118,7 @@ void LLSidepanelTaskInfo::setVisible(BOOL visible) if (visible) { sActivePanel = this; + mObject = getFirstSelectedObject(); } else { @@ -126,10 +126,89 @@ void LLSidepanelTaskInfo::setVisible(BOOL visible) } } +void LLSidepanelTaskInfo::disableAll() +{ + childSetEnabled("perm_modify", FALSE); + childSetText("perm_modify", LLStringUtil::null); + + childSetEnabled("Creator:", FALSE); + childSetText("Creator Name", LLStringUtil::null); + childSetEnabled("Creator Name", FALSE); + + childSetEnabled("Owner:", FALSE); + childSetText("Owner Name", LLStringUtil::null); + childSetEnabled("Owner Name", FALSE); + + childSetEnabled("Group:", FALSE); + childSetText("Group Name", LLStringUtil::null); + childSetEnabled("Group Name", FALSE); + childSetEnabled("button set group", FALSE); + + childSetText("Object Name", LLStringUtil::null); + childSetEnabled("Object Name", FALSE); + childSetEnabled("Name:", FALSE); + childSetText("Group Name", LLStringUtil::null); + childSetEnabled("Group Name", FALSE); + childSetEnabled("Description:", FALSE); + childSetText("Object Description", LLStringUtil::null); + childSetEnabled("Object Description", FALSE); + + childSetEnabled("Permissions:", FALSE); + + childSetValue("checkbox share with group", FALSE); + childSetEnabled("checkbox share with group", FALSE); + childSetEnabled("button deed", FALSE); + + childSetValue("checkbox allow everyone move", FALSE); + childSetEnabled("checkbox allow everyone move", FALSE); + childSetValue("checkbox allow everyone copy", FALSE); + childSetEnabled("checkbox allow everyone copy", FALSE); + + //Next owner can: + childSetEnabled("Next owner can:", FALSE); + childSetValue("checkbox next owner can modify", FALSE); + childSetEnabled("checkbox next owner can modify", FALSE); + childSetValue("checkbox next owner can copy", FALSE); + childSetEnabled("checkbox next owner can copy", FALSE); + childSetValue("checkbox next owner can transfer", FALSE); + childSetEnabled("checkbox next owner can transfer", FALSE); + + //checkbox for sale + childSetValue("checkbox for sale", FALSE); + childSetEnabled("checkbox for sale", FALSE); + + //checkbox include in search + childSetValue("search_check", FALSE); + childSetEnabled("search_check", FALSE); + + LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); + combo_sale_type->setValue(LLSaleInfo::FS_COPY); + combo_sale_type->setEnabled(FALSE); + + childSetEnabled("Cost", FALSE); + childSetText("Cost", getString("Cost Default")); + childSetText("Edit Cost", LLStringUtil::null); + childSetEnabled("Edit Cost", FALSE); + + childSetEnabled("label click action", FALSE); + LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction"); + if (combo_click_action) + { + combo_click_action->setEnabled(FALSE); + combo_click_action->clear(); + } + childSetVisible("B:", FALSE); + childSetVisible("O:", FALSE); + childSetVisible("G:", FALSE); + childSetVisible("E:", FALSE); + childSetVisible("N:", FALSE); + childSetVisible("F:", FALSE); +} + void LLSidepanelTaskInfo::refresh() { - LLButton* BtnDeedToGroup = getChild<LLButton>("button deed"); - if(BtnDeedToGroup) + LLButton* btn_deed_to_group = getChild<LLButton>("button deed"); + if (btn_deed_to_group) { std::string deedText; if (gWarningSettings.getBOOL("DeedObject")) @@ -140,156 +219,80 @@ void LLSidepanelTaskInfo::refresh() { deedText = getString("text deed"); } - BtnDeedToGroup->setLabelSelected(deedText); - BtnDeedToGroup->setLabelUnselected(deedText); + btn_deed_to_group->setLabelSelected(deedText); + btn_deed_to_group->setLabelUnselected(deedText); } + BOOL root_selected = TRUE; LLSelectNode* nodep = mObjectSelection->getFirstRootNode(); S32 object_count = mObjectSelection->getRootObjectCount(); - if(!nodep || 0 == object_count) + if (!nodep || (object_count == 0)) { nodep = mObjectSelection->getFirstNode(); object_count = mObjectSelection->getObjectCount(); root_selected = FALSE; } - //BOOL attachment_selected = mObjectSelection->isAttachment(); - //attachment_selected = false; LLViewerObject* objectp = NULL; - if(nodep) objectp = nodep->getObject(); - if(!nodep || !objectp)// || attachment_selected) + if (nodep) { - // ...nothing selected - childSetEnabled("perm_modify",false); - childSetText("perm_modify",LLStringUtil::null); - - childSetEnabled("Creator:",false); - childSetText("Creator Name",LLStringUtil::null); - childSetEnabled("Creator Name",false); - - childSetEnabled("Owner:",false); - childSetText("Owner Name",LLStringUtil::null); - childSetEnabled("Owner Name",false); - - childSetEnabled("Group:",false); - childSetText("Group Name",LLStringUtil::null); - childSetEnabled("Group Name",false); - childSetEnabled("button set group",false); - - childSetText("Object Name",LLStringUtil::null); - childSetEnabled("Object Name",false); - childSetEnabled("Name:",false); - childSetText("Group Name",LLStringUtil::null); - childSetEnabled("Group Name",false); - childSetEnabled("Description:",false); - childSetText("Object Description",LLStringUtil::null); - childSetEnabled("Object Description",false); - - childSetEnabled("Permissions:",false); - - childSetValue("checkbox share with group",FALSE); - childSetEnabled("checkbox share with group",false); - childSetEnabled("button deed",false); - - childSetValue("checkbox allow everyone move",FALSE); - childSetEnabled("checkbox allow everyone move",false); - childSetValue("checkbox allow everyone copy",FALSE); - childSetEnabled("checkbox allow everyone copy",false); - - //Next owner can: - childSetEnabled("Next owner can:",false); - childSetValue("checkbox next owner can modify",FALSE); - childSetEnabled("checkbox next owner can modify",false); - childSetValue("checkbox next owner can copy",FALSE); - childSetEnabled("checkbox next owner can copy",false); - childSetValue("checkbox next owner can transfer",FALSE); - childSetEnabled("checkbox next owner can transfer",false); - - //checkbox for sale - childSetValue("checkbox for sale",FALSE); - childSetEnabled("checkbox for sale",false); - - //checkbox include in search - childSetValue("search_check", FALSE); - childSetEnabled("search_check", false); - - LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); - combo_sale_type->setValue(LLSaleInfo::FS_COPY); - combo_sale_type->setEnabled(FALSE); - - childSetEnabled("Cost",false); - childSetText("Cost",getString("Cost Default")); - childSetText("Edit Cost",LLStringUtil::null); - childSetEnabled("Edit Cost",false); - - childSetEnabled("label click action",false); - LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); - if(ComboClickAction) - { - ComboClickAction->setEnabled(FALSE); - ComboClickAction->clear(); - } - childSetVisible("B:",false); - childSetVisible("O:",false); - childSetVisible("G:",false); - childSetVisible("E:",false); - childSetVisible("N:",false); - childSetVisible("F:",false); + objectp = nodep->getObject(); + } + // ...nothing selected + if (!nodep || !objectp) + { + disableAll(); return; } // figure out a few variables - BOOL is_one_object = (object_count == 1); - + const BOOL is_one_object = (object_count == 1); + // BUG: fails if a root and non-root are both single-selected. - BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() - && LLSelectMgr::getInstance()->selectGetRootsModify()) - || LLSelectMgr::getInstance()->selectGetModify(); + const BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsModify()) || + LLSelectMgr::getInstance()->selectGetModify(); const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); + S32 string_index = 0; std::string MODIFY_INFO_STRINGS[] = - { - getString("text modify info 1"), - getString("text modify info 2"), - getString("text modify info 3"), - getString("text modify info 4") - }; - if(!is_perm_modify) + { + getString("text modify info 1"), + getString("text modify info 2"), + getString("text modify info 3"), + getString("text modify info 4") + }; + if (!is_perm_modify) { string_index += 2; } - if(!is_one_object) + if (!is_one_object) { ++string_index; } - childSetEnabled("perm_modify",true); - childSetText("perm_modify",MODIFY_INFO_STRINGS[string_index]); + childSetEnabled("perm_modify", TRUE); + childSetText("perm_modify", MODIFY_INFO_STRINGS[string_index]); - childSetEnabled("Permissions:",true); + childSetEnabled("Permissions:", TRUE); // Update creator text field - childSetEnabled("Creator:",true); + childSetEnabled("Creator:", TRUE); BOOL creators_identical; std::string creator_name; creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, - creator_name); + creator_name); - childSetText("Creator Name",creator_name); - childSetEnabled("Creator Name",TRUE); + childSetText("Creator Name", creator_name); + childSetEnabled("Creator Name", TRUE); // Update owner text field - childSetEnabled("Owner:",true); + childSetEnabled("Owner:", TRUE); - BOOL owners_identical; std::string owner_name; - owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name); - -// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl; - + const BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name); if (mOwnerID.isNull()) { - if(LLSelectMgr::getInstance()->selectIsGroupOwned()) + if (LLSelectMgr::getInstance()->selectIsGroupOwned()) { // Group owned already displayed by selectGetOwner } @@ -304,61 +307,53 @@ void LLSidepanelTaskInfo::refresh() if (!mLastOwnerID.isNull() && !last_owner_name.empty()) { owner_name.append(", last "); - owner_name.append( last_owner_name ); + owner_name.append(last_owner_name); } } } - - childSetText("Owner Name",owner_name); - childSetEnabled("Owner Name",TRUE); + childSetText("Owner Name", owner_name); + childSetEnabled("Owner Name", TRUE); // update group text field - childSetEnabled("Group:",true); - childSetText("Group Name",LLStringUtil::null); + childSetEnabled("Group:", TRUE); + childSetText("Group Name", LLStringUtil::null); LLUUID group_id; BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id); if (groups_identical) { - if(mLabelGroupName) + if (mLabelGroupName) { - mLabelGroupName->setNameID(group_id, TRUE); + mLabelGroupName->setNameID(group_id,TRUE); mLabelGroupName->setEnabled(TRUE); } } else { - if(mLabelGroupName) + if (mLabelGroupName) { mLabelGroupName->setNameID(LLUUID::null, TRUE); - mLabelGroupName->refresh(LLUUID::null, LLStringUtil::null, LLStringUtil::null, TRUE); + mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE); mLabelGroupName->setEnabled(FALSE); } } - childSetEnabled("button set group",owners_identical && (mOwnerID == gAgent.getID())); + childSetEnabled("button set group", owners_identical && (mOwnerID == gAgent.getID())); - // figure out the contents of the name, description, & category - BOOL edit_name_desc = FALSE; - if(is_one_object && objectp->permModify()) - { - edit_name_desc = TRUE; - } - - childSetEnabled("Name:",true); + childSetEnabled("Name:", TRUE); LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name"); - childSetEnabled("Description:",true); - LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description"); + childSetEnabled("Description:", TRUE); + LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description"); - if(is_one_object) + if (is_one_object) { - if(keyboard_focus_view != LineEditorObjectName) + if (keyboard_focus_view != LineEditorObjectName) { childSetText("Object Name",nodep->mName); } - if(LineEditorObjectDesc) + if (LineEditorObjectDesc) { - if(keyboard_focus_view != LineEditorObjectDesc) + if (keyboard_focus_view != LineEditorObjectDesc) { LineEditorObjectDesc->setText(nodep->mDescription); } @@ -366,19 +361,25 @@ void LLSidepanelTaskInfo::refresh() } else { - childSetText("Object Name",LLStringUtil::null); + childSetText("Object Name", LLStringUtil::null); LineEditorObjectDesc->setText(LLStringUtil::null); } - if(edit_name_desc) + // figure out the contents of the name, description, & category + BOOL edit_name_desc = FALSE; + if (is_one_object && objectp->permModify()) { - childSetEnabled("Object Name",true); - childSetEnabled("Object Description",true); + edit_name_desc = TRUE; + } + if (edit_name_desc) + { + childSetEnabled("Object Name", TRUE); + childSetEnabled("Object Description", TRUE); } else { - childSetEnabled("Object Name",false); - childSetEnabled("Object Description",false); + childSetEnabled("Object Name", FALSE); + childSetEnabled("Object Description", FALSE); } S32 total_sale_price = 0; @@ -387,10 +388,10 @@ void LLSidepanelTaskInfo::refresh() BOOL is_sale_price_mixed = FALSE; U32 num_for_sale = FALSE; LLSelectMgr::getInstance()->selectGetAggregateSaleInfo(num_for_sale, - is_for_sale_mixed, - is_sale_price_mixed, - total_sale_price, - individual_sale_price); + is_for_sale_mixed, + is_sale_price_mixed, + total_sale_price, + individual_sale_price); const BOOL self_owned = (gAgent.getID() == mOwnerID); const BOOL group_owned = LLSelectMgr::getInstance()->selectIsGroupOwned() ; @@ -398,35 +399,35 @@ void LLSidepanelTaskInfo::refresh() const BOOL can_transfer = LLSelectMgr::getInstance()->selectGetRootsTransfer(); const BOOL can_copy = LLSelectMgr::getInstance()->selectGetRootsCopy(); - if(!owners_identical) + if (!owners_identical) { - childSetEnabled("Cost",false); - childSetText("Edit Cost",LLStringUtil::null); - childSetEnabled("Edit Cost",false); + childSetEnabled("Cost", FALSE); + childSetText("Edit Cost", LLStringUtil::null); + childSetEnabled("Edit Cost", FALSE); } // You own these objects. - else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) + else if (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) { // If there are multiple items for sale then set text to PRICE PER UNIT. if (num_for_sale > 1) { - childSetText("Cost",getString("Cost Per Unit")); + childSetText("Cost", getString("Cost Per Unit")); } else { - childSetText("Cost",getString("Cost Default")); + childSetText("Cost", getString("Cost Default")); } LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); - if(!edit_price->hasFocus()) + if (!edit_price->hasFocus()) { // If the sale price is mixed then set the cost to MIXED, otherwise // set to the actual cost. - if (num_for_sale > 0 && is_for_sale_mixed) + if ((num_for_sale > 0) && is_for_sale_mixed) { edit_price->setTentative(TRUE); } - else if (num_for_sale > 0 && is_sale_price_mixed) + else if ((num_for_sale > 0) && is_sale_price_mixed) { edit_price->setTentative(TRUE); } @@ -437,303 +438,279 @@ void LLSidepanelTaskInfo::refresh() } // The edit fields are only enabled if you can sell this object // and the sale price is not mixed. - bool enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : false; - childSetEnabled("Cost",enable_edit); - childSetEnabled("Edit Cost",enable_edit); + BOOL enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : FALSE; + childSetEnabled("Cost", enable_edit); + childSetEnabled("Edit Cost", enable_edit); } // Someone, not you, owns these objects. - else if(!public_owned) + else if (!public_owned) { - childSetEnabled("Cost",false); - childSetEnabled("Edit Cost",false); + childSetEnabled("Cost", FALSE); + childSetEnabled("Edit Cost", FALSE); // Don't show a price if none of the items are for sale. if (num_for_sale) - childSetText("Edit Cost",llformat("%d",total_sale_price)); + childSetText("Edit Cost", llformat("%d",total_sale_price)); else - childSetText("Edit Cost",LLStringUtil::null); + childSetText("Edit Cost", LLStringUtil::null); // If multiple items are for sale, set text to TOTAL PRICE. if (num_for_sale > 1) - childSetText("Cost",getString("Cost Total")); + childSetText("Cost", getString("Cost Total")); else - childSetText("Cost",getString("Cost Default")); + childSetText("Cost", getString("Cost Default")); } // This is a public object. else { - childSetEnabled("Cost",false); - childSetText("Cost",getString("Cost Default")); + childSetEnabled("Cost", FALSE); + childSetText("Cost", getString("Cost Default")); - childSetText("Edit Cost",LLStringUtil::null); - childSetEnabled("Edit Cost",false); + childSetText("Edit Cost", LLStringUtil::null); + childSetEnabled("Edit Cost", FALSE); } // Enable and disable the permissions checkboxes // based on who owns the object. // TODO: Creator permissions - BOOL valid_base_perms = FALSE; - BOOL valid_owner_perms = FALSE; - BOOL valid_group_perms = FALSE; - BOOL valid_everyone_perms = FALSE; - BOOL valid_next_perms = FALSE; - - U32 base_mask_on; - U32 base_mask_off; - U32 owner_mask_on; - U32 owner_mask_off; - U32 group_mask_on; - U32 group_mask_off; - U32 everyone_mask_on; - U32 everyone_mask_off; - U32 next_owner_mask_on = 0; - U32 next_owner_mask_off = 0; - - valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE, - &base_mask_on, - &base_mask_off); - - valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, - &owner_mask_on, - &owner_mask_off); - - valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP, - &group_mask_on, - &group_mask_off); + U32 base_mask_on = 0; + U32 base_mask_off = 0; + U32 owner_mask_off = 0; + U32 owner_mask_on = 0; + U32 group_mask_on = 0; + U32 group_mask_off = 0; + U32 everyone_mask_on = 0; + U32 everyone_mask_off = 0; + U32 next_owner_mask_on = 0; + U32 next_owner_mask_off = 0; + + BOOL valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE, + &base_mask_on, + &base_mask_off); + //BOOL valid_owner_perms =// + LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, + &owner_mask_on, + &owner_mask_off); + BOOL valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP, + &group_mask_on, + &group_mask_off); - valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE, - &everyone_mask_on, - &everyone_mask_off); + BOOL valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE, + &everyone_mask_on, + &everyone_mask_off); - valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER, - &next_owner_mask_on, - &next_owner_mask_off); + BOOL valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER, + &next_owner_mask_on, + &next_owner_mask_off); - if( gSavedSettings.getBOOL("DebugPermissions") ) + if (gSavedSettings.getBOOL("DebugPermissions") ) { - std::string perm_string; if (valid_base_perms) { - perm_string = "B: "; - perm_string += mask_to_string(base_mask_on); - childSetText("B:",perm_string); - childSetVisible("B:",true); + childSetText("B:", "B: " + mask_to_string(base_mask_on)); + childSetVisible("B:", TRUE); - perm_string = "O: "; - perm_string += mask_to_string(owner_mask_on); - childSetText("O:",perm_string); - childSetVisible("O:",true); + childSetText("O:", "O: " + mask_to_string(owner_mask_on)); + childSetVisible("O:", TRUE); - perm_string = "G: "; - perm_string += mask_to_string(group_mask_on); - childSetText("G:",perm_string); - childSetVisible("G:",true); + childSetText("G:", "G: " + mask_to_string(group_mask_on)); + childSetVisible("G:", TRUE); - perm_string = "E: "; - perm_string += mask_to_string(everyone_mask_on); - childSetText("E:",perm_string); - childSetVisible("E:",true); + childSetText("E:", "E: " + mask_to_string(everyone_mask_on)); + childSetVisible("E:", TRUE); - perm_string = "N: "; - perm_string += mask_to_string(next_owner_mask_on); - childSetText("N:",perm_string); - childSetVisible("N:",true); + childSetText("N:", "N: " + mask_to_string(next_owner_mask_on)); + childSetVisible("N:", TRUE); } - perm_string = "F: "; + U32 flag_mask = 0x0; - if (objectp->permMove()) - flag_mask |= PERM_MOVE; - if (objectp->permModify()) - flag_mask |= PERM_MODIFY; - if (objectp->permCopy()) - flag_mask |= PERM_COPY; - if (objectp->permTransfer()) - flag_mask |= PERM_TRANSFER; - perm_string += mask_to_string(flag_mask); - childSetText("F:",perm_string); - childSetVisible("F:",true); + if (objectp->permMove()) flag_mask |= PERM_MOVE; + if (objectp->permModify()) flag_mask |= PERM_MODIFY; + if (objectp->permCopy()) flag_mask |= PERM_COPY; + if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER; + + childSetText("F:", "F:" + mask_to_string(flag_mask)); + childSetVisible("F:", TRUE); } else { - childSetVisible("B:",false); - childSetVisible("O:",false); - childSetVisible("G:",false); - childSetVisible("E:",false); - childSetVisible("N:",false); - childSetVisible("F:",false); + childSetVisible("B:", FALSE); + childSetVisible("O:", FALSE); + childSetVisible("G:", FALSE); + childSetVisible("E:", FALSE); + childSetVisible("N:", FALSE); + childSetVisible("F:", FALSE); } - bool has_change_perm_ability = false; - bool has_change_sale_ability = false; + BOOL has_change_perm_ability = FALSE; + BOOL has_change_sale_ability = FALSE; - if(valid_base_perms - && (self_owned - || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE)))) + if (valid_base_perms && + (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE)))) { - has_change_perm_ability = true; + has_change_perm_ability = TRUE; } - if(valid_base_perms - && (self_owned - || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE)))) + if (valid_base_perms && + (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE)))) { - has_change_sale_ability = true; + has_change_sale_ability = TRUE; } if (!has_change_perm_ability && !has_change_sale_ability && !root_selected) { // ...must select root to choose permissions - childSetValue("perm_modify", getString("text modify warning")); + childSetValue("perm_modify", getString("text modify warning")); } if (has_change_perm_ability) { - childSetEnabled("checkbox share with group",true); - childSetEnabled("checkbox allow everyone move",owner_mask_on & PERM_MOVE); - childSetEnabled("checkbox allow everyone copy",owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER); + childSetEnabled("checkbox share with group", TRUE); + childSetEnabled("checkbox allow everyone move", owner_mask_on & PERM_MOVE); + childSetEnabled("checkbox allow everyone copy", owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER); } else { - childSetEnabled("checkbox share with group", FALSE); - childSetEnabled("checkbox allow everyone move", FALSE); - childSetEnabled("checkbox allow everyone copy", FALSE); + childSetEnabled("checkbox share with group", FALSE); + childSetEnabled("checkbox allow everyone move", FALSE); + childSetEnabled("checkbox allow everyone copy", FALSE); } if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER)) { - childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale)); + childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale)); // Set the checkbox to tentative if the prices of each object selected // are not the same. - childSetTentative("checkbox for sale", is_for_sale_mixed); - childSetEnabled("sale type",num_for_sale && can_transfer && !is_sale_price_mixed); + childSetTentative("checkbox for sale", is_for_sale_mixed); + childSetEnabled("sale type", num_for_sale && can_transfer && !is_sale_price_mixed); - childSetEnabled("Next owner can:", TRUE); - childSetEnabled("checkbox next owner can modify",base_mask_on & PERM_MODIFY); - childSetEnabled("checkbox next owner can copy",base_mask_on & PERM_COPY); - childSetEnabled("checkbox next owner can transfer",next_owner_mask_on & PERM_COPY); + childSetEnabled("Next owner can:", TRUE); + childSetEnabled("checkbox next owner can modify", base_mask_on & PERM_MODIFY); + childSetEnabled("checkbox next owner can copy", base_mask_on & PERM_COPY); + childSetEnabled("checkbox next owner can transfer", next_owner_mask_on & PERM_COPY); } else { - childSetEnabled("checkbox for sale",FALSE); - childSetEnabled("sale type",FALSE); + childSetEnabled("checkbox for sale", FALSE); + childSetEnabled("sale type", FALSE); - childSetEnabled("Next owner can:",FALSE); - childSetEnabled("checkbox next owner can modify",FALSE); - childSetEnabled("checkbox next owner can copy",FALSE); - childSetEnabled("checkbox next owner can transfer",FALSE); + childSetEnabled("Next owner can:", FALSE); + childSetEnabled("checkbox next owner can modify", FALSE); + childSetEnabled("checkbox next owner can copy", FALSE); + childSetEnabled("checkbox next owner can transfer", FALSE); } - if(valid_group_perms) + if (valid_group_perms) { - if((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE)) + if ((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE)) { - childSetValue("checkbox share with group",TRUE); - childSetTentative("checkbox share with group",FALSE); - childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); + childSetValue("checkbox share with group", TRUE); + childSetTentative("checkbox share with group", FALSE); + childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); } - else if((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE)) + else if ((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE)) { - childSetValue("checkbox share with group",FALSE); - childSetTentative("checkbox share with group",false); - childSetEnabled("button deed",false); + childSetValue("checkbox share with group", FALSE); + childSetTentative("checkbox share with group", FALSE); + childSetEnabled("button deed", FALSE); } else { - childSetValue("checkbox share with group",TRUE); - childSetTentative("checkbox share with group",true); - childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); + childSetValue("checkbox share with group", TRUE); + childSetTentative("checkbox share with group", TRUE); + childSetEnabled("button deed", gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); } } - if(valid_everyone_perms) + if (valid_everyone_perms) { // Move - if(everyone_mask_on & PERM_MOVE) + if (everyone_mask_on & PERM_MOVE) { - childSetValue("checkbox allow everyone move",TRUE); - childSetTentative("checkbox allow everyone move",false); + childSetValue("checkbox allow everyone move", TRUE); + childSetTentative("checkbox allow everyone move", FALSE); } - else if(everyone_mask_off & PERM_MOVE) + else if (everyone_mask_off & PERM_MOVE) { - childSetValue("checkbox allow everyone move",FALSE); - childSetTentative("checkbox allow everyone move",false); + childSetValue("checkbox allow everyone move", FALSE); + childSetTentative("checkbox allow everyone move", FALSE); } else { - childSetValue("checkbox allow everyone move",TRUE); - childSetTentative("checkbox allow everyone move",true); + childSetValue("checkbox allow everyone move", TRUE); + childSetTentative("checkbox allow everyone move", TRUE); } // Copy == everyone can't copy - if(everyone_mask_on & PERM_COPY) + if (everyone_mask_on & PERM_COPY) { - childSetValue("checkbox allow everyone copy",TRUE); - childSetTentative("checkbox allow everyone copy",!can_copy || !can_transfer); + childSetValue("checkbox allow everyone copy", TRUE); + childSetTentative("checkbox allow everyone copy", !can_copy || !can_transfer); } - else if(everyone_mask_off & PERM_COPY) + else if (everyone_mask_off & PERM_COPY) { - childSetValue("checkbox allow everyone copy",FALSE); - childSetTentative("checkbox allow everyone copy",false); + childSetValue("checkbox allow everyone copy", FALSE); + childSetTentative("checkbox allow everyone copy", FALSE); } else { - childSetValue("checkbox allow everyone copy",TRUE); - childSetTentative("checkbox allow everyone copy",true); + childSetValue("checkbox allow everyone copy", TRUE); + childSetTentative("checkbox allow everyone copy", TRUE); } } - if(valid_next_perms) + if (valid_next_perms) { // Modify == next owner canot modify - if(next_owner_mask_on & PERM_MODIFY) + if (next_owner_mask_on & PERM_MODIFY) { - childSetValue("checkbox next owner can modify",TRUE); - childSetTentative("checkbox next owner can modify",false); + childSetValue("checkbox next owner can modify", TRUE); + childSetTentative("checkbox next owner can modify", FALSE); } - else if(next_owner_mask_off & PERM_MODIFY) + else if (next_owner_mask_off & PERM_MODIFY) { - childSetValue("checkbox next owner can modify",FALSE); - childSetTentative("checkbox next owner can modify",false); + childSetValue("checkbox next owner can modify", FALSE); + childSetTentative("checkbox next owner can modify", FALSE); } else { - childSetValue("checkbox next owner can modify",TRUE); - childSetTentative("checkbox next owner can modify",true); + childSetValue("checkbox next owner can modify", TRUE); + childSetTentative("checkbox next owner can modify", TRUE); } // Copy == next owner cannot copy - if(next_owner_mask_on & PERM_COPY) + if (next_owner_mask_on & PERM_COPY) { - childSetValue("checkbox next owner can copy",TRUE); - childSetTentative("checkbox next owner can copy",!can_copy); + childSetValue("checkbox next owner can copy", TRUE); + childSetTentative("checkbox next owner can copy", !can_copy); } - else if(next_owner_mask_off & PERM_COPY) + else if (next_owner_mask_off & PERM_COPY) { - childSetValue("checkbox next owner can copy",FALSE); - childSetTentative("checkbox next owner can copy",FALSE); + childSetValue("checkbox next owner can copy", FALSE); + childSetTentative("checkbox next owner can copy", FALSE); } else { - childSetValue("checkbox next owner can copy",TRUE); - childSetTentative("checkbox next owner can copy",TRUE); + childSetValue("checkbox next owner can copy", TRUE); + childSetTentative("checkbox next owner can copy", TRUE); } // Transfer == next owner cannot transfer - if(next_owner_mask_on & PERM_TRANSFER) + if (next_owner_mask_on & PERM_TRANSFER) { - childSetValue("checkbox next owner can transfer",TRUE); - childSetTentative("checkbox next owner can transfer",!can_transfer); + childSetValue("checkbox next owner can transfer", TRUE); + childSetTentative("checkbox next owner can transfer", !can_transfer); } - else if(next_owner_mask_off & PERM_TRANSFER) + else if (next_owner_mask_off & PERM_TRANSFER) { - childSetValue("checkbox next owner can transfer",FALSE); - childSetTentative("checkbox next owner can transfer",FALSE); + childSetValue("checkbox next owner can transfer", FALSE); + childSetTentative("checkbox next owner can transfer", FALSE); } else { - childSetValue("checkbox next owner can transfer",TRUE); - childSetTentative("checkbox next owner can transfer",TRUE); + childSetValue("checkbox next owner can transfer", TRUE); + childSetTentative("checkbox next owner can transfer", TRUE); } } @@ -745,72 +722,76 @@ void LLSidepanelTaskInfo::refresh() LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); if (valid_sale_info) { - combo_sale_type->setValue(sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type); - combo_sale_type->setTentative(FALSE); // unfortunately this doesn't do anything at the moment. + combo_sale_type->setValue( sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type); + combo_sale_type->setTentative( FALSE); // unfortunately this doesn't do anything at the moment. } else { // default option is sell copy, determined to be safest - combo_sale_type->setValue(LLSaleInfo::FS_COPY); - combo_sale_type->setTentative(TRUE); // unfortunately this doesn't do anything at the moment. + combo_sale_type->setValue( LLSaleInfo::FS_COPY); + combo_sale_type->setTentative( TRUE); // unfortunately this doesn't do anything at the moment. } - childSetValue("checkbox for sale", num_for_sale != 0); + childSetValue("checkbox for sale", (num_for_sale != 0)); // HACK: There are some old objects in world that are set for sale, // but are no-transfer. We need to let users turn for-sale off, but only // if for-sale is set. bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY); - if (num_for_sale && has_change_sale_ability && cannot_actually_sell) + if (cannot_actually_sell) { - childSetEnabled("checkbox for sale", true); + if (num_for_sale && has_change_sale_ability) + { + childSetEnabled("checkbox for sale", true); + } } - + // Check search status of objects - BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); + const BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); bool include_in_search; - bool all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search); - childSetEnabled("search_check", has_change_sale_ability && all_volume); - childSetValue("search_check", include_in_search); - childSetTentative("search_check", ! all_include_in_search); + const BOOL all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search); + childSetEnabled("search_check", has_change_sale_ability && all_volume); + childSetValue("search_check", include_in_search); + childSetTentative("search_check", !all_include_in_search); // Click action (touch, sit, buy) U8 click_action = 0; if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action)) { LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); - if(ComboClickAction) + if (ComboClickAction) { ComboClickAction->setCurrentByIndex((S32)click_action); } } - childSetEnabled("label click action",is_perm_modify && all_volume); - childSetEnabled("clickaction",is_perm_modify && all_volume); + childSetEnabled("label click action", is_perm_modify && all_volume); + childSetEnabled("clickaction", is_perm_modify && all_volume); if (!getIsEditing()) { - const std::string no_item_names[]={ - "Object Name", - "Object Description", - "button set group", - "checkbox share with group", - "button deed", - "checkbox allow everyone move", - "checkbox allow everyone copy", - "checkbox for sale", - "sale type", - "Edit Cost", - "checkbox next owner can modify", - "checkbox next owner can copy", - "checkbox next owner can transfer", - "clickaction", - "search_check", - "perm_modify", - "Group Name", - }; - for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t) + const std::string no_item_names[] = + { + "Object Name", + "Object Description", + "button set group", + "checkbox share with group", + "button deed", + "checkbox allow everyone move", + "checkbox allow everyone copy", + "checkbox for sale", + "sale type", + "Edit Cost", + "checkbox next owner can modify", + "checkbox next owner can copy", + "checkbox next owner can transfer", + "clickaction", + "search_check", + "perm_modify", + "Group Name", + }; + for (size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t) { - childSetEnabled(no_item_names[t],false); + childSetEnabled(no_item_names[t], FALSE); } } updateVerbs(); @@ -838,13 +819,12 @@ void LLSidepanelTaskInfo::onClickGroup() BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, name); LLFloater* parent_floater = gFloaterView->getParentFloater(this); - if(owners_identical && (owner_id == gAgent.getID())) + if (owners_identical && (owner_id == gAgent.getID())) { - LLFloaterGroupPicker* fg = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); + LLFloaterGroupPicker* fg = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); if (fg) { fg->setSelectGroupCallback( boost::bind(&LLSidepanelTaskInfo::cbGroupID, this, _1) ); - if (parent_floater) { LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, fg); @@ -857,7 +837,7 @@ void LLSidepanelTaskInfo::onClickGroup() void LLSidepanelTaskInfo::cbGroupID(LLUUID group_id) { - if(mLabelGroupName) + if (mLabelGroupName) { mLabelGroupName->setNameID(group_id, TRUE); } @@ -866,23 +846,23 @@ void LLSidepanelTaskInfo::cbGroupID(LLUUID group_id) static bool callback_deed_to_group(const LLSD& notification, const LLSD& response) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) + const S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option == 0) { LLUUID group_id; - BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id); - if(group_id.notNull() && groups_identical && (gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED))) + const BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id); + if (group_id.notNull() && groups_identical && (gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED))) { LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE); // LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT); } } - return false; + return FALSE; } void LLSidepanelTaskInfo::onClickDeedToGroup() { - LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group); + LLNotificationsUtil::add("DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group); } ///---------------------------------------------------------------------------- @@ -891,8 +871,8 @@ void LLSidepanelTaskInfo::onClickDeedToGroup() void LLSidepanelTaskInfo::onCommitPerm(LLCheckBoxCtrl *ctrl, U8 field, U32 perm) { - LLViewerObject* object = mObjectSelection->getFirstRootObject(); - if(!object) return; + const LLViewerObject* object = mObjectSelection->getFirstRootObject(); + if (!object) return; BOOL new_state = ctrl->get(); LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm); @@ -960,28 +940,24 @@ void LLSidepanelTaskInfo::onCommitSaleType() void LLSidepanelTaskInfo::setAllSaleInfo() { llinfos << "LLSidepanelTaskInfo::setAllSaleInfo()" << llendl; - LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT; + LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT; LLCheckBoxCtrl *checkPurchase = getChild<LLCheckBoxCtrl>("checkbox for sale"); - // Set the sale type if the object(s) are for sale. - if(checkPurchase && checkPurchase->get()) + if (checkPurchase && checkPurchase->get()) { sale_type = static_cast<LLSaleInfo::EForSale>(getChild<LLComboBox>("sale type")->getValue().asInteger()); } S32 price = -1; - - LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); + const LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); price = (edit_price->getTentative()) ? DEFAULT_PRICE : edit_price->getValue().asInteger(); - // If somehow an invalid price, turn the sale off. if (price < 0) sale_type = LLSaleInfo::FS_NOT; - LLSaleInfo sale_info(sale_type, price); LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info); - + // If turned off for-sale, make sure click-action buy is turned // off as well if (sale_type == LLSaleInfo::FS_NOT) @@ -995,14 +971,29 @@ void LLSidepanelTaskInfo::setAllSaleInfo() } } +// static +void LLSidepanelTaskInfo::onClickForSale(LLUICtrl* ctrl, void* data) +{ + LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; + self->updateUIFromSaleInfo(); +} + +void LLSidepanelTaskInfo::updateUIFromSaleInfo() +{ + /* + TODO: Update sale button enable/disable state and default + sale button settings when this sale button is enabled/disabled. + */ +} + struct LLSelectionPayable : public LLSelectedObjectFunctor { virtual bool apply(LLViewerObject* obj) { // can pay if you or your parent has money() event in script LLViewerObject* parent = (LLViewerObject*)obj->getParent(); - return (obj->flagTakesMoney() - || (parent && parent->flagTakesMoney())); + return (obj->flagTakesMoney() || + (parent && parent->flagTakesMoney())); } }; @@ -1029,7 +1020,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action) { // Verify object has script with money() handler LLSelectionPayable payable; - bool can_pay = mObjectSelection->applyToObjects(&payable); + const BOOL can_pay = mObjectSelection->applyToObjects(&payable); if (!can_pay) { // Warn, but do it anyway. @@ -1056,8 +1047,8 @@ void LLSidepanelTaskInfo::updateVerbs() mBuyBtn->setVisible(!getIsEditing()); mOpenBtn->setEnabled(enable_object_open()); - const LLViewerObject *obj = getFirstSelectedObject(); - mEditBtn->setEnabled(obj && obj->permModify()); + //const LLViewerObject *obj = getFirstSelectedObject(); + //mEditBtn->setEnabled(obj && obj->permModify()); } void LLSidepanelTaskInfo::onOpenButtonClicked() @@ -1104,6 +1095,13 @@ LLSidepanelTaskInfo* LLSidepanelTaskInfo::getActivePanel() return sActivePanel; } +LLViewerObject* LLSidepanelTaskInfo::getObject() +{ + if (!mObject->isDead()) + return mObject; + return NULL; +} + LLViewerObject* LLSidepanelTaskInfo::getFirstSelectedObject() { LLSelectNode *node = mObjectSelection->getFirstRootNode(); diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index b6dd4dfb2ce71aadd97d96cfacc8b46932351cb9..7c6d9983aead7660646f317301b160f934f3863b 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -91,6 +91,11 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel void setAllSaleInfo(); + static void onClickForSale(LLUICtrl* ctrl, void *data); + void updateUIFromSaleInfo(); + + void disableAll(); + private: LLNameBox* mLabelGroupName; // group name @@ -107,6 +112,10 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel LLButton* mPayBtn; LLButton* mBuyBtn; +protected: + LLViewerObject* getObject(); +private: + LLViewerObject* mObject; LLObjectSelectionHandle mObjectSelection; static LLSidepanelTaskInfo* sActivePanel; }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index be0c92a76d89fea0ef872465fce6ffe9036584eb..93655eb1f1aeaa742d54ba2f5d2ad23832bb192e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -193,6 +193,7 @@ #include "lllogin.h" #include "llevents.h" +#include "llstartuplistener.h" #if LL_WINDOWS #include "llwindebug.h" @@ -241,7 +242,8 @@ static std::string gFirstSimSeedCap; static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f); static std::string gAgentStartLocation = "safe"; -static LLEventStream sStartupStateWatcher("StartupState"); +boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState")); +boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener()); // // local function declaration @@ -367,8 +369,6 @@ bool idle_startup() LLMemType mt1(LLMemType::MTYPE_STARTUP); const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay"); - const F32 TIMEOUT_SECONDS = 5.f; - const S32 MAX_TIMEOUT_COUNT = 3; static LLTimer timeout; static S32 timeout_count = 0; @@ -1436,9 +1436,9 @@ bool idle_startup() msg->addUUIDFast(_PREHASH_ID, gAgent.getID()); msg->sendReliable( gFirstSim, - MAX_TIMEOUT_COUNT, + gSavedSettings.getS32("UseCircuitCodeMaxRetries"), FALSE, - TIMEOUT_SECONDS, + gSavedSettings.getF32("UseCircuitCodeTimeout"), use_circuit_callback, NULL); @@ -2695,12 +2695,15 @@ std::string LLStartUp::startupStateToString(EStartupState state) #define RTNENUM(E) case E: return #E switch(state){ RTNENUM( STATE_FIRST ); + RTNENUM( STATE_BROWSER_INIT ); RTNENUM( STATE_LOGIN_SHOW ); RTNENUM( STATE_LOGIN_WAIT ); RTNENUM( STATE_LOGIN_CLEANUP ); RTNENUM( STATE_LOGIN_AUTH_INIT ); RTNENUM( STATE_LOGIN_PROCESS_RESPONSE ); RTNENUM( STATE_WORLD_INIT ); + RTNENUM( STATE_MULTIMEDIA_INIT ); + RTNENUM( STATE_FONT_INIT ); RTNENUM( STATE_SEED_GRANTED_WAIT ); RTNENUM( STATE_SEED_CAP_GRANTED ); RTNENUM( STATE_WORLD_WAIT ); @@ -2725,15 +2728,23 @@ void LLStartUp::setStartupState( EStartupState state ) getStartupStateString() << " to " << startupStateToString(state) << LL_ENDL; gStartupState = state; + postStartupState(); +} + +void LLStartUp::postStartupState() +{ LLSD stateInfo; stateInfo["str"] = getStartupStateString(); - stateInfo["enum"] = state; - sStartupStateWatcher.post(stateInfo); + stateInfo["enum"] = gStartupState; + sStateWatcher->post(stateInfo); } void reset_login() { + gAgent.cleanup(); + LLWorld::getInstance()->destroyClass(); + LLStartUp::setStartupState( STATE_LOGIN_SHOW ); if ( gViewerWindow ) diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index 7f869d014f8d3098586255616eaebf094d5691e0..ab11b42e7427f81c70cbddc08d68c07402e437ad 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -33,7 +33,11 @@ #ifndef LL_LLSTARTUP_H #define LL_LLSTARTUP_H +#include <boost/scoped_ptr.hpp> + class LLViewerTexture ; +class LLEventPump; +class LLStartupListener; // functions bool idle_startup(); @@ -113,9 +117,13 @@ class LLStartUp // *HACK: On startup, if we were passed a secondlife://app/do/foo // command URL, store it for later processing. + static void postStartupState(); + private: static std::string startupStateToString(EStartupState state); static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState + static boost::scoped_ptr<LLEventPump> sStateWatcher; + static boost::scoped_ptr<LLStartupListener> sListener; }; diff --git a/indra/newview/llstartuplistener.cpp b/indra/newview/llstartuplistener.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5a76a297c7ef3dca479c8cba414d05594a07277b --- /dev/null +++ b/indra/newview/llstartuplistener.cpp @@ -0,0 +1,34 @@ +/** + * @file llstartuplistener.cpp + * @author Nat Goodspeed + * @date 2009-12-08 + * @brief Implementation for llstartuplistener. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llstartuplistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llstartup.h" + + +LLStartupListener::LLStartupListener(/* LLStartUp* instance */): + LLEventAPI("LLStartUp", "Access e.g. LLStartup::postStartupState()") /* , + mStartup(instance) */ +{ + add("postStartupState", "Refresh \"StartupState\" listeners with current startup state", + &LLStartupListener::postStartupState); +} + +void LLStartupListener::postStartupState(const LLSD&) const +{ + LLStartUp::postStartupState(); +} diff --git a/indra/newview/llstartuplistener.h b/indra/newview/llstartuplistener.h new file mode 100644 index 0000000000000000000000000000000000000000..a2a4d3a08e9310c2155d3459de70f1d173a0ccc5 --- /dev/null +++ b/indra/newview/llstartuplistener.h @@ -0,0 +1,30 @@ +/** + * @file llstartuplistener.h + * @author Nat Goodspeed + * @date 2009-12-07 + * @brief Event API to provide access to LLStartUp + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLSTARTUPLISTENER_H) +#define LL_LLSTARTUPLISTENER_H + +#include "lleventapi.h" +class LLStartUp; +class LLSD; + +class LLStartupListener: public LLEventAPI +{ +public: + LLStartupListener(/* LLStartUp* instance */); // all static members! + +private: + void postStartupState(const LLSD&) const; + + //LLStartup* mStartup; +}; + +#endif /* ! defined(LL_LLSTARTUPLISTENER_H) */ diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index bef7f5d6aa6f88790f2147cfa1813391f40a360a..1ebf624eeb563f71734aef45e764b723eafc52c2 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -34,10 +34,12 @@ #include "llflatlistview.h" #include "llfloaterreg.h" +#include "llnotifications.h" #include "llsyswellwindow.h" #include "llbottomtray.h" +#include "llscriptfloater.h" #include "llviewercontrol.h" #include "llviewerwindow.h" @@ -170,6 +172,7 @@ void LLSysWellWindow::setVisible(BOOL visible) if(mChannel) { mChannel->updateShowToastsState(); + mChannel->redrawToasts(); } } @@ -188,6 +191,7 @@ void LLSysWellWindow::setDocked(bool docked, bool pop_on_undock) if(mChannel) { mChannel->updateShowToastsState(); + mChannel->redrawToasts(); } } @@ -356,7 +360,148 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask) return LLPanel::handleMouseDown(x, y, mask); } +/************************************************************************/ +/* ObjectRowPanel implementation */ +/************************************************************************/ + +LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/) + : LLPanel() + , mChiclet(NULL) +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL); + + initChiclet(object_id); + + LLTextBox* obj_name = getChild<LLTextBox>("object_name"); + obj_name->setValue(getObjectName(object_id)); + + mCloseBtn = getChild<LLButton>("hide_btn"); + mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this)); +} + +//--------------------------------------------------------------------------------- +LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel() +{ +} + +std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id) +{ + using namespace LLNotificationsUI; + LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id); + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); + if(!notification) + { + llwarns << "Invalid notification" << llendl; + return LLStringUtil::null; + } + + std::string text; + + switch(getObjectType(notification)) + { + case OBJ_SCRIPT: + text = notification->getSubstitutions()["TITLE"].asString(); + break; + case OBJ_LOAD_URL: + text = notification->getSubstitutions()["OBJECTNAME"].asString(); + break; + case OBJ_GIVE_INVENTORY: + text = notification->getSubstitutions()["NAME"].asString(); + break; + default: + text = getString("unknown_obj"); + break; + } + + return text; +} + +//--------------------------------------------------------------------------------- +void LLIMWellWindow::ObjectRowPanel::onClosePanel() +{ + LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId()); +} + +//static +LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap() +{ + object_type_map type_map; + type_map["ScriptDialog"] = OBJ_SCRIPT; + type_map["LoadWebPage"] = OBJ_LOAD_URL; + type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY; + return type_map; +} + +// static +LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification) +{ + if(!notification) + { + llwarns << "Invalid notification" << llendl; + return OBJ_UNKNOWN; + } + + static object_type_map type_map = initObjectTypeMap(); + std::string name = notification->getName(); + object_type_map::const_iterator it = type_map.find(name); + if(it != type_map.end()) + { + return it->second; + } + + llwarns << "Unknown object type" << llendl; + return OBJ_UNKNOWN; +} + +void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/) +{ + using namespace LLNotificationsUI; + LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id); + LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id); + if(!notification) + { + llwarns << "Invalid notification" << llendl; + return; + } + + // Choose which of the pre-created chiclets to use. + switch(getObjectType(notification)) + { + case OBJ_GIVE_INVENTORY: + mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet"); + break; + default: + mChiclet = getChild<LLScriptChiclet>("object_chiclet"); + break; + } + + mChiclet->setVisible(true); + mChiclet->setSessionId(object_id); +// mChiclet->setShowNewMessagesIcon(new_message); +} + +//--------------------------------------------------------------------------------- +void LLIMWellWindow::ObjectRowPanel::onMouseEnter(S32 x, S32 y, MASK mask) +{ + setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemSelected")); +} + +//--------------------------------------------------------------------------------- +void LLIMWellWindow::ObjectRowPanel::onMouseLeave(S32 x, S32 y, MASK mask) +{ + setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemUnselected")); +} + +//--------------------------------------------------------------------------------- +// virtual +BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask) +{ + // Pass the mouse down event to the chiclet (EXT-596). + if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown() + mChiclet->onMouseDown(); + return LLPanel::handleMouseDown(x, y, mask); +} /************************************************************************/ /* LLNotificationWellWindow implementation */ @@ -503,6 +648,7 @@ LLIMWellWindow::LLIMWellWindow(const LLSD& key) { LLIMMgr::getInstance()->addSessionObserver(this); LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findIMChiclet, this, _1)); + LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findObjectChiclet, this, _1)); } LLIMWellWindow::~LLIMWellWindow() @@ -557,6 +703,18 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID } } +LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id) +{ + LLChiclet* res = NULL; + ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id); + if (panel != NULL) + { + res = panel->mChiclet; + } + + return res; +} + ////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS LLChiclet* LLIMWellWindow::findIMChiclet(const LLUUID& sessionId) @@ -615,4 +773,41 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId) } } +void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/) +{ + if (mMessageList->getItemByValue(object_id) == NULL) + { + ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message); + if (mMessageList->insertItemAfter(mSeparator, item, object_id)) + { + handleItemAdded(IT_INSTANT_MESSAGE); + } + else + { + llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl; + item->die(); + } + reshapeWindow(); + } +} + +void LLIMWellWindow::removeObjectRow(const LLUUID& object_id) +{ + if (mMessageList->removeItemByValue(object_id)) + { + handleItemRemoved(IT_INSTANT_MESSAGE); + } + else + { + llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl; + } + + reshapeWindow(); + // hide chiclet window if there are no items left + if(isWindowEmpty()) + { + setVisible(FALSE); + } +} + // EOF diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index adbc83677da9563745f1872beef0467c0331184a..43b2723df02d9071481bd95ee31cb18dedd889ba 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -46,7 +46,7 @@ class LLFlatListView; class LLChiclet; class LLIMChiclet; - +class LLScriptChiclet; class LLSysWellWindow : public LLDockableFloater @@ -126,14 +126,12 @@ class LLSysWellWindow : public LLDockableFloater * * It contains a list of notifications that have not been responded to. */ -class LLNotificationWellWindow : public LLSysWellWindow, public LLInitClass<LLNotificationWellWindow> +class LLNotificationWellWindow : public LLSysWellWindow { public: LLNotificationWellWindow(const LLSD& key); static LLNotificationWellWindow* getInstance(const LLSD& key = LLSD()); - static void initClass() { getInstance(); } - /*virtual*/ BOOL postBuild(); /*virtual*/ void setVisible(BOOL visible); @@ -181,11 +179,16 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass< /*virtual*/ void sessionRemoved(const LLUUID& session_id); /*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); + void addObjectRow(const LLUUID& object_id, bool new_message = false); + void removeObjectRow(const LLUUID& object_id); + protected: /*virtual*/ const std::string& getAnchorViewName() { return IM_WELL_ANCHOR_NAME; } private: LLChiclet * findIMChiclet(const LLUUID& sessionId); + LLChiclet* findObjectChiclet(const LLUUID& object_id); + void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId); void delIMRow(const LLUUID& sessionId); @@ -210,6 +213,37 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass< LLButton* mCloseBtn; const LLSysWellWindow* mParent; }; + + class ObjectRowPanel: public LLPanel + { + typedef enum e_object_type + { + OBJ_UNKNOWN, + + OBJ_SCRIPT, + OBJ_GIVE_INVENTORY, + OBJ_LOAD_URL + }EObjectType; + + public: + ObjectRowPanel(const LLUUID& object_id, bool new_message = false); + virtual ~ObjectRowPanel(); + /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask); + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); + private: + void onClosePanel(); + static EObjectType getObjectType(const LLNotificationPtr& notification); + void initChiclet(const LLUUID& object_id, bool new_message = false); + std::string getObjectName(const LLUUID& object_id); + + typedef std::map<std::string, EObjectType> object_type_map; + static object_type_map initObjectTypeMap(); + public: + LLIMChiclet* mChiclet; + private: + LLButton* mCloseBtn; + }; }; #endif // LL_LLSYSWELLWINDOW_H diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index ef49d7f057e27a8e9d857b3f8db5bd559698b40f..e29c96bec4f8da7d55a460d096d6c844cf519b9e 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -311,10 +311,10 @@ class HTTPGetResponder : public LLCurl::Responder { bool success = false; bool partial = false; - if (200 <= status && status < 300) + if (HTTP_OK <= status && status < HTTP_MULTIPLE_CHOICES) { success = true; - if (203 == status) // partial information (i.e. last block) + if (HTTP_PARTIAL_CONTENT == status) // partial information (i.e. last block) { partial = true; } @@ -1630,6 +1630,16 @@ S32 LLTextureFetch::update(U32 max_time_ms) { sendRequestListToSimulators(); } + + if (!mThreaded) + { + // Update Curl on same thread as mCurlGetRequest was constructed + S32 processed = mCurlGetRequest->process(); + if (processed > 0) + { + lldebugs << "processed: " << processed << " messages." << llendl; + } + } return res; } diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index fc7c029a1713eec38a130c93758ae9725a255538..4131e2755a8089ba08b0edfb43281d8edca6d054 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -67,7 +67,8 @@ LLToast::LLToast(const LLToast::Params& p) mHideBtn(NULL), mNotification(p.notification), mIsHidden(false), - mHideBtnPressed(false) + mHideBtnPressed(false), + mIsTip(p.is_tip) { LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL); @@ -98,9 +99,29 @@ BOOL LLToast::postBuild() mTimer.stop(); } + if (mIsTip) + { + mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box"); + + if (mTextEditor) + { + mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this)); + mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4)); + } + } + return TRUE; } +//-------------------------------------------------------------------------- +void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask) +{ + if (!mTextEditor->getRect().pointInRect(x, y)) + { + hide(); + } +} + //-------------------------------------------------------------------------- void LLToast::setHideButtonEnabled(bool enabled) { diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index d08e46e1604d98010c9251619735b9ece519e49d..0c3c59870435267b99c15ccd37c5a035ee65e36f 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -40,6 +40,7 @@ #include "llnotificationptr.h" #include "llviewercontrol.h" +#include "lltexteditor.h" #define MOUSE_LEAVE false #define MOUSE_ENTER true @@ -155,6 +156,8 @@ class LLToast : public LLModalDialog private: + void handleTipToastClick(S32 x, S32 y, MASK mask); + // check timer bool lifetimeHasExpired(); // on timer finished function @@ -169,8 +172,9 @@ class LLToast : public LLModalDialog F32 mToastLifetime; // in seconds F32 mToastFadingTime; // in seconds - LLPanel* mPanel; - LLButton* mHideBtn; + LLPanel* mPanel; + LLButton* mHideBtn; + LLTextEditor* mTextEditor; LLColor4 mBgColor; bool mCanFade; @@ -178,6 +182,7 @@ class LLToast : public LLModalDialog bool mHideBtnEnabled; bool mHideBtnPressed; bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849) + bool mIsTip; }; } diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 7beba59c83416fddaf019a89c6423e827710f99d..ed9e2e8818fd43fc38a0f06bb16a40975faa6075 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -85,7 +85,6 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif sys_msg_icon->setVisible(FALSE); mAvatar->setValue(p.avatar_id); - setMouseDownCallback(boost::bind(&LLToastIMPanel::onClickToastIM, this)); } S32 maxLinesCount; @@ -102,11 +101,13 @@ LLToastIMPanel::~LLToastIMPanel() { } -//-------------------------------------------------------------------------- -void LLToastIMPanel::onClickToastIM() +//virtual +BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask) { - mNotification->respond(mNotification->getResponseTemplate()); -} - -//-------------------------------------------------------------------------- + if (LLPanel::handleMouseDown(x,y,mask) == FALSE) + { + mNotification->respond(mNotification->getResponseTemplate()); + } + return TRUE; +} diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h index 23f08ef6103090ee6774c37207b1c3a527516c66..53661f2cf69a142f1317263b01943dc471081b37 100644 --- a/indra/newview/lltoastimpanel.h +++ b/indra/newview/lltoastimpanel.h @@ -57,12 +57,10 @@ class LLToastIMPanel: public LLToastPanel LLToastIMPanel(LLToastIMPanel::Params &p); virtual ~LLToastIMPanel(); - + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); private: static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT; - void onClickToastIM(); - LLNotificationPtr mNotification; LLUUID mSessionID; LLAvatarIconCtrl* mAvatar; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index b367d6aec5865df1f7c2a5dee723ea9e0877681c..75092463746987f6e8f7d3525dc020408950ce28 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -773,6 +773,9 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, { LLInventoryObject* cargo = locateInventory(item, cat); + // fix for EXT-3191 + if (NULL == cargo) return; + EAcceptance item_acceptance = ACCEPT_NO; handled = handled && root_view->handleDragAndDrop(x, y, mask, FALSE, mCargoTypes[mCurItemIndex], diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 46618d40268966533287006d1ca198c41af047ec..f8c82f8b22b64881feded6201ca025050166e8de 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -47,11 +47,14 @@ #include "llurlsimstring.h" #include "llweb.h" #include "llworldmapmessage.h" +#include "llurldispatcherlistener.h" // library includes #include "llnotificationsutil.h" #include "llsd.h" +static LLURLDispatcherListener sURLDispatcherListener; + class LLURLDispatcherImpl { public: diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fea6a769c518a4600c3755de031e12b34e7899d8 --- /dev/null +++ b/indra/newview/llurldispatcherlistener.cpp @@ -0,0 +1,58 @@ +/** + * @file llurldispatcherlistener.cpp + * @author Nat Goodspeed + * @date 2009-12-10 + * @brief Implementation for llurldispatcherlistener. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llurldispatcherlistener.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llurldispatcher.h" + +LLURLDispatcherListener::LLURLDispatcherListener(/* LLURLDispatcher* instance */): + LLEventAPI("LLURLDispatcher", "Internal URL handling") /* , + mDispatcher(instance) */ +{ + add("dispatch", + "At startup time or on clicks in internal web browsers,\n" + "teleport, open map, or run requested command.\n" + "[\"url\"] string url to dispatch\n" + "[\"trusted\"] boolean indicating trusted browser [default true]", + &LLURLDispatcherListener::dispatch); + add("dispatchRightClick", "Dispatch [\"url\"] as if from a right-click on a hot link.", + &LLURLDispatcherListener::dispatchRightClick); + add("dispatchFromTextEditor", "Dispatch [\"url\"] as if from an edit field.", + &LLURLDispatcherListener::dispatchFromTextEditor); +} + +void LLURLDispatcherListener::dispatch(const LLSD& params) const +{ + // For most purposes, we expect callers to want to be trusted. + bool trusted_browser = true; + if (params.has("trusted")) + { + // But for testing, allow a caller to specify untrusted. + trusted_browser = params["trusted"].asBoolean(); + } + LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser); +} + +void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const +{ + LLURLDispatcher::dispatchRightClick(params["url"]); +} + +void LLURLDispatcherListener::dispatchFromTextEditor(const LLSD& params) const +{ + LLURLDispatcher::dispatchFromTextEditor(params["url"]); +} diff --git a/indra/newview/llurldispatcherlistener.h b/indra/newview/llurldispatcherlistener.h new file mode 100644 index 0000000000000000000000000000000000000000..894afcbb5124a14b6606625423086ddc9b587d9d --- /dev/null +++ b/indra/newview/llurldispatcherlistener.h @@ -0,0 +1,32 @@ +/** + * @file llurldispatcherlistener.h + * @author Nat Goodspeed + * @date 2009-12-10 + * @brief LLEventAPI for LLURLDispatcher + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * Copyright (c) 2009, Linden Research, Inc. + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLURLDISPATCHERLISTENER_H) +#define LL_LLURLDISPATCHERLISTENER_H + +#include "lleventapi.h" +class LLURLDispatcher; +class LLSD; + +class LLURLDispatcherListener: public LLEventAPI +{ +public: + LLURLDispatcherListener(/* LLURLDispatcher* instance */); // all static members + +private: + void dispatch(const LLSD& params) const; + void dispatchRightClick(const LLSD& params) const; + void dispatchFromTextEditor(const LLSD& params) const; + + //LLURLDispatcher* mDispatcher; +}; + +#endif /* ! defined(LL_LLURLDISPATCHERLISTENER_H) */ diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index db54a79610eadac5a2fbc2b3121a1e48b5f157ce..033d35d80ae70bde8e305f22aa47200c89abfce8 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -121,7 +121,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary() addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga", TRUE)); addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga", FALSE)); addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga", FALSE)); - addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorite", "inv_folder_plain_closed.tga", FALSE)); + addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "inv_folder_plain_closed.tga", FALSE)); addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_current_outfit.tga",TRUE)); addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga", TRUE)); diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp index 297c0cc111ad97822dc7f72c3425babf8f99f753..b8f91697e5262a83b2d62774cf10f0f395c090ef 100644 --- a/indra/newview/llviewerhelp.cpp +++ b/indra/newview/llviewerhelp.cpp @@ -49,24 +49,38 @@ void LLViewerHelp::showTopic(const std::string &topic) { - showHelp(); - // allow overriding the help server with a local help file if( gSavedSettings.getBOOL("HelpUseLocal") ) { + showHelp(); LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); helpbrowser->navigateToLocalPage( "help-offline" , "index.html" ); return; } - // use a special login topic before the user logs in + // if the help topic is empty, use the default topic std::string help_topic = topic; - if (! LLLoginInstance::getInstance()->authSuccess()) + if (help_topic.empty()) { - help_topic = preLoginTopic(); + help_topic = defaultTopic(); + } + + // f1 help topic means: if user not logged in yet, show the + // pre-login topic, otherwise show help for the focused item + if (help_topic == f1HelpTopic()) + { + if (! LLLoginInstance::getInstance()->authSuccess()) + { + help_topic = preLoginTopic(); + } + else + { + help_topic = getTopicFromFocus(); + } } // work out the URL for this topic and display it + showHelp(); const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo(); std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic, gSavedSettings, osinfo ); setRawURL( helpURL ); @@ -84,6 +98,12 @@ std::string LLViewerHelp::preLoginTopic() return "pre_login_help"; } +std::string LLViewerHelp::f1HelpTopic() +{ + // *hack: to be done properly + return "f1_help"; +} + ////////////////////////////// // our own interfaces diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h index dcb5ae32c98956b7349b37703e9adc723b2f9ffc..07971a593e919f645a72789358ebae576edef710 100644 --- a/indra/newview/llviewerhelp.h +++ b/indra/newview/llviewerhelp.h @@ -51,14 +51,17 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp> /// display the specified help topic in the help viewer /*virtual*/ void showTopic(const std::string &topic); - /// return default (fallback) topic name suitable for showTopic() - /*virtual*/ std::string defaultTopic(); - // return topic derived from viewer UI focus, else default topic std::string getTopicFromFocus(); + /// return default (fallback) topic name suitable for showTopic() + /*virtual*/ std::string defaultTopic(); + // return topic to use before the user logs in - std::string preLoginTopic(); + /*virtual*/ std::string preLoginTopic(); + + // return topic to use for the top-level help, invoked by F1 + /*virtual*/ std::string f1HelpTopic(); private: static void showHelp(); // make sure help UI is visible & raised diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 4482683400aba0b554b8294de5d581be3be77071..8dcd1b8f93a772bb221f8b734bb70bc247be9d0a 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -519,7 +519,7 @@ bool LLViewerInventoryCategory::fetchDescendents() std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents"); if (!url.empty()) //Capability found. Build up LLSD and use it. { - LLInventoryModel::startBackgroundFetch(mUUID); + gInventory.startBackgroundFetch(mUUID); } else { //Deprecated, but if we don't have a capability, use the old system. @@ -1095,72 +1095,22 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co LLInventoryType::IT_GESTURE, PERM_ALL); } - else if ("shirt" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_SHIRT); - } - else if ("pants" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_PANTS); - } - else if ("shoes" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_SHOES); - } - else if ("socks" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_SOCKS); - } - else if ("jacket" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_JACKET); - } - else if ("skirt" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_SKIRT); - } - else if ("gloves" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_GLOVES); - } - else if ("undershirt" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT); - } - else if ("underpants" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); - LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS); - } - else if ("shape" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); - LLFolderBridge::createWearable(parent_id, WT_SHAPE); - } - else if ("skin" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); - LLFolderBridge::createWearable(parent_id, WT_SKIN); - } - else if ("hair" == type_name) - { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); - LLFolderBridge::createWearable(parent_id, WT_HAIR); - } - else if ("eyes" == type_name) + else { - const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); - LLFolderBridge::createWearable(parent_id, WT_EYES); + // Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary. + EWearableType wearable_type = LLWearableDictionary::typeNameToType(type_name); + if (wearable_type >= WT_SHAPE && wearable_type < WT_COUNT) + { + LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(wearable_type); + LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(folder_type); + LLFolderBridge::createWearable(parent_id, wearable_type); + } + else + { + llwarns << "Can't create unrecognized type " << type_name << llendl; + } } - folder->setNeedsAutoRename(TRUE); } @@ -1429,6 +1379,25 @@ LLViewerInventoryCategory *LLViewerInventoryItem::getLinkedCategory() const return NULL; } +bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const +{ + const LLPermissions& perm = getPermissions(); + PermissionMask curr_mask = PERM_NONE; + if(perm.getOwner() == gAgent.getID()) + { + curr_mask = perm.getMaskBase(); + } + else if(gAgent.isInGroup(perm.getGroup())) + { + curr_mask = perm.getMaskGroup(); + } + else + { + curr_mask = perm.getMaskEveryone(); + } + return ((curr_mask & mask) == mask); +} + //---------- void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name) diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 0156e7dab16c00f1d21e0950462263c7c8f85b2e..412a2c66e65dcaf881353bb59a6ebe905c541338 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -158,6 +158,9 @@ class LLViewerInventoryItem : public LLInventoryItem, public boost::signals2::tr bool getIsBrokenLink() const; // true if the baseitem this points to doesn't exist in memory. LLViewerInventoryItem *getLinkedItem() const; LLViewerInventoryCategory *getLinkedCategory() const; + + // Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set. + bool checkPermissionsSet(PermissionMask mask) const; // callback void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 952de002720c509500fc818cdc6ba858402cdf51..57e4ed0c1ec67a0128569b4c4561918f082c4ae2 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -172,6 +172,11 @@ LOG_CLASS(LLMimeDiscoveryResponder); completeAny(status, "text/html"); } else + if(status == 403) + { + completeAny(status, "text/html"); + } + else if(status == 404) { // 404 is content not found - sites often have bespoke 404 pages so @@ -240,6 +245,7 @@ LOG_CLASS(LLMimeDiscoveryResponder); bool mInitialized; }; static LLViewerMedia::impl_list sViewerMediaImplList; +static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap; static LLTimer sMediaCreateTimer; static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f; static F32 sGlobalVolume = 1.0f; @@ -297,7 +303,7 @@ viewer_media_t LLViewerMedia::newMediaImpl( else { media_impl->unload(); - media_impl->mTextureId = texture_id; + media_impl->setTextureID(texture_id); media_impl->mMediaWidth = media_width; media_impl->mMediaHeight = media_height; media_impl->mMediaAutoScale = media_auto_scale; @@ -412,18 +418,16 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s // static LLViewerMediaImpl* LLViewerMedia::getMediaImplFromTextureID(const LLUUID& texture_id) { - impl_list::iterator iter = sViewerMediaImplList.begin(); - impl_list::iterator end = sViewerMediaImplList.end(); - - for(; iter != end; iter++) + LLViewerMediaImpl* result = NULL; + + // Look up the texture ID in the texture id->impl map. + impl_id_map::iterator iter = sViewerMediaTextureIDMap.find(texture_id); + if(iter != sViewerMediaTextureIDMap.end()) { - LLViewerMediaImpl* media_impl = *iter; - if(media_impl->getMediaTextureID() == texture_id) - { - return media_impl; - } + result = iter->second; } - return NULL; + + return result; } ////////////////////////////////////////////////////////////////////////////////////////// @@ -626,7 +630,22 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2) { - return (i1->getProximityDistance() < i2->getProximityDistance()); + if(i1->getProximityDistance() < i2->getProximityDistance()) + { + return true; + } + else if(i1->getProximityDistance() > i2->getProximityDistance()) + { + return false; + } + else + { + // Both objects have the same distance. This most likely means they're two faces of the same object. + // They may also be faces on different objects with exactly the same distance (like HUD objects). + // We don't actually care what the sort order is for this case, as long as it's stable and doesn't change when you enable/disable media. + // Comparing the impl pointers gives a completely arbitrary ordering, but it will be stable. + return (i1 < i2); + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -827,7 +846,6 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, : mMediaSource( NULL ), mMovieImageHasMips(false), - mTextureId(texture_id), mMediaWidth(media_width), mMediaHeight(media_height), mMediaAutoScale(media_auto_scale), @@ -857,6 +875,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mProximityDistance(0.0f), mMimeTypeProbe(NULL), mMediaAutoPlay(false), + mInNearbyMediaList(false), mIsUpdated(false) { @@ -868,6 +887,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, } add_media_impl(this); + + setTextureID(texture_id); // connect this media_impl to the media texture, creating it if it doesn't exist.0 // This is necessary because we need to be able to use getMaxVirtualSize() even if the media plugin is not loaded. @@ -891,6 +912,7 @@ LLViewerMediaImpl::~LLViewerMediaImpl() LLViewerMediaTexture::removeMediaImplFromTexture(mTextureId) ; + setTextureID(); remove_media_impl(this); } @@ -988,11 +1010,10 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ } else { - std::string plugins_path = gDirUtilp->getLLPluginDir(); - plugins_path += gDirUtilp->getDirDelimiter(); - std::string launcher_name = gDirUtilp->getLLPluginLauncher(); std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename); + std::string user_data_path = gDirUtilp->getOSUserAppDir(); + user_data_path += gDirUtilp->getDirDelimiter(); // See if the plugin executable exists llstat s; @@ -1008,7 +1029,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { LLPluginClassMedia* media_source = new LLPluginClassMedia(owner); media_source->setSize(default_width, default_height); - if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))) + if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"), user_data_path)) { return media_source; } @@ -2422,6 +2443,26 @@ LLVOVolume *LLViewerMediaImpl::getSomeObject() return result; } +void LLViewerMediaImpl::setTextureID(LLUUID id) +{ + if(id != mTextureId) + { + if(mTextureId.notNull()) + { + // Remove this item's entry from the map + sViewerMediaTextureIDMap.erase(mTextureId); + } + + if(id.notNull()) + { + sViewerMediaTextureIDMap.insert(LLViewerMedia::impl_id_map::value_type(id, this)); + } + + mTextureId = id; + } +} + + ////////////////////////////////////////////////////////////////////////////////////////// //static void LLViewerMedia::toggleMusicPlay(void*) diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 713eb2710b12179795143541c1a24cde1bc32d16..349a66867a1d185c1a17651107cad4c6b85d9422 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -79,6 +79,8 @@ class LLViewerMedia typedef std::vector<LLViewerMediaImpl*> impl_list; + typedef std::map<LLUUID, LLViewerMediaImpl*> impl_id_map; + // Special case early init for just web browser component // so we can show login screen. See .cpp file for details. JC @@ -287,6 +289,8 @@ class LLViewerMediaImpl LLPluginClassMedia::EPriority getPriority() { return mPriority; }; void setLowPrioritySizeLimit(int size); + + void setTextureID(LLUUID id = LLUUID::null); typedef enum { @@ -348,6 +352,7 @@ class LLViewerMediaImpl LLMimeDiscoveryResponder *mMimeTypeProbe; bool mMediaAutoPlay; std::string mMediaEntryURL; + bool mInNearbyMediaList; // used by LLFloaterNearbyMedia::refreshList() for performance reasons private: BOOL mIsUpdated ; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index cbfa585be293cd95a9525257cd63a4231ed536b9..9683ec924bdbfd83a7ffbf1485b29961c5bfc77f 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -45,6 +45,7 @@ #include "llagentwearables.h" #include "llagentpilot.h" #include "llcompilequeue.h" +#include "llconsole.h" #include "lldebugview.h" #include "llfilepicker.h" #include "llfirstuse.h" @@ -58,6 +59,7 @@ #include "llfloaterland.h" #include "llfloaterpay.h" #include "llfloaterreporter.h" +#include "llfloatersearch.h" #include "llfloaterscriptdebug.h" #include "llfloatertools.h" #include "llfloaterworldmap.h" @@ -487,7 +489,7 @@ class LLAdvancedToggleConsole : public view_listener_t } else if ("debug" == console_type) { - toggle_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) ); + toggle_visibility( (void*)static_cast<LLUICtrl*>(gDebugView->mDebugConsolep)); } else if (gTextureSizeView && "texture size" == console_type) { @@ -2697,20 +2699,24 @@ BOOL enable_has_attachments(void*) bool enable_object_mute() { LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - bool new_value = (object != NULL); - if (new_value) + if (!object) return false; + + LLVOAvatar* avatar = find_avatar_from_object(object); + if (avatar) { - LLVOAvatar* avatar = find_avatar_from_object(object); - if (avatar) - { - // It's an avatar - LLNameValue *lastname = avatar->getNVPair("LastName"); - BOOL is_linden = lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden"); - BOOL is_self = avatar->isSelf(); - new_value = !is_linden && !is_self; - } + // It's an avatar + LLNameValue *lastname = avatar->getNVPair("LastName"); + bool is_linden = + lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden"); + bool is_self = avatar->isSelf(); + return !is_linden && !is_self; + } + else + { + // Just a regular object + return LLSelectMgr::getInstance()->getSelection()-> + contains( object, SELECT_ALL_TES ); } - return new_value; } class LLObjectMute : public view_listener_t @@ -3403,6 +3409,13 @@ void set_god_level(U8 god_level) // changing god-level can affect which menus we see show_debug_menus(); + + // changing god-level can invalidate search results + LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search")); + if (search) + { + search->godLevelChanged(god_level); + } } #ifdef TOGGLE_HACKED_GODLIKE_VIEWER @@ -5562,17 +5575,8 @@ class LLShowHelp : public view_listener_t bool handleEvent(const LLSD& userdata) { std::string help_topic = userdata.asString(); - LLViewerHelp* vhelp = LLViewerHelp::getInstance(); - if (help_topic.empty()) - { - vhelp->showTopic(vhelp->getTopicFromFocus()); - } - else - { - vhelp->showTopic(help_topic); - } - + vhelp->showTopic(help_topic); return true; } }; @@ -7557,12 +7561,11 @@ void initialize_menus() LLUICtrl::EnableCallbackRegistry::Registrar& enable = LLUICtrl::EnableCallbackRegistry::currentRegistrar(); LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar(); - LLUICtrl::VisibleCallbackRegistry::Registrar& visible = LLUICtrl::VisibleCallbackRegistry::currentRegistrar(); // Generic enable and visible // Don't prepend MenuName.Foo because these can be used in any menu. enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); - visible.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); + enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); // Agent commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); @@ -7669,7 +7672,6 @@ void initialize_menus() view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink"); view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink"); view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake"); - visible.add("Tools.VisibleTakeCopy", boost::bind(&enable_object_take_copy)); enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy)); view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory"); view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory"); @@ -7845,7 +7847,6 @@ void initialize_menus() view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp"); view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments"); - visible.add("Self.VisibleStandUp", boost::bind(&enable_standup_self)); enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self)); view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments"); @@ -7868,59 +7869,42 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend"); enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); - visible.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); + enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); // Object pie menu view_listener_t::addMenu(new LLObjectBuild(), "Object.Build"); commit.add("Object.Touch", boost::bind(&handle_object_touch)); commit.add("Object.SitOrStand", boost::bind(&handle_object_sit_or_stand)); - visible.add("Object.EnableSit", boost::bind(&enable_sit_object)); + enable.add("Object.EnableSit", boost::bind(&enable_sit_object)); commit.add("Object.Delete", boost::bind(&handle_object_delete)); view_listener_t::addMenu(new LLObjectAttachToAvatar(), "Object.AttachToAvatar"); view_listener_t::addMenu(new LLObjectReturn(), "Object.Return"); view_listener_t::addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse"); view_listener_t::addMenu(new LLObjectMute(), "Object.Mute"); - visible.add("Object.VisibleTake", boost::bind(&visible_take_object)); - visible.add("Object.VisibleBuy", boost::bind(&visible_buy_object)); + enable.add("Object.VisibleTake", boost::bind(&visible_take_object)); + enable.add("Object.VisibleBuy", boost::bind(&visible_buy_object)); commit.add("Object.Buy", boost::bind(&handle_buy)); commit.add("Object.Edit", boost::bind(&handle_object_edit)); commit.add("Object.Inspect", boost::bind(&handle_object_inspect)); commit.add("Object.Open", boost::bind(&handle_object_open)); - commit.add("Object.Take", boost::bind(&handle_take)); - enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); - visible.add("Object.VisibleOpen", boost::bind(&enable_object_open)); - enable.add("Object.EnableTouch", boost::bind(&enable_object_touch)); - visible.add("Object.VisibleTouch", boost::bind(&enable_object_touch)); - view_listener_t::addMenu(new LLObjectEnableTouch(), "Object.EnableTouch"); view_listener_t::addMenu(new LLObjectEnableSitOrStand(), "Object.EnableSitOrStand"); - enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); - visible.add("Object.VisibleDelete", boost::bind(&enable_object_delete)); - enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid)); - visible.add("Object.VisibleWear", boost::bind(&object_selected_and_point_valid)); view_listener_t::addMenu(new LLObjectEnableReturn(), "Object.EnableReturn"); view_listener_t::addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse"); enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute)); enable.add("Object.EnableMute", boost::bind(&enable_object_mute)); - visible.add("Object.VisibleMute", boost::bind(&enable_object_mute)); enable.add("Object.EnableBuy", boost::bind(&enable_buy_object)); - /*view_listener_t::addMenu(new LLObjectVisibleTouch(), "Object.VisibleTouch"); - view_listener_t::addMenu(new LLObjectVisibleCustomTouch(), "Object.VisibleCustomTouch"); - view_listener_t::addMenu(new LLObjectVisibleStandUp(), "Object.VisibleStandUp"); - view_listener_t::addMenu(new LLObjectVisibleSitHere(), "Object.VisibleSitHere"); - view_listener_t::addMenu(new LLObjectVisibleCustomSit(), "Object.VisibleCustomSit");*/ - // Attachment pie menu enable.add("Attachment.Label", boost::bind(&onEnableAttachmentLabel, _1, _2)); view_listener_t::addMenu(new LLAttachmentDrop(), "Attachment.Drop"); @@ -7949,12 +7933,9 @@ void initialize_menus() commit.add("PayObject", boost::bind(&handle_give_money_dialog)); enable.add("EnablePayObject", boost::bind(&enable_pay_object)); - visible.add("VisiblePayObject", boost::bind(&enable_pay_object)); enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar)); enable.add("EnableEdit", boost::bind(&enable_object_edit)); - visible.add("VisibleBuild", boost::bind(&enable_object_build)); - visible.add("VisibleEdit", boost::bind(&enable_object_edit)); - visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit)); + enable.add("VisibleBuild", boost::bind(&enable_object_build)); view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible"); view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 89e16a3dd1eb52ced88e13a7afb41371bf1b3142..bb556ff87448c8c837df881661883a630ae56f98 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -74,15 +74,6 @@ // system libraries #include <boost/tokenizer.hpp> -class LLFileEnableSaveAs : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs(); - return new_value; - } -}; - class LLFileEnableUpload : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -430,19 +421,6 @@ class LLFileCloseAllWindows : public view_listener_t } }; -class LLFileSaveTexture : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - LLFloater* top = gFloaterView->getFrontmost(); - if (top) - { - top->saveAs(); - } - return true; - } -}; - class LLFileTakeSnapshotToDisk : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -1288,10 +1266,10 @@ void init_menu_file() view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows"); view_listener_t::addEnable(new LLFileEnableCloseWindow(), "File.EnableCloseWindow"); view_listener_t::addEnable(new LLFileEnableCloseAllWindows(), "File.EnableCloseAllWindows"); - view_listener_t::addCommit(new LLFileSaveTexture(), "File.SaveTexture"); view_listener_t::addCommit(new LLFileTakeSnapshotToDisk(), "File.TakeSnapshotToDisk"); view_listener_t::addCommit(new LLFileQuit(), "File.Quit"); view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload"); - view_listener_t::addEnable(new LLFileEnableSaveAs(), "File.EnableSaveAs"); + + // "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled. } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 17183d6a971c2c023a185a78dca62647a2e8f1c0..0f56b7ebd7634502a0d71f29ad8a7ccc08dbe2c4 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2096,8 +2096,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LLSD payload; payload["object_id"] = session_id; payload["owner_id"] = from_id; + payload["from_id"] = from_id; payload["slurl"] = location; payload["name"] = name; + std::string session_name; + gCacheName->getFullName(from_id, session_name); + payload["SESSION_NAME"] = session_name; if (from_group) { payload["groupowned"] = "true"; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 2fae78cdfb6aa2ad82a056eb378b716877cf5c94..7a1abfd4e84597eaa6e5d65e8656d80b5f588c34 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -2525,7 +2525,8 @@ boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(parcel_ */ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos) { - if (local) + // Treat only teleports within the same parcel as local (EXT-3139). + if (local && LLViewerParcelMgr::getInstance()->inAgentParcel(new_pos)) { // Local teleport. We already have the agent parcel data. // Emit the signal immediately. @@ -2533,7 +2534,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos } else { - // Non-local teleport. + // Non-local teleport (inter-region or between different parcels of the same region). // The agent parcel data has not been updated yet. // Let's wait for the update and then emit the signal. mTeleportInProgress = TRUE; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 6bd63a56e9a1e5d9c957e37e58367ea2b7d0f787..faf7a93281855d74a9f1d665554850f728f8fe34 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -2879,7 +2879,8 @@ BOOL LLViewerMediaTexture::findFaces() } S32 face_id = -1 ; - while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1) + S32 num_faces = obj->mDrawable->getNumFaces() ; + while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1 && face_id < num_faces) { LLFace* facep = obj->mDrawable->getFace(face_id) ; if(facep) diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 5be7f2945fb53a294af3df4bee3fcd27264d868f..e066546bd8108b8428d228c828576428b9cc4871 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1454,6 +1454,8 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v llclamp((F32)scale_rect.mRight / (F32)imagep->getWidth(), 0.f, 1.f), llclamp((F32)scale_rect.mBottom / (F32)imagep->getHeight(), 0.f, 1.f))); } + + imagep->onImageLoaded(); } } } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 93b0ad4a5b06b18f23f5b55f28495fc502d628e3..226d85ec9904526a7cc95ddab77da0ba3038ffc9 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5994,7 +5994,7 @@ void LLVOAvatar::updateMeshTextures() else { mBakedTextureDatas[i].mIsLoaded = FALSE; - if ( (i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER) ) + if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) { baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); } @@ -6464,7 +6464,7 @@ void LLVOAvatar::onFirstTEMessageReceived() LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ; mBakedTextureDatas[i].mLastTextureIndex = image->getID(); // If we have more than one texture for the other baked layers, we'll want to call this for them too. - if ( (i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER) ) + if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) ) { image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); } @@ -7651,6 +7651,9 @@ void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& di void LLVOAvatar::idleUpdateRenderCost() { + static const U32 ARC_BODY_PART_COST = 20; + static const U32 ARC_LIMIT = 2048; + if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME)) { return; @@ -7667,7 +7670,7 @@ void LLVOAvatar::idleUpdateRenderCost() { if (isTextureVisible(tex_index)) { - cost +=20; + cost +=ARC_BODY_PART_COST; } } } @@ -7687,7 +7690,6 @@ void LLVOAvatar::idleUpdateRenderCost() const LLDrawable* drawable = attached_object->mDrawable; if (drawable) { - cost += 10; const LLVOVolume* volume = drawable->getVOVolume(); if (volume) { @@ -7698,11 +7700,11 @@ void LLVOAvatar::idleUpdateRenderCost() } } - cost += textures.size() * 5; + cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; setDebugText(llformat("%d", cost)); - F32 green = 1.f-llclamp(((F32) cost-1024.f)/1024.f, 0.f, 1.f); - F32 red = llmin((F32) cost/1024.f, 1.f); + F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f); + F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f); mText->setColor(LLColor4(red,green,0,1)); } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7d6401acde059d94349101c94d33b08432a03eec..b4c45c23d4bf65d75aae92bce0159dc0c74d8067 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1067,19 +1067,6 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) return FALSE; } -void LLVOAvatarSelf::getAllAttachmentsArray(LLDynamicArray<S32>& attachments) -{ - for (LLVOAvatar::attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); - iter != mAttachmentPoints.end(); ++iter) - { - LLViewerJointAttachment* attachment = iter->second; - if ( attachment && (attachment->getNumObjects() > 0)) - { - attachments.push_back(iter->first); - } - } -} - U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const { EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i); diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 6bf4ef5496a2b084ba68b641ed259836434265d7..c7bd4eaadc4e5ae792a5f9e7347d42a942331753 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -284,7 +284,6 @@ class LLVOAvatarSelf : const std::string getAttachedPointName(const LLUUID& inv_item_id) const; /*virtual*/ const LLViewerJointAttachment *attachObject(LLViewerObject *viewer_object); /*virtual*/ BOOL detachObject(LLViewerObject *viewer_object); - void getAllAttachmentsArray(LLDynamicArray<S32>& attachments); //-------------------------------------------------------------------- // HUDs diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 7e1e7c940fdd333e6fd9dd9d17bf0b7a22253cb3..aa69b46857988168d9ef20ddfe53d247d2508e81 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -128,16 +128,8 @@ static int scale_mic_volume(float volume) static int scale_speaker_volume(float volume) { // incoming volume has the range [0.0 ... 1.0], with 0.5 as the default. - // Map it as follows: 0.0 -> 0, 0.5 -> 62, 1.0 -> 75 - - volume -= 0.5f; // offset volume to the range [-0.5 ... 0.5], with 0 at the default. - int scaled_volume = 62; // offset scaled_volume by its default level - if(volume < 0.0f) - scaled_volume += ((int)(volume * 124.0f)); // (62 - 0) * 2 - else - scaled_volume += ((int)(volume * 26.0f)); // (75 - 62) * 2 - - return scaled_volume; + // Map it as follows: 0.0 -> 0, 0.5 -> 50, 1.0 -> 100 + return (int)(volume * 100.0f); } class LLViewerVoiceAccountProvisionResponder : @@ -4279,6 +4271,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent( { // Send the voice chat invite to the GUI layer // *TODO: Question: Should we correlate with the mute list here? + session->mIncoming = true; session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID); session->mVoiceInvitePending = true; if(session->mName.empty()) @@ -6353,6 +6346,20 @@ LLVoiceClient::sessionState *LLVoiceClient::findSession(const LLUUID &participan return result; } +bool LLVoiceClient::isSessionIncoming(const LLUUID &session_id) +{ + for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++) + { + sessionState *session = *iter; + if(session->mIMSessionID == session_id) + { + return session->mIncoming; + break; + } + } + return false; +} + LLVoiceClient::sessionState *LLVoiceClient::addSession(const std::string &uri, const std::string &handle) { sessionState *result = NULL; diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 347fae6156b9d45e571d0e49c8757c15d2b1d4ad..92e79a004d8973d69455fa557b0239ed27a142d9 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -125,7 +125,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient> void tuningCaptureStartSendMessage(int duration); void tuningCaptureStopSendMessage(); - void tuningSetMicVolume(float volume); + void tuningSetMicVolume(float volume=0.5f); void tuningSetSpeakerVolume(float volume); float tuningGetEnergy(void); @@ -527,6 +527,8 @@ static void updatePosition(void); // Currently this will be false only for PSTN P2P calls. // NOTE: this will return true if the session can't be found. bool isSessionTextIMPossible(const LLUUID &session_id); + + bool isSessionIncoming(const LLUUID &session_id); private: diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 7debfb91863afe4c43ca4184bbbc36a01fa8973d..00b02035b5d3691a973ccd7497699006fd9c957a 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -101,7 +101,7 @@ static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures"); class LLMediaDataClientObjectImpl : public LLMediaDataClientObject { public: - LLMediaDataClientObjectImpl(LLVOVolume *obj) : mObject(obj) {} + LLMediaDataClientObjectImpl(LLVOVolume *obj, bool isNew) : mObject(obj), mNew(isNew) {} LLMediaDataClientObjectImpl() { mObject = NULL; } virtual U8 getMediaDataCount() const @@ -137,14 +137,19 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject virtual bool hasMedia() const { return mObject->hasMedia(); } - virtual void updateObjectMediaData(LLSD const &data) - { mObject->updateObjectMediaData(data); } - - virtual F64 getDistanceFromAvatar() const - { return mObject->getRenderPosition().length(); } + virtual void updateObjectMediaData(LLSD const &data, const std::string &version_string) + { mObject->updateObjectMediaData(data, version_string); } - virtual F64 getTotalMediaInterest() const - { return mObject->getTotalMediaInterest(); } + virtual F64 getMediaInterest() const + { + F64 tmp = mObject->getTotalMediaInterest(); + return (tmp < 0.0) ? mObject->getPixelArea() : tmp; + } + virtual bool isInterestingEnough() const + { + // TODO: use performance manager to control this + return true; + } virtual std::string getCapabilityUrl(const std::string &name) const { return mObject->getRegion()->getCapability(name); } @@ -152,8 +157,15 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject virtual bool isDead() const { return mObject->isDead(); } + virtual U32 getMediaVersion() const + { return LLTextureEntry::getVersionFromMediaVersionString(mObject->getMediaURL()); } + + virtual bool isNew() const + { return mNew; } + private: LLPointer<LLVOVolume> mObject; + bool mNew; }; @@ -174,6 +186,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re mSpotLightPriority = 0.f; mMediaImplList.resize(getNumTEs()); + mLastFetchedMediaVersion = -1; } LLVOVolume::~LLVOVolume() @@ -199,7 +212,9 @@ void LLVOVolume::markDead() { if (!mDead) { - // TODO: tell LLMediaDataClient to remove this object from its queue + LLMediaDataClientObject::ptr_t obj = new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false); + sObjectMediaClient->removeFromQueue(obj); + sObjectMediaNavigateClient->removeFromQueue(obj); // Detach all media impls from this object for(U32 i = 0 ; i < mMediaImplList.size() ; i++) @@ -219,8 +234,12 @@ void LLVOVolume::initClass() const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay"); const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay"); const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries"); - sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries); - sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, max_retries); + const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize"); + const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize"); + sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries, + max_sorted_queue_size, max_round_robin_queue_size); + sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay, + max_retries, max_sorted_queue_size, max_round_robin_queue_size); } // static @@ -415,7 +434,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, // If the media changed at all, request new media data LL_DEBUGS("MediaOnAPrim") << "Media update: " << getID() << ": retval=" << retval << " Media URL: " << ((mMedia) ? mMedia->mMediaURL : std::string("")) << LL_ENDL; - requestMediaDataUpdate(); + requestMediaDataUpdate(retval & MEDIA_FLAGS_CHANGED); } else { LL_INFOS("MediaOnAPrim") << "Ignoring media update for: " << getID() << " Media URL: " << @@ -1748,16 +1767,16 @@ LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id) return result; } -void LLVOVolume::requestMediaDataUpdate() +void LLVOVolume::requestMediaDataUpdate(bool isNew) { - sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this)); + sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew)); } bool LLVOVolume::isMediaDataBeingFetched() const { // I know what I'm doing by const_casting this away: this is just // a wrapper class that is only going to do a lookup. - return sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this))); + return sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false)); } void LLVOVolume::cleanUpMediaImpls() @@ -1775,18 +1794,25 @@ void LLVOVolume::cleanUpMediaImpls() } } -void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array) +void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version) { // media_data_array is an array of media entry maps + // media_version is the version string in the response. + U32 fetched_version = LLTextureEntry::getVersionFromMediaVersionString(media_version); - //llinfos << "updating:" << this->getID() << " " << ll_pretty_print_sd(media_data_array) << llendl; - - LLSD::array_const_iterator iter = media_data_array.beginArray(); - LLSD::array_const_iterator end = media_data_array.endArray(); - U8 texture_index = 0; - for (; iter != end; ++iter, ++texture_index) + // Only update it if it is newer! + if ( (S32)fetched_version > mLastFetchedMediaVersion) { - syncMediaData(texture_index, *iter, false/*merge*/, false/*ignore_agent*/); + mLastFetchedMediaVersion = fetched_version; + //llinfos << "updating:" << this->getID() << " " << ll_pretty_print_sd(media_data_array) << llendl; + + LLSD::array_const_iterator iter = media_data_array.beginArray(); + LLSD::array_const_iterator end = media_data_array.endArray(); + U8 texture_index = 0; + for (; iter != end; ++iter, ++texture_index) + { + syncMediaData(texture_index, *iter, false/*merge*/, false/*ignore_agent*/); + } } } @@ -1954,7 +1980,7 @@ void LLVOVolume::mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plu llinfos << "broadcasting navigate with URI " << new_location << llendl; - sObjectMediaNavigateClient->navigate(new LLMediaDataClientObjectImpl(this), face_index, new_location); + sObjectMediaNavigateClient->navigate(new LLMediaDataClientObjectImpl(this, false), face_index, new_location); } } @@ -2018,7 +2044,7 @@ void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, void LLVOVolume::sendMediaDataUpdate() { - sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this)); + sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false)); } void LLVOVolume::removeMediaImpl(S32 texture_index) @@ -2113,7 +2139,7 @@ viewer_media_t LLVOVolume::getMediaImpl(U8 face_id) const F64 LLVOVolume::getTotalMediaInterest() const { - F64 interest = (F64)0.0; + F64 interest = (F64)-1.0; // means not interested; int i = 0; const int end = getNumTEs(); for ( ; i < end; ++i) @@ -2121,6 +2147,7 @@ F64 LLVOVolume::getTotalMediaInterest() const const viewer_media_t &impl = getMediaImpl(i); if (!impl.isNull()) { + if (interest == (F64)-1.0) interest = (F64)0.0; interest += impl->getInterest(); } } @@ -2654,7 +2681,22 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const // children, and cost should only be increased for unique textures -Nyx U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const { - U32 shame = 0; + // base cost of each prim should be 10 points + static const U32 ARC_PRIM_COST = 10; + // per-prim costs + static const U32 ARC_INVISI_COST = 1; + static const U32 ARC_SHINY_COST = 1; + static const U32 ARC_GLOW_COST = 1; + static const U32 ARC_FLEXI_COST = 8; + static const U32 ARC_PARTICLE_COST = 16; + static const U32 ARC_BUMP_COST = 4; + + // per-face costs + static const U32 ARC_PLANAR_COST = 1; + static const U32 ARC_ANIM_TEX_COST = 4; + static const U32 ARC_ALPHA_COST = 4; + + U32 shame = ARC_PRIM_COST; U32 invisi = 0; U32 shiny = 0; @@ -2730,7 +2772,17 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const } } - shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; + + shame += invisi * ARC_INVISI_COST; + shame += shiny * ARC_SHINY_COST; + shame += glow * ARC_GLOW_COST; + shame += alpha * ARC_ALPHA_COST; + shame += flexi * ARC_FLEXI_COST; + shame += animtex * ARC_ANIM_TEX_COST; + shame += particles * ARC_PARTICLE_COST; + shame += bump * ARC_BUMP_COST; + shame += planar * ARC_PLANAR_COST; + shame += scale; LLViewerObject::const_child_list_t& child_list = getChildren(); for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 964a1d79d8efa4caf6a86b42cd9ee18e15680b53..2f39eb58e628a17a809906e39519ed9df5fa2baa 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -244,7 +244,7 @@ class LLVOVolume : public LLViewerObject // Update this object's media data with the given media data array // (typically this is only called upon a response from a server request) - void updateObjectMediaData(const LLSD &media_data_array); + void updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version); // Bounce back media at the given index to its current URL (or home URL, if current URL is empty) void mediaNavigateBounceBack(U8 texture_index); @@ -279,13 +279,16 @@ class LLVOVolume : public LLViewerObject // Returns 'true' iff the media data for this object is in flight bool isMediaDataBeingFetched() const; + // Returns the "last fetched" media version, or -1 if not fetched yet + S32 getLastFetchedMediaVersion() const { return mLastFetchedMediaVersion; } + protected: S32 computeLODDetail(F32 distance, F32 radius); BOOL calcLOD(); LLFace* addFace(S32 face_index); void updateTEData(); - void requestMediaDataUpdate(); + void requestMediaDataUpdate(bool isNew); void cleanUpMediaImpls(); void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ; void removeMediaImpl(S32 texture_index) ; @@ -309,6 +312,7 @@ class LLVOVolume : public LLViewerObject LLPointer<LLViewerFetchedTexture> mSculptTexture; LLPointer<LLViewerFetchedTexture> mLightTexture; media_list_t mMediaImplList; + S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1 // statics public: @@ -319,6 +323,8 @@ class LLVOVolume : public LLViewerObject static LLPointer<LLObjectMediaDataClient> sObjectMediaClient; static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient; + static const U32 ARC_TEXTURE_COST = 5; + protected: static S32 sNumLODChanges; diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index c8cc6a3d8ebe69540af02bf3bdcc929b7e614dad..697fefee3a5176a5a8686efe30d7a3b49d5873ed 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -91,7 +91,7 @@ LLWaterParamManager::~LLWaterParamManager() void LLWaterParamManager::loadAllPresets(const std::string& file_name) { std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "")); - LL_INFOS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL; + LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL; bool found = true; while(found) @@ -117,7 +117,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) // And repeat for user presets, note the user presets will modify any system presets already loaded std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", "")); - LL_INFOS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL; + LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL; found = true; while(found) @@ -152,7 +152,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate) escaped_filename += ".xml"; std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename)); - llinfos << "Loading water settings from " << pathName << llendl; + LL_DEBUGS2("AppInit", "Shaders") << "Loading water settings from " << pathName << LL_ENDL; llifstream presetsXML; presetsXML.open(pathName.c_str()); @@ -161,7 +161,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate) if(!presetsXML) { pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename); - llinfos << "Loading User water setting from " << pathName << llendl; + LL_DEBUGS2("AppInit", "Shaders") << "Loading User water setting from " << pathName << LL_ENDL; presetsXML.clear(); presetsXML.open(pathName.c_str()); } diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index c6fd35c1422522bec6160efcd86c63fbea01b1c3..c3a70705cfcb2ec6e2db8e7b44114e8513a8ea3d 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -109,7 +109,7 @@ LLWLParamManager::~LLWLParamManager() void LLWLParamManager::loadPresets(const std::string& file_name) { std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "")); - LL_INFOS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL; + LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL; bool found = true; while(found) @@ -135,7 +135,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name) // And repeat for user presets, note the user presets will modify any system presets already loaded std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", "")); - LL_INFOS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL; + LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL; found = true; while(found) @@ -196,7 +196,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) escaped_filename += ".xml"; std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename)); - //llinfos << "Loading WindLight sky setting from " << pathName << llendl; + LL_DEBUGS2("AppInit", "Shaders") << "Loading WindLight sky setting from " << pathName << LL_ENDL; llifstream presetsXML; presetsXML.open(pathName.c_str()); @@ -205,7 +205,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) if(!presetsXML) { pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename); - llinfos << "Loading User WindLight sky setting from " << pathName << llendl; + LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight sky setting from " << pathName << LL_ENDL; presetsXML.clear(); presetsXML.open(pathName.c_str()); } diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 5c6fc2cf219aad2be75eb36b64cd8d9e3691693e..118d7f8d08d603809a4bee3a4844f07735f49f1e 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -118,6 +118,7 @@ LLWorld::LLWorld() : void LLWorld::destroyClass() { + mHoleWaterObjects.clear(); gObjectList.destroy(); for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); ) { diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index acb3262093a80d8c73baae1fd500a70e617c2821..cdbeed111e3104e06148cc7bc9c89697f1324ab7 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -648,7 +648,7 @@ reference="LtGray" /> <color name="TextFgTentativeColor" - value="0 0 0 .33" /> + value="0.4 0.4 0.4 1" /> <color name="TimeTextColor" reference="LtGray" /> diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png new file mode 100644 index 0000000000000000000000000000000000000000..60676b43fd96e34c728bf71ab5fcfc0a442cb491 Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png new file mode 100644 index 0000000000000000000000000000000000000000..98cde96aff13e42fc24f71d793613b32737e7b34 Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1f7d3a6de4267696bb55c1f50219e948a38019 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f614b844d15e3ffc4e9dc1db7817704eedb474 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_BuildNo_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Build_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Build_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..84a96a60cb07554fd26658ebff3c1c0a09c926d2 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Build_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d55ebd7c671b908989b2623e9329ad3f74b815c2 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_DamageNo_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4077488bf17226bf97adfad7e83f3fc3ccaddd Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Damage_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Exp_Color.png b/indra/newview/skins/default/textures/icons/Parcel_Exp_Color.png new file mode 100644 index 0000000000000000000000000000000000000000..4813d37198356805ef1c67724adae778fec9a442 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Exp_Color.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0455a52fdc8bdeed55430f60db0329acece8fe62 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..be0c379d844826f4002e972497c991e22e2acc00 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4a512e04a419639f9695670697bca7dee85bb1 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.png b/indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..d28e5357dff704b3b9bd1b5b5949a5c74e1fed47 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_ForSale_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Health_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Health_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d72f02f708fcfd387dad98ea35359df06857304d Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Health_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5871b8ffcf846835da70f7576aaf8e3ae24300 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_M_Light.png b/indra/newview/skins/default/textures/icons/Parcel_M_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..724ac22744cc07f744f3960cd2f254aa478be626 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_M_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..f82354959e9750e140bb7a7937f23602187fffde Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f0565f02ddebbe0b5a734cea38baa8e99f6c02e5 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..f32b0570a128d57ed726c96e8665691cb1130c95 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0fe6a04d2b741ec114775bcddf1abe64630d6c Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..eba7070b4d2f16551f3d927d1b7efd387d2a1ca2 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_PushNo_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Push_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Push_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..08c2a18ac30a60a48359c53c25e6a3ce1c5998db Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Push_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e6e14ccab60fd3ad9f27a410639dbf19002538 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_R_Light.png b/indra/newview/skins/default/textures/icons/Parcel_R_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..efca6776da7533cadab65e3e7959d8af55155a4f Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_R_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9f37a1bf8a7c6f6818dae976804ece3f2f8af8 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_ScriptsNo_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1d6c5e1401a9cb1fbc8570fa156c1a49d1d8c5 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Scripts_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..eace54ae79dda5548b8f3ea7d50f752f4bef5864 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..0d07e552b1c5d08374702eeb3e15f965a62f7ca8 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_VoiceNo_Light.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b36a9bd2f02bd16f0fdb3eefefe753c8d530650c Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Voice_Dark.png differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Voice_Light.png b/indra/newview/skins/default/textures/icons/Parcel_Voice_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..86ce19474a7714fbe5921682d591610068b4ca30 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Parcel_Voice_Light.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ff9da8c8a03c57c4a35154914b4ac93a5250303f..0a54e1112b74ed19803c500515a947da5614b52a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -57,6 +57,9 @@ with the same filename but different name <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" /> <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" /> + <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" /> + <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" /> + <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" /> <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" /> <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" /> @@ -333,49 +336,49 @@ with the same filename but different name <texture name="Overhead_M" file_name="world/Overhead_M.png" preload="false" /> <texture name="Overhead_S" file_name="world/Overhead_S.png" preload="false" /> - <texture name="parcel_color_EVRY" file_name="icons/parcel_color_EVRY.png" preload="false" /> - <texture name="parcel_color_EXP" file_name="icons/parcel_color_EXP.png" preload="false" /> - <texture name="parcel_color_M" file_name="icons/parcel_color_M.png" preload="false" /> - - <texture name="parcel_drk_Build" file_name="icons/parcel_drk_Build.png" preload="false" /> - <texture name="parcel_drk_BuildNo" file_name="icons/parcel_drk_BuildNo.png" preload="false" /> - <texture name="parcel_drk_Damage" file_name="icons/parcel_drk_Damage.png" preload="false" /> - <texture name="parcel_drk_DamageNo" file_name="icons/parcel_drk_DamageNo.png" preload="false" /> - <texture name="parcel_drk_EVRY" file_name="icons/parcel_drk_EVRY.png" preload="false" /> - <texture name="parcel_drk_EXP" file_name="icons/parcel_drk_EXP.png" preload="false" /> - <texture name="parcel_drk_Fly" file_name="icons/parcel_drk_Fly.png" preload="false" /> - <texture name="parcel_drk_FlyNo" file_name="icons/parcel_drk_FlyNo.png" preload="false" /> - <texture name="parcel_drk_ForSale" file_name="icons/parcel_drk_ForSale.png" preload="false" /> - <texture name="parcel_drk_ForSaleNo" file_name="icons/parcel_drk_ForSaleNo.png" preload="false" /> - <texture name="parcel_drk_M" file_name="icons/parcel_drk_M.png" preload="false" /> - <texture name="parcel_drk_PG" file_name="icons/parcel_drk_PG.png" preload="false" /> - <texture name="parcel_drk_Push" file_name="icons/parcel_drk_Push.png" preload="false" /> - <texture name="parcel_drk_PushNo" file_name="icons/parcel_drk_PushNo.png" preload="false" /> - <texture name="parcel_drk_R" file_name="icons/parcel_drk_R.png" preload="false" /> - <texture name="parcel_drk_Scripts" file_name="icons/parcel_drk_Scripts.png" preload="false" /> - <texture name="parcel_drk_ScriptsNo" file_name="icons/parcel_drk_ScriptsNo.png" preload="false" /> - <texture name="parcel_drk_Voice" file_name="icons/parcel_drk_Voice.png" preload="false" /> - <texture name="parcel_drk_VoiceNo" file_name="icons/parcel_drk_VoiceNo.png" preload="false" /> - - <texture name="parcel_lght_Build" file_name="icons/parcel_lght_Build.png" preload="false" /> - <texture name="parcel_lght_BuildNo" file_name="icons/parcel_lght_BuildNo.png" preload="false" /> - <texture name="parcel_lght_Damage" file_name="icons/parcel_lght_Damage.png" preload="false" /> - <texture name="parcel_lght_DamageNo" file_name="icons/parcel_lght_DamageNo.png" preload="false" /> - <texture name="parcel_lght_EVRY" file_name="icons/parcel_lght_EVRY.png" preload="false" /> - <texture name="parcel_lght_EXP" file_name="icons/parcel_lght_EXP.png" preload="false" /> - <texture name="parcel_lght_Fly" file_name="icons/parcel_lght_Fly.png" preload="false" /> - <texture name="parcel_lght_FlyNo" file_name="icons/parcel_lght_FlyNo.png" preload="false" /> - <texture name="parcel_lght_ForSale" file_name="icons/parcel_lght_ForSale.png" preload="false" /> - <texture name="parcel_lght_ForSaleNo" file_name="icons/parcel_lght_ForSaleNo.png" preload="false" /> - <texture name="parcel_lght_M" file_name="icons/parcel_lght_M.png" preload="false" /> - <texture name="parcel_lght_PG" file_name="icons/parcel_lght_PG.png" preload="false" /> - <texture name="parcel_lght_Push" file_name="icons/parcel_lght_Push.png" preload="false" /> - <texture name="parcel_lght_PushNo" file_name="icons/parcel_lght_PushNo.png" preload="false" /> - <texture name="parcel_lght_R" file_name="icons/parcel_lght_R.png" preload="false" /> - <texture name="parcel_lght_Scripts" file_name="icons/parcel_lght_Scripts.png" preload="false" /> - <texture name="parcel_lght_ScriptsNo" file_name="icons/parcel_lght_ScriptsNo.png" preload="false" /> - <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" /> - <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" /> + <texture name="Parcel_Evry_Color" file_name="icons/Parcel_Evry_Color.png" preload="false" /> + <texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" /> + <texture name="Parcel_M_Color" file_name="icons/Parcel_M_Color.png" preload="false" /> + + <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" /> + <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" /> + <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" /> + <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" /> + <texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" /> + <texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" /> + <texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" /> + <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" /> + <texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" /> + <texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" /> + <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" /> + <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" /> + <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" /> + <texture name="Parcel_PushNo_Dark" file_name="icons/Parcel_PushNo_Dark.png" preload="false" /> + <texture name="Parcel_R_Dark" file_name="icons/Parcel_R_Dark.png" preload="false" /> + <texture name="Parcel_Scripts_Dark" file_name="icons/Parcel_Scripts_Dark.png" preload="false" /> + <texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" /> + <texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" /> + <texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" /> + + <texture name="Parcel_Build_Light" file_name="icons/Parcel_Build_Light.png" preload="false" /> + <texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" /> + <texture name="Parcel_Damage_Light" file_name="icons/Parcel_Damage_Light.png" preload="false" /> + <texture name="Parcel_DamageNo_Light" file_name="icons/Parcel_DamageNo_Light.png" preload="false" /> + <texture name="Parcel_Evry_Light" file_name="icons/Parcel_Evry_Light.png" preload="false" /> + <texture name="Parcel_Exp_Light" file_name="icons/Parcel_Exp_Light.png" preload="false" /> + <texture name="Parcel_Fly_Light" file_name="icons/Parcel_Fly_Light.png" preload="false" /> + <texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" /> + <texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" /> + <texture name="Parcel_ForSaleNo_Light" file_name="icons/Parcel_ForSaleNo_Light.png" preload="false" /> + <texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" /> + <texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" /> + <texture name="Parcel_Push_Light" file_name="icons/Parcel_Push_Light.png" preload="false" /> + <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" /> + <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" /> + <texture name="Parcel_Scripts_Light" file_name="icons/Parcel_Scripts_Light.png" preload="false" /> + <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" /> + <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" /> + <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" /> <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" /> <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" /> @@ -590,6 +593,9 @@ with the same filename but different name <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" /> <texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" /> + + <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" /> + <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" /> <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" /> <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index d1fd42bdd9077489cc3c44e4db68a47aa4217175..10b72144e709caa8423fd289c60d22237e500616 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -4,7 +4,6 @@ height="420" layout="topleft" name="floaterland" - help_topic="floaterland" save_rect="true" title="ABOUT LAND" width="490"> @@ -1857,6 +1856,10 @@ Select the thumbnail to choose a different texture. top="0" help_topic="land_access_tab" name="land_access_panel"> + <panel.string + name="access_estate_defined"> + (Defined by the Estate) + </panel.string> <panel.string name="estate_override"> One or more of these options is set at the estate level @@ -1877,7 +1880,7 @@ Select the thumbnail to choose a different texture. <check_box follows="top|left" height="16" - label="Allow Public Access" + label="Allow Public Access [MATURITY]" layout="topleft" left_delta="0" name="public_access" @@ -1893,12 +1896,12 @@ Select the thumbnail to choose a different texture. name="Only Allow" top="49" width="278"> - Block Access By: + Restrict Access to Residents verified by: </text> <check_box follows="top|left" height="16" - label="Residents who have not given payment info to Linden Lab" + label="Payment Information on File [ESTATE_PAYMENT_LIMIT]" layout="topleft" left_delta="0" name="limit_payment" @@ -1908,7 +1911,7 @@ Select the thumbnail to choose a different texture. <check_box follows="top|left" height="16" - label="Residents who are not age verified adults" + label="Age Verification [ESTATE_AGE_LIMIT]" layout="topleft" left_delta="0" name="limit_age_verified" diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index a8f875754e612735a987e88633634aba177a4cbd..4f4288b654db4f9736ac79d9faaed1095ce1f557 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -456,26 +456,43 @@ Maximum animation length is [MAX_LENGTH] seconds. image_overlay="Play_Over" image_unselected="SegmentedBtn_Left_Off" image_selected="SegmentedBtn_Left_On_Selected" - image_disabled_selected="SegmentedBtn_Left_Selected_Disabled" - image_disabled="SegmentedBtn_Left_Disabled" - image_pressed="SegmentedBtn_Left_Press" - image_pressed_selected="SegmentedBtn_Left_Selected_Press" + image_disabled_selected="SegmentedBtn_Left_Selected_Disabled" + image_disabled="SegmentedBtn_Left_Disabled" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Selected_Press" layout="topleft" left="10" name="play_btn" - tool_tip="Play/pause your animation" + tool_tip="Play your animation" top_pad="0" width="23" /> + <button + visible = "false" + follows="top|right" + height="23" + image_overlay="Pause_Over" + image_unselected="SegmentedBtn_Left_Off" + image_selected="SegmentedBtn_Left_On_Selected" + image_disabled_selected="SegmentedBtn_Left_Selected_Disabled" + image_disabled="SegmentedBtn_Left_Disabled" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Selected_Press" + layout="topleft" + left="10" + name="pause_btn" + tool_tip="Pause your animation" + top_pad="-23" + width="23" /> <button follows="top|right" height="23" image_overlay="StopReload_Over" image_unselected="SegmentedBtn_Right_Off" image_selected="SegmentedBtn_Right_On_Selected" - image_disabled_selected="SegmentedBtn_Right_Selected_Disabled" - image_disabled="SegmentedBtn_Right_Disabled" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Selected_Press" + image_disabled_selected="SegmentedBtn_Right_Selected_Disabled" + image_disabled="SegmentedBtn_Right_Disabled" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Selected_Press" layout="topleft" name="stop_btn" tool_tip="Stop animation playback" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 75711cdf89e88eb9bfe0de60b5f8fb4cf4ddc0af..26b003cafe5d28faaba604d847c7696653e95c8f 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -222,7 +222,7 @@ width="300" height="30" name="currency_links"> - [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com exchange rate] + [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml index 526fda90d1d2333945bd82640ff0488ccbc57411..acd59b6f090ef343063ffc018a1710ff175646e3 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -36,21 +36,25 @@ top="35" width="36" /> <text + clip_partial="true" font="SansSerifLarge" - height="20" + height="37" layout="topleft" left="77" name="caller name" - top="27" + top="20" + use_ellipses="true" width="315" word_wrap="true" /> <text + clip_partial="true" font="SansSerif" - height="50" + height="30" layout="topleft" left="77" name="question" - top="52" + top_pad="5" + use_ellipses="true" width="315" word_wrap="true"> Do you want to leave [CURRENT_CHAT] and join this voice chat? diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml index 19f5155f884a07132caf51ab261f5311cfc31253..b24c745bdd0bc67fc0cbf085af4fbd09335b8238 100644 --- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="150" + height="170" layout="topleft" name="floater_lagmeter" help_topic="floater_lagmeter" @@ -328,7 +328,7 @@ left="10" name="minimize" tool_tip="Toggle floater size" - top_delta="4" + top_delta="24" width="40"> <button.commit_callback function="LagMeter.ClickShrink" /> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index d182cdc6bbd1a1e0ea7ce097fa26db3aa24be3e3..2f26e5d0c146ad4bdb3879a18bb47c58d75fa14c 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -7,7 +7,6 @@ height="460" layout="topleft" name="Preferences" - help_topic="preferences" single_instance="true" title="PREFERENCES" width="620"> @@ -86,7 +85,7 @@ <panel class="panel_preference" filename="panel_preferences_alerts.xml" - label="Alerts" + label="Notifications" layout="topleft" help_topic="preferences_msgs_tab" name="msgs" /> diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 52a19ac6b3ddb90ccd9df81ba24fa6441c8d8f6d..602a18ea56c421f9755b1e3b4ee972dba2e152df 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -61,7 +61,16 @@ name="Discard" top_delta="0" width="100" /> - <text + <button + follows="left|bottom" + height="22" + label="Save As" + layout="topleft" + left_pad="5" + name="save_tex_btn" + top_delta="0" + width="100" /> + <text type="string" length="1" follows="left|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 82e4d87b287dc625de059c804ea989e5abb170fd..e6bdcdf78e6be45ece7573885d95934cf0693a60 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -55,8 +55,20 @@ layout="topleft" left_delta="0" name="status_text" - top_pad="5" + top_pad="7" 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_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml index af4fdff0446bb90e58eeea17bca9b8c3d299abf1..6050aede79e1a49b83b017e051e04e943c2d1e2e 100644 --- a/indra/newview/skins/default/xui/en/floater_select_key.xml +++ b/indra/newview/skins/default/xui/en/floater_select_key.xml @@ -4,30 +4,31 @@ border="false" can_close="false" can_minimize="false" - height="100" + height="90" layout="topleft" name="modal container" width="240"> - <button - height="20" - label="Cancel" - label_selected="Cancel" - layout="topleft" - left="138" - name="Cancel" - top="70" - width="82" /> <text type="string" + halign="center" length="1" follows="left|top" - font="SansSerif" - height="16" + height="30" layout="topleft" - left="20" + left="10" name="Save item as:" - top="10" - width="200"> - Press a key to select + top="25" + word_wrap="true" + width="220"> + Press a key to set your +Speak button toggle </text> + <button + height="23" + label="Cancel" + label_selected="Cancel" + layout="topleft" + right="-10" + name="Cancel" + width="100" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml index e6a78563f39a43d78f969e0f523a728e2245054e..409f46b9609c4f2d2a781e1c86fcbdaaea31dce8 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -182,7 +182,7 @@ width="130"> <combo_box.item enabled="false" - label="-- select one --" + label="- Select one -" name="--selectone--" value="select" /> <combo_box.item diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml index 374f01490818b62dc0acbf1079911b2d77b23d9a..bb463edd4d21eec78af68e0fd8883af78f5dd348 100644 --- a/indra/newview/skins/default/xui/en/floater_telehub.xml +++ b/indra/newview/skins/default/xui/en/floater_telehub.xml @@ -6,7 +6,7 @@ name="telehub" help_topic="telehub" title="TELEHUB" - width="280"> + width="330"> <text type="string" length="1" @@ -16,7 +16,7 @@ left="10" name="status_text_connected" top="24" - width="200"> + width="315"> Telehub connected to object [OBJECT] </text> <text @@ -28,7 +28,7 @@ left_delta="0" name="status_text_not_connected" top_delta="0" - width="200"> + width="315"> No telehub connected. </text> <text @@ -40,7 +40,7 @@ left_delta="0" name="help_text_connected" top_delta="16" - width="260"> + width="315"> To remove, click Disconnect. </text> <text @@ -52,78 +52,73 @@ left_delta="0" name="help_text_not_connected" top_delta="0" - width="260"> + width="315"> Select object and click Connect Telehub. </text> <button follows="top|left" - height="20" + height="23" label="Connect Telehub" layout="topleft" left_delta="0" name="connect_btn" top_delta="20" - width="110" /> + width="130" /> <button follows="top|left" - height="20" + height="23" label="Disconnect" layout="topleft" left_pad="10" name="disconnect_btn" top_delta="0" - width="110" /> + width="130" /> <text type="string" length="1" follows="left|top" - height="16" + height="14" layout="topleft" left="10" name="spawn_points_text" top="84" - width="200"> + width="315"> Spawn Points (positions, not objects): </text> <scroll_list follows="left|top" height="60" layout="topleft" - left_delta="0" name="spawn_points_list" - top_delta="16" - width="230" /> + width="315" /> <button follows="top|left" - height="20" + height="23" label="Add Spawn" layout="topleft" - left_delta="0" name="add_spawn_point_btn" - top_pad="5" - width="110" /> + width="130" /> <button follows="top|left" - height="20" + height="23" label="Remove Spawn" layout="topleft" left_pad="10" name="remove_spawn_point_btn" - top_delta="0" - width="110" /> + width="130" /> <text type="string" length="1" follows="top|left" - height="80" + height="56" layout="topleft" left="10" name="spawn_point_help" - top="190" - width="260"> - Select object and click Add to specify position. -You may then move or delete the object. + word_wrap="true" + width="317"> + Select object and click "Add Spawn" to specify position. +You can then move or delete the object. Positions are relative to the telehub center. -Select item in list to show position in world. +Select an item in list to highlight it inworld. </text> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml index b0aa5c7c4fc02c53f805a3e374820135dbdd4b7a..8be0c28c5c5aaf9458b352af0218966288bc412c 100644 --- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml @@ -9,7 +9,6 @@ <text_editor height="50" follows="top|left|bottom" - layout="topleft" left="10" name="test_text_editor" tool_tip="text editor" @@ -17,4 +16,15 @@ width="200"> Text Editor </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + font="SansSerif" + left="10" + name="test_text_editor" + tool_tip="text editor" + top_pad="10" + width="200"> + This contains long text and should scroll horizontally to the right + </text_editor> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 6675f4c02c9709cc4eea2737169d6bf0f79a361c..8d4f406286b71b12a60eaaec5b70bfcdd1852a16 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2672,16 +2672,15 @@ even though the user gets a free copy. top_pad="5" name="media_tex" width="260"> - Media URL + Media </text> - <line_editor + <text follows="left|top|right" height="18" layout="topleft" left="10" read_only="true" name="media_info" - select_on_focus="true" width="180" /> <button follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml index d2db26daec5f3ea0689c131e33f2e4ad34061bcf..68bb500c7857d3c283e5f5dcb2a39f752bf7a813 100644 --- a/indra/newview/skins/default/xui/en/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml @@ -8,7 +8,7 @@ min_width="450" name="top_objects" help_topic="top_objects" - title="LOADING..." + title="Top Objects" width="550"> <floater.string name="top_scripts_title"> @@ -46,24 +46,24 @@ type="string" length="1" follows="left|top" - font="SansSerif" height="20" layout="topleft" left="10" name="title_text" - top="30" + top="20" + text_color="EmphasisColor" width="400"> Loading... </text> <scroll_list draw_heading="true" - follows="left|top|bottom|right" - height="150" + follows="all" + height="170" layout="topleft" left_delta="0" multi_select="true" name="objects_list" - top_delta="20" + top_delta="17" width="530"> <scroll_list.columns label="Score" @@ -109,16 +109,16 @@ follows="left|bottom|right" height="20" layout="topleft" - left_delta="70" + left_pad="3" name="id_editor" top_delta="-3" - width="350" /> + width="325" /> <button follows="bottom|right" - height="20" + height="23" label="Show Beacon" layout="topleft" - left_pad="10" + left_pad="5" name="show_beacon_btn" top_delta="0" width="100"> @@ -132,25 +132,25 @@ height="20" layout="topleft" left="10" + top_pad="5" name="obj_name_text" - top="237" width="100"> - Object Name: + Object name: </text> <line_editor follows="left|bottom|right" height="20" layout="topleft" - left_delta="70" + left_pad="3" name="object_name_editor" top_delta="-3" - width="350" /> + width="325" /> <button follows="bottom|right" - height="20" + height="23" label="Filter" layout="topleft" - left_pad="10" + left_pad="5" name="filter_object_btn" top_delta="0" width="100"> @@ -164,46 +164,58 @@ height="20" layout="topleft" left="10" + top_pad="5" name="owner_name_text" - top="264" width="100"> - Owner Name: + Owner: </text> <line_editor follows="left|bottom|right" height="20" layout="topleft" - left_delta="70" + left_pad="3" name="owner_name_editor" top_delta="-3" - width="350" /> + width="325" /> <button follows="bottom|right" - height="20" + height="23" label="Filter" layout="topleft" - left_pad="10" + left_pad="5" name="filter_owner_btn" top_delta="0" width="100"> <button.commit_callback function="TopObjects.GetByOwnerName" /> </button> + <button + follows="top|left" + height="22" + image_overlay="Refresh_Off" + layout="topleft" + name="refresh_btn" + right="-8" + top_pad="5" + width="23"> + <button.commit_callback + function="TopObjects.Refresh" /> + </button> <button follows="bottom|left" - height="20" + height="23" label="Return Selected" layout="topleft" - left="10" + left="112" + top_delta="0" name="return_selected_btn" - top="295" width="130"> <button.commit_callback function="TopObjects.ReturnSelected" /> </button> <button follows="bottom|left" - height="20" + height="23" label="Return All" layout="topleft" left_pad="10" @@ -215,19 +227,19 @@ </button> <button follows="bottom|left" - height="20" + height="23" label="Disable Selected" layout="topleft" - left="10" + + left="112" name="disable_selected_btn" - top="320" width="130"> <button.commit_callback function="TopObjects.DisableSelected" /> </button> <button follows="bottom|left" - height="20" + height="23" label="Disable All" layout="topleft" left_pad="10" @@ -237,16 +249,4 @@ <button.commit_callback function="TopObjects.DisableAll" /> </button> - <button - bottom="315" - follows="bottom|right" - height="20" - label="Refresh" - layout="topleft" - name="refresh_btn" - right="-10" - width="100"> - <button.commit_callback - function="TopObjects.Refresh" /> - </button> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index 1ebc51f504ef494146e55cd33d88c75d03ce513f..c1a211967c18054804f1257e33cf150a7050031b 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -105,26 +105,6 @@ top="0" width="24" /> </layout_panel> - <layout_panel - layout="topleft" - name="volume_slider_panel" - top="0" - user_resize="false" - width="138"> - <slider_bar - control_name="AudioLevelMic" - follows="left|right|top" - height="24" - increment="0.05" - layout="topleft" - left="0" - max_val="2" - name="volume_slider_bar" - tool_tip="Master Volume" - top="0" - value="0.75" - width="138" /> - </layout_panel> <layout_panel auto_resize="false" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml index b13a11c05d8770ff93424aa40262ee3dcfbea803..439d68282f7c5a9357c15eebf6a2ef09b72c0aa1 100644 --- a/indra/newview/skins/default/xui/en/floater_water.xml +++ b/indra/newview/skins/default/xui/en/floater_water.xml @@ -4,7 +4,6 @@ height="240" layout="topleft" name="Water Floater" - help_topic="water_floater" save_rect="true" title="ADVANCED WATER EDITOR" width="700"> @@ -116,7 +115,7 @@ layout="topleft" left="10" name="WaterFogDensText" - top="74" + top="84" width="200"> Fog Density Exponent </text> @@ -130,7 +129,7 @@ left="24" max_val="10" name="WaterFogDensity" - top="110" + top="124" width="200" /> <text type="string" @@ -141,7 +140,7 @@ layout="topleft" left_delta="-14" name="WaterUnderWaterFogModText" - top_delta="4" + top="124" width="200"> Underwater Fog Modifier </text> @@ -155,7 +154,7 @@ left="24" max_val="2" name="WaterUnderWaterFogMod" - top="150" + top="164" width="200" /> <text type="string" @@ -180,7 +179,7 @@ layout="topleft" max_val="10" name="WaterNormalScaleX" - top_pad="20" + top_pad="24" width="200" /> <slider control_name="WaterNormalScaleY" @@ -192,7 +191,7 @@ layout="topleft" max_val="10" name="WaterNormalScaleY" - top_pad="0" + top_pad="4" width="200" /> <slider control_name="WaterNormalScaleZ" @@ -204,7 +203,7 @@ layout="topleft" max_val="10" name="WaterNormalScaleZ" - top_pad="0" + top_pad="4" width="200" /> <text type="string" @@ -214,7 +213,7 @@ height="16" layout="topleft" name="HDText" - top_pad="-10" + top="84" width="200"> Fresnel Scale </text> @@ -227,7 +226,7 @@ initial_value="0.7" layout="topleft" name="WaterFresnelScale" - top_pad="20" + top="124" width="200" /> <text type="string" @@ -237,7 +236,7 @@ height="16" layout="topleft" name="FresnelOffsetText" - top_pad="-10" + top="124" width="200"> Fresnel Offset </text> @@ -250,7 +249,7 @@ initial_value="0.7" layout="topleft" name="WaterFresnelOffset" - top_pad="20" + top="164" width="200" /> <text type="string" @@ -275,7 +274,7 @@ layout="topleft" left="494" name="WaterScaleAbove" - top="40" + top="44" width="200" /> <text type="string" @@ -286,7 +285,7 @@ layout="topleft" left_delta="-14" name="WaterScaleBelowText" - top_delta="-3" + top="44" width="200"> Refract Scale Below </text> @@ -300,7 +299,7 @@ layout="topleft" left="494" name="WaterScaleBelow" - top="73" + top="84" width="200" /> <text type="string" @@ -311,7 +310,7 @@ layout="topleft" left_delta="-14" name="MaxAltText" - top_delta="-2" + top="84" width="200"> Blur Multiplier </text> @@ -325,7 +324,7 @@ left="494" max_val="0.16" name="WaterBlurMult" - top="107" + top="124" width="200" /> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 9c11a88c34cdf24df01784bf34fb0d0adb1a4089..e632b67d119f3b7e2acc5b0a24a78797f65d1e23 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -62,7 +62,7 @@ left="4" layout="topleft" name="Show My Location" - tool_tip="Center map on your avatar's location" + tool_tip="Center map on my avatar's location" top="6" width="24" > <button.commit_callback @@ -235,7 +235,7 @@ left="136" top="6" name="Go Home" - tool_tip="Teleport home" + tool_tip="Teleport to my home location" width="24" > <button.commit_callback function="WMap.GoHome" /> diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 8349f594d9354adad340614f90291b2429cce74c..996d0f1b723eb04bed81a3b7577a8f5efe452c9e 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -33,7 +33,7 @@ [SL_PROFILE] </string> <text - follows="all" + follows="top|left" font="SansSerifLarge" height="16" left="8" @@ -44,7 +44,7 @@ value="Grumpity ProductEngine" width="175" /> <text - follows="all" + follows="top|left" height="16" left="8" name="user_subtitle" @@ -76,7 +76,7 @@ value="0.5" width="195" /> <button - follows="all" + follows="top|left" height="16" image_disabled="Audio_Off" image_disabled_selected="AudioMute_Off" @@ -89,7 +89,7 @@ name="mute_btn" width="16" /> <avatar_icon - follows="all" + follows="top|left" height="38" right="-10" bevel_style="in" @@ -102,7 +102,7 @@ llinspectavatar.cpp makes visible the most likely default action --> <button - follows="bottom|left" + follows="top|left" height="20" label="Add Friend" left="8" @@ -110,7 +110,7 @@ name="add_friend_btn" width="90" /> <button - follows="bottom|left" + follows="top|left" height="20" label="IM" left_delta="0" @@ -129,7 +129,8 @@ tab_stop="false" width="80" /> <!-- gear buttons here --> - <menu_button + <menu_button + follows="top|left" height="20" layout="topleft" image_overlay="OptionsMenu_Off" @@ -147,4 +148,33 @@ right="-5" top_delta="0" width="35" /> + <panel + follows="top|left" + top="148" + left="0" + height="60" + width="228" + visible="false" + background_visible="true" + name="moderator_panel" + background_opaque="true" + bg_opaque_color="MouseGray"> + <button + name="disable_voice" + label="Disable Voice" + top="20" + width="95" + height="20" + left="10" + commit_callback.function="InspectAvatar.DisableVoice"/> + <button + name="enable_voice" + label="Enable Voice" + top="20" + width="95" + height="20" + left="10" + visible="false" + commit_callback.function="InspectAvatar.EnableVoice"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml index b5f2abf52a61a8fc9e0489cad187cc4fda4f91f3..ef3dd844cd04fe8f2278bb9f08c4ba40e6993d14 100644 --- a/indra/newview/skins/default/xui/en/inspect_remote_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml @@ -6,10 +6,10 @@ <floater legacy_header_height="18" bevel_style="in" - bg_opaque_image="Inspector_Background" + bg_opaque_image="Inspector_Background" can_close="false" can_minimize="false" - height="145" + height="130" layout="topleft" name="inspect_remote_object" single_instance="true" @@ -18,79 +18,78 @@ width="300"> <text follows="all" - font="SansSerifLargeBold" - height="16" + font="SansSerifLarge" + font_style="BOLD" + height="30" left="8" name="object_name" text_color="White" top="5" use_ellipses="true" - width="290"> - Test Object Name That Is Really Long + word_wrap="true" + width="291"> + Test Object Name That Is Really Long OMG so long I can't believe how long the name of this object is, I mean really. </text> <text - follows="all" - font="SansSerif" - height="20" + follows="top|left" + font="SansSerifSmall" + height="16" left="8" name="object_owner_label" width="55" - top_pad="20"> + top_pad="12"> Owner: </text> <text follows="top|left" - font="SansSerif" - height="20" - left_pad="10" + height="16" + left_pad="5" name="object_owner" use_ellipses="true" - width="200" + width="230" word_wrap="false"> Longavatarname Johnsonlongstonnammer </text> - <text + <!--<text follows="top|left" - font="SansSerif" - height="20" + height="16" left="8" name="object_slurl_label" - top_pad="10" + top_pad="5" width="55"> Location: - </text> + </text>--> <text follows="top|left" - height="20" - left_pad="10" + height="16" + left="8" name="object_slurl" - width="240" + width="290" use_ellipses="true" word_wrap="false"> http://slurl.com/Ahern/50/50/50 </text> <button follows="top|left" - height="20" + height="23" label="Map" - left="10" + left="8" + top_pad="8" name="map_btn" - top="114" - width="75" /> + width="90" /> <button follows="top|left" - height="20" + height="23" label="Block" - left_pad="5" + left_pad="8" name="block_btn" - top_delta="0" - width="75" /> + width="90" /> <button follows="top|left" - height="20" + height="23" label="Close" - right="-10" + right="-8" name="close_btn" - top_delta="0" - width="75" /> + left_pad="5" + width="90" /> </floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index a11ebf5af83b3bae78d17ae9958bfb6c3c134b29..65a545d2ed80f7db1e70b1e3418d52f1720dbe75 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -19,6 +19,7 @@ mouse_opaque="false" name="nav_bar_container" width="1024" + user_resize="false" visible="false"> </layout_panel> <layout_panel auto_resize="true" @@ -43,7 +44,7 @@ layout="topleft" mouse_opaque="false" name="non_side_tray_view" - user_resize="true" + user_resize="false" width="500"> <view bottom="500" follows="all" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml index df510d68eb7dbde61e95d1ee487bb2600211e488..50910dff32437eba7156eaf03f2ca7aac9cfc720 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml @@ -9,7 +9,7 @@ visible="false" width="128"> <menu_item_call - label="Show Profile..." + label="View Profile" layout="topleft" name="Show Profile"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml index 6891aaca32a981c41b1088af47ad237d3acea1b7..038b8328cb59f8d5a5dfafd21c57ef26198c32ad 100644 --- a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml @@ -9,7 +9,7 @@ visible="false" width="128"> <menu_item_call - label="Show Profile" + label="View Profile" layout="topleft" name="Show Profile"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml index 04a247fd548cdf715d9318dc3079dc3e3ab87df6..22df02cd7e887b343dccbeb783a8c83b9c18156e 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml @@ -13,7 +13,7 @@ <menu_item_call.on_click function="InspectObject.Touch"/> <menu_item_call.on_visible - function="Object.VisibleTouch" /> + function="Object.EnableTouch" /> </menu_item_call> <menu_item_call label="Sit" @@ -31,7 +31,7 @@ <menu_item_call.on_click function="InspectObject.Pay"/> <menu_item_call.on_visible - function="VisiblePayObject" /> + function="EnablePayObject" /> </menu_item_call> <menu_item_call label="Buy" @@ -59,7 +59,7 @@ <menu_item_call.on_click function="InspectObject.TakeFreeCopy"/> <menu_item_call.on_visible - function="Tools.VisibleTakeCopy"/> + function="Tools.EnableTakeCopy"/> </menu_item_call> <menu_item_call label="Open" @@ -68,7 +68,7 @@ <menu_item_call.on_click function="InspectObject.Open"/> <menu_item_call.on_visible - function="Object.VisibleOpen" /> + function="Object.EnableOpen" /> </menu_item_call> <menu_item_call label="Edit" @@ -77,7 +77,7 @@ <menu_item_call.on_click function="Object.Edit" /> <menu_item_call.on_enable - function="Object.VisibleEdit"/> + function="EnableEdit"/> </menu_item_call> <menu_item_call label="Wear" @@ -86,7 +86,7 @@ <menu_item_call.on_click function="Object.AttachToAvatar" /> <menu_item_call.on_visible - function="Object.VisibleWear" /> + function="Object.EnableWear" /> </menu_item_call> <menu_item_call label="Report" @@ -102,7 +102,7 @@ <menu_item_call.on_click function="Object.Mute" /> <menu_item_call.on_visible - function="Object.VisibleMute" /> + function="Object.EnableMute" /> </menu_item_call> <menu_item_call label="Zoom In" @@ -118,7 +118,7 @@ <menu_item_call.on_click function="Object.Delete" /> <menu_item_call.on_visible - function="Object.VisibleDelete" /> + function="Object.EnableDelete" /> </menu_item_call> <menu_item_call label="More Info" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 3d65878cf8602f8ad6b8dc9c43ab3baf04bc1a14..9894a01701925a57d685ab220ea7a7d5db7c4043 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -13,7 +13,7 @@ function="Self.StandUp" parameter="" /> <menu_item_call.on_visible - function="Self.VisibleStandUp" /> + function="Self.EnableStandUp" /> </menu_item_call> <menu_item_call label="My Appearance" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index b65a49eaed97b1a4360f06ea50fb6194bce8a236..0f400777b82a3c8a41dc3f0551c8bc48f907a3d2 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -339,6 +339,36 @@ function="Inventory.DoToSelected" parameter="open" /> </menu_item_call> + <menu_item_separator + layout="topleft" + name="Folder Wearables Separator" /> + <menu_item_call + label="Replace Current Outfit" + layout="topleft" + name="Replace Outfit"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="replaceoutfit" /> + </menu_item_call> + <menu_item_call + label="Add To Current Outfit" + layout="topleft" + name="Add To Outfit"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="addtooutfit" /> + </menu_item_call> + <menu_item_call + label="Remove From Current Outfit" + layout="topleft" + name="Remove From Outfit"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="removefromoutfit" /> + </menu_item_call> + <menu_item_separator + layout="topleft" + name="Outfit Separator" /> <menu_item_call label="Purge Item" layout="topleft" @@ -396,7 +426,8 @@ parameter="copy_uuid" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Copy Separator" /> <menu_item_call label="Copy" layout="topleft" @@ -422,41 +453,26 @@ parameter="paste_link" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Paste Separator" /> <menu_item_call - label="Delete" + label="Remove Link" layout="topleft" - name="Delete"> + name="Remove Link"> <menu_item_call.on_click function="Inventory.DoToSelected" parameter="delete" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> <menu_item_call - label="Remove From Outfit" - layout="topleft" - name="Remove From Outfit"> - <menu_item_call.on_click - function="Inventory.DoToSelected" - parameter="removefromoutfit" /> - </menu_item_call> - <menu_item_call - label="Add To Outfit" - layout="topleft" - name="Add To Outfit"> - <menu_item_call.on_click - function="Inventory.DoToSelected" - parameter="addtooutfit" /> - </menu_item_call> - <menu_item_call - label="Replace Outfit" + label="Delete" layout="topleft" - name="Replace Outfit"> + name="Delete"> <menu_item_call.on_click function="Inventory.DoToSelected" - parameter="replaceoutfit" /> + parameter="delete" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> <menu_item_separator layout="topleft" /> <menu_item_call @@ -489,7 +505,8 @@ parameter="about" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Animation Separator" /> <menu_item_call label="Play in World" layout="topleft" @@ -507,7 +524,8 @@ parameter="playlocal" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Send Instant Message Separator" /> <menu_item_call label="Send Instant Message" layout="topleft" @@ -533,7 +551,8 @@ parameter="selected" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Gesture Separator" /> <menu_item_call label="Activate" layout="topleft" @@ -551,7 +570,8 @@ parameter="deactivate" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Texture Separator" /> <menu_item_call label="Save As" layout="topleft" @@ -561,7 +581,8 @@ parameter="save_as" /> </menu_item_call> <menu_item_separator - layout="topleft" /> + layout="topleft" + name="Attach Separator"/> <menu_item_call label="Detach From Yourself" layout="topleft" @@ -597,6 +618,9 @@ label="Attach To HUD" layout="topleft" name="Attach To HUD" /> + <menu_item_separator + layout="topleft" + name="Wearable Separator"/> <menu_item_call label="Edit" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 9b439c16e09b35c498310d2d80472ecfbef5e18c..53be40d7fd8604a3d918d0e6240e3c92168c9e10 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -45,7 +45,8 @@ name="Second Life Help" shortcut="F1"> <menu_item_call.on_click - function="ShowHelp" /> + function="ShowHelp" + parameter="f1_help" /> </menu_item_call> <menu_item_separator /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml index c3283c60143f0672cc2992e943c9921fab3f89df..0422972cd423624ddf1c2c778137e6cc4be773ad 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml @@ -2,6 +2,67 @@ <context_menu layout="topleft" name="Participant List Context Menu"> + <menu_item_call + label="View Profile" + layout="topleft" + name="View Profile"> + <menu_item_call.on_click + function="Avatar.Profile" /> + </menu_item_call> + <menu_item_call + label="Add Friend" + layout="topleft" + name="Add Friend"> + <menu_item_call.on_click + function="Avatar.AddFriend" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_add" /> + </menu_item_call> + <menu_item_call + label="IM" + layout="topleft" + name="IM"> + <menu_item_call.on_click + function="Avatar.IM" /> + </menu_item_call> + <menu_item_call + label="Call" + layout="topleft" + name="Call"> + <menu_item_call.on_click + function="Avatar.Call" /> + </menu_item_call> + <menu_item_call + enabled="false" + label="Share" + layout="topleft" + name="Share"> + <menu_item_call.on_click + function="Avatar.Share" /> + </menu_item_call> + <menu_item_call + label="Pay" + layout="topleft" + name="Pay"> + <menu_item_call.on_click + function="Avatar.Pay" /> + </menu_item_call> + <menu_item_check + label="Block/Unblock" + layout="topleft" + name="Block/Unblock"> + <menu_item_check.on_click + function="Avatar.BlockUnblock" /> + <menu_item_check.on_check + function="Avatar.CheckItem" + parameter="is_blocked" /> + <menu_item_check.on_enable + function="Avatar.EnableItem" + parameter="can_block" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> <menu_item_check label="Mute Text" layout="topleft" @@ -28,4 +89,51 @@ function="ParticipantList.EnableItem" parameter="can_allow_text_chat" /> </menu_item_check> + <menu_item_separator + layout="topleft" + name="moderate_voice_separator" /> + <menu_item_call + label="Mute this participant" + layout="topleft" + name="ModerateVoiceMuteSelected"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="selected" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Mute everyone else" + layout="topleft" + name="ModerateVoiceMuteOthers"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="others" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Unmute this participant" + layout="topleft" + name="ModerateVoiceUnMuteSelected"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="selected" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Unmute everyone else" + layout="topleft" + name="ModerateVoiceUnMuteOthers"> + <on_click + function="ParticipantList.ModerateVoice" + parameter="others" /> + <on_enable + function="ParticipantList.EnableItem" + parameter="can_moderate_voice" /> + </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index c3a2540b2e9597581330d9ebcc27c0a8d1ac1845..39469f7101c061d6abf29c5039b41f8d7f1fe9e5 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -34,7 +34,6 @@ function="Avatar.Call" /> </menu_item_call> <menu_item_call - enabled="false" label="Share" layout="topleft" name="Share"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 1f2971bae4b0c4ad5430bf2d532e6e46a1aea5ac..319930c2e904927a0a2e3e6401a8b2aefed73d4e 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -68,7 +68,7 @@ parameter="inventory" /> </menu_item_check> <menu_item_call - label="Show Sidetray Inventory" + label="Show Inventory in Side Tray" name="ShowSidetrayInventory" shortcut="control|I" visible="false"> @@ -433,6 +433,8 @@ </menu_item_check> <menu_item_separator layout="topleft" />--> + <menu_item_separator + layout="topleft" /> <menu_item_call label="Snapshot" layout="topleft" @@ -442,6 +444,8 @@ function="Floater.Show" parameter="snapshot" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> <menu create_jump_keys="true" label="Sun" @@ -1060,7 +1064,8 @@ name="Second Life Help" shortcut="F1"> <menu_item_call.on_click - function="ShowHelp" /> + function="ShowHelp" + parameter="f1_help" /> </menu_item_call> <menu_item_call label="Tutorial" @@ -1196,15 +1201,6 @@ function="ToggleControl" parameter="CompressSnapshotsToDisk" /> </menu_item_check> - <menu_item_call - label="Save Texture As" - layout="topleft" - name="Save Texture As"> - <menu_item_call.on_click - function="File.SaveTexture" /> - <menu_item_call.on_enable - function="File.EnableSaveAs" /> - </menu_item_call> <menu_item_separator layout="topleft" /> <menu @@ -3422,7 +3418,7 @@ name="Parcel" tear_off="true"> <menu_item_call - label="Owner To Me" + label="Force Owner To Me" layout="topleft" name="Owner To Me"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml new file mode 100644 index 0000000000000000000000000000000000000000..05cd8507252d619e4e05944ffb3c6474d45fbc28 --- /dev/null +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -0,0 +1,442 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<mimetypes name="default"> + <defaultlabel> + (Unknown) + </defaultlabel> + <defaultwidget> + none + </defaultwidget> + <defaultimpl> + media_plugin_webkit + </defaultimpl> + <widgetset name="web"> + <label name="web_label"> + Web Content + </label> + <icon> + icn_media_web.tga + </icon> + <default_type> + text/html + </default_type> + <tooltip name="web_tooltip"> + This location has Web content + </tooltip> + <playtip name="web_playtip"> + Show Web content + </playtip> + <allow_resize> + true + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Movie + </label> + <default_type> + video/* + </default_type> + <icon> + icn_media_movie.tga + </icon> + <tooltip name="movie_tooltip"> + There is a movie to play here + </tooltip> + <playtip name="movie_playtip"> + Play movie + </playtip> + <allow_resize> + false + </allow_resize> + <allow_looping> + true + </allow_looping> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Image + </label> + <icon> + icn_media_web.tga + </icon> + <default_type> + image/* + </default_type> + <tooltip name="image_tooltip"> + There is an image at this location + </tooltip> + <playtip name="image_playtip"> + View this location's image + </playtip> + <allow_resize> + false + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <icon> + icn_media_web.tga + </icon> + <default_type> + audio/* + </default_type> + <tooltip name="audio_tooltip"> + There is audio at this location + </tooltip> + <playtip name="audio_playtip"> + Play this location's audio + </playtip> + <allow_resize> + false + </allow_resize> + <allow_looping> + true + </allow_looping> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Real Time Streaming + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - None - + </label> + <widgettype> + none + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - None - + </label> + <widgettype> + none + </widgettype> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Audio + </label> + <widgettype> + audio + </widgettype> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + Video + </label> + <widgettype> + movie + </widgettype> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Image + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + Movie (QuickTime) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + <widgettype> + web + </widgettype> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Audio/Video + </label> + <widgettype> + audio + </widgettype> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + PDF Document + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Postscript Document + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Rich Text (RTF) + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + <widgettype> + movie + </widgettype> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Web Page (XHTML) + </label> + <widgettype> + web + </widgettype> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Audio (MIDI) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Audio (MP3) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Audio (AIFF) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Audio (WAV) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype menu="1" name="image/bmp"> + <label name="image/bmp_label"> + Image (BMP) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/gif"> + <label name="image/gif_label"> + Image (GIF) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/jpeg"> + <label name="image/jpeg_label"> + Image (JPEG) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/png"> + <label name="image/png_label"> + Image (PNG) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Image (SVG) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/tiff"> + <label name="image/tiff_label"> + Image (TIFF) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="text/html"> + <label name="text/html_label"> + Web Page + </label> + <widgettype> + web + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="text/plain"> + <label name="text/plain_label"> + Text + </label> + <widgettype> + text + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + <widgettype> + text + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="video/mpeg"> + <label name="video/mpeg_label"> + Movie (MPEG) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + Movie (MP4) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype menu="1" name="video/quicktime"> + <label name="video/quicktime_label"> + Movie (QuickTime) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + Movie (Windows Media ASF) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + Movie (Windows Media WMV) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> + <mimetype menu="1" name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + Movie (AVI) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_gstreamer + </impl> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml new file mode 100644 index 0000000000000000000000000000000000000000..76c0d027f336f42203c0da977608ced2e2740164 --- /dev/null +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -0,0 +1,442 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<mimetypes name="default"> + <defaultlabel> + (Unknown) + </defaultlabel> + <defaultwidget> + none + </defaultwidget> + <defaultimpl> + media_plugin_webkit + </defaultimpl> + <widgetset name="web"> + <label name="web_label"> + Web Content + </label> + <icon> + icn_media_web.tga + </icon> + <default_type> + text/html + </default_type> + <tooltip name="web_tooltip"> + This location has Web content + </tooltip> + <playtip name="web_playtip"> + Show Web content + </playtip> + <allow_resize> + true + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Movie + </label> + <default_type> + video/* + </default_type> + <icon> + icn_media_movie.tga + </icon> + <tooltip name="movie_tooltip"> + There is a movie to play here + </tooltip> + <playtip name="movie_playtip"> + Play movie + </playtip> + <allow_resize> + false + </allow_resize> + <allow_looping> + true + </allow_looping> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Image + </label> + <icon> + icn_media_web.tga + </icon> + <default_type> + image/* + </default_type> + <tooltip name="image_tooltip"> + There is an image at this location + </tooltip> + <playtip name="image_playtip"> + View this location's image + </playtip> + <allow_resize> + false + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Audio + </label> + <icon> + icn_media_web.tga + </icon> + <default_type> + audio/* + </default_type> + <tooltip name="audio_tooltip"> + There is audio at this location + </tooltip> + <playtip name="audio_playtip"> + Play this location's audio + </playtip> + <allow_resize> + false + </allow_resize> + <allow_looping> + true + </allow_looping> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Real Time Streaming + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - None - + </label> + <widgettype> + none + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - None - + </label> + <widgettype> + none + </widgettype> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Audio + </label> + <widgettype> + audio + </widgettype> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + Video + </label> + <widgettype> + movie + </widgettype> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Image + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + Movie (QuickTime) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + <widgettype> + web + </widgettype> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Audio/Video + </label> + <widgettype> + audio + </widgettype> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + PDF Document + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Postscript Document + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Rich Text (RTF) + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + <widgettype> + movie + </widgettype> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Web Page (XHTML) + </label> + <widgettype> + web + </widgettype> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + <widgettype> + image + </widgettype> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Audio (MIDI) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Audio (MP3) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Audio (AIFF) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Audio (WAV) + </label> + <widgettype> + audio + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype menu="1" name="image/bmp"> + <label name="image/bmp_label"> + Image (BMP) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/gif"> + <label name="image/gif_label"> + Image (GIF) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/jpeg"> + <label name="image/jpeg_label"> + Image (JPEG) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/png"> + <label name="image/png_label"> + Image (PNG) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Image (SVG) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="image/tiff"> + <label name="image/tiff_label"> + Image (TIFF) + </label> + <widgettype> + image + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="text/html"> + <label name="text/html_label"> + Web Page + </label> + <widgettype> + web + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="text/plain"> + <label name="text/plain_label"> + Text + </label> + <widgettype> + text + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + <widgettype> + text + </widgettype> + <impl> + media_plugin_webkit + </impl> + </mimetype> + <mimetype menu="1" name="video/mpeg"> + <label name="video/mpeg_label"> + Movie (MPEG) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + Movie (MP4) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype menu="1" name="video/quicktime"> + <label name="video/quicktime_label"> + Movie (QuickTime) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + Movie (Windows Media ASF) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + Movie (Windows Media WMV) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> + <mimetype menu="1" name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + Movie (AVI) + </label> + <widgettype> + movie + </widgettype> + <impl> + media_plugin_quicktime + </impl> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 4fbaf065533812609c5e6dd508a6027800bcc5b9..185b7b78f6e8d4645b138e394eaf1d5354f6c643 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -100,11 +100,11 @@ functor="GenericAcknowledge" icon="alertmodal.tga" name="MissingAlert" - label="Unknown Alert Message" + label="Unknown Notification Message" type="alertmodal"> -Your version of [APP_NAME] does not know how to display the alert it just received. Please verify that you have the latest Viewer installed. +Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed. -Error details: The alert called '[_NAME]' was not found in notifications.xml. +Error details: The notification called '[_NAME]' was not found in notifications.xml. <usetemplate name="okbutton" yestext="OK"/> @@ -579,7 +579,7 @@ Scripts must be allowed to run for weapons to work. type="alertmodal"> Multiple faces are currently selected. If you continue this action, separate instances of media will be set on multiple faces of the object. -To place the media on only one face, choose Select Texture and click on the desired face of that object then click Add. +To place the media on only one face, choose Select Face and click on the desired face of that object then click Add. <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" @@ -1688,7 +1688,7 @@ This location can play streaming media. Streaming media requires a fast Internet connection. Play streaming media when available? -(You can change this option later under Preferences > Audio & Video.) +(You can change this option later under Preferences > Privacy.) <usetemplate name="okcancelbuttons" notext="Disable" @@ -3539,6 +3539,8 @@ Type a short announcement which will be sent to everyone in this region. type="alertmodal"> The maturity rating for this region has been updated. It may take some time for the change to be reflected on the map. + +To enter Adult regions, residents must be Account Verified, either by age-verification or payment-verification. </notification> <notification @@ -3797,21 +3799,6 @@ All reported abuses are investigated and resolved. You can view the resolution b <unique/> </notification> - <notification - icon="alertmodal.tga" - name="HelpReportAbuseEmailEO" - type="alertmodal"> -IMPORTANT: This report will go to the owner of the region you are currently in and not to Linden Lab. - -As a service to residents and visitors, the owner of the region you are in has elected to receive and resolve all reports originating in this region. Linden Lab will not investigate reports you file from this location. - -The region owner will resolve reports based on the local rules of this region as outlined in the estate Covenant. -(View covenants by going to the World menu and selecting About Land.) - -The resolution of this report applies only to this Region. Residents' access to other areas of [SECOND_LIFE] will not be affected by the outcome of this report. Only Linden Lab can restrict access to the entirety of [SECOND_LIFE]. - <unique/> - </notification> - <notification icon="alertmodal.tga" name="HelpReportAbuseSelectCategory" @@ -4719,10 +4706,6 @@ The objects on the selected parcel that are NOT owned by you have been returned type="notify"> Message from [NAME]: [MSG] - <usetemplate - name="okcancelbuttons" - notext="OK" - yestext="Inspect"/> </notification> <notification @@ -5754,6 +5737,23 @@ You just entered a region using a different server version, which may affect per The SLurl you clicked on is not supported. </notification> + <notification + icon="notifytip.tga" + name="BlockedSLURL" + priority="high" + type="notifytip"> +A SLurl was received from an untrusted browser and has been blocked for your security. + </notification> + + <notification + icon="notifytip.tga" + name="ThrottledSLURL" + priority="high" + type="notifytip"> +Multiple SLurls were received from an untrusted browser within a short period. +They will be blocked for a few seconds for your security. + </notification> + <notification name="IMToast" type="notifytoast"> [MESSAGE] <form name="form"> diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml new file mode 100644 index 0000000000000000000000000000000000000000..7657fb8055f32bb6f27a2c4c411baf4f186c6f49 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + name="panel_activeim_row" + layout="topleft" + follows="left|right" + top="0" + left="0" + height="35" + width="318" + background_opaque="false" + background_visible="true" + bg_alpha_color="0.0 0.0 0.0 0.0" > + <string + name="unknown_obj"> + Unknown Object + </string> + <chiclet_script + name="object_chiclet" + layout="topleft" + follows="left" + top="3" + left="5" + height="25" + width="25" + visible="false" + speaker.name="speaker_p2p" + speaker.width="20" + speaker.height="25" + speaker.left="25" + speaker.top="25" + speaker.auto_update="true" + speaker.draw_border="false" + speaker.visible="false"> + </chiclet_script> + <chiclet_offer + name="inv_offer_chiclet" + layout="topleft" + follows="left" + top="3" + left="5" + height="25" + width="25" + visible="false" + speaker.name="speaker_p2p" + speaker.width="20" + speaker.height="25" + speaker.left="25" + speaker.top="25" + speaker.auto_update="true" + speaker.draw_border="false" + speaker.visible="false"> + </chiclet_offer> + <text + type="string" + name="object_name" + layout="topleft" + top="10" + left_pad="20" + height="14" + width="245" + length="1" + follows="right|left" + use_ellipses="true" + font="SansSerifBold"> + Unnamed Object + </text> + <button + top="10" + right="-5" + width="17" + height="17" + layout="topleft" + follows="right" + name="hide_btn" + mouse_opaque="true" + label="" + tab_stop="false" + image_unselected="Toast_CloseBtn" + image_selected="Toast_CloseBtn" + /> +</panel> \ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml index 3842c2a8db833e48184703e5ae7ba5965e67ddcf..970a2e6a8a5a7bf26a23e76e3871c704fe467aa2 100644 --- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml @@ -8,31 +8,31 @@ min_height="350" min_width="240" width="280"> - <text + <button + follows="top|left" + height="25" + image_overlay="BackArrow_Off" + layout="topleft" + name="back" + left="10" + tab_stop="false" + top="0" + width="25"/> + <text follows="top|left|right" - font="SansSerifHugeBold" + font="SansSerifLargeBold" height="20" layout="topleft" - left="10" + left_pad="10" name="title_text" text_color="white" - top="0" + top="5" width="250"> Blocked List </text> - <button - follows="top|right" - height="25" - image_overlay="BackArrow_Off" - layout="topleft" - name="back" - right="-9" - tab_stop="false" - top="0" - width="25"/> <scroll_list - follows="left|top|right|bottom" - height="200" + follows="all" + height="190" layout="topleft" left="5" name="blocked" @@ -41,9 +41,8 @@ width="270" /> <button follows="left|bottom" - height="20" - label="Block Resident..." - label_selected="Block Resident..." + height="23" + label="Block person" layout="topleft" left_delta="0" name="Block resident..." @@ -55,9 +54,8 @@ </button> <button follows="left|bottom" - height="20" - label="Block object by name..." - label_selected="Block object by name..." + height="23" + label="Block object by name" layout="topleft" left_delta="0" name="Block object by name..." @@ -70,9 +68,8 @@ <button enabled="false" follows="left|bottom" - height="20" + height="23" label="Unblock" - label_selected="Unblock" layout="topleft" left_delta="0" name="Unblock" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 7f847237ce4de908566fd18d79f75c87a55aa504..a41d492624bc48c72f3fb5ccd942416fdc81522f 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -324,6 +324,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. min_width="34" user_resize="false"> <chiclet_im_well + flash_period="0.3" follows="right" height="23" layout="topleft" @@ -331,6 +332,14 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. name="im_well" top="4" width="34"> + <!-- +Emulate 4 states of button by background images, see detains in EXT-3147. The same should be for notification_well button +xml attribute Description +image_unselected "Unlit" - there are no new messages +image_selected "Unlit" + "Selected" - there are no new messages and the Well is open +image_pressed "Lit" - there are new messages +image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open + --> <button auto_resize="true" flash_color="EmphasisColor" @@ -339,10 +348,11 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. height="23" image_overlay="Notices_Unread" image_overlay_alignment="center" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" image_selected="PushButton_Selected_Press" left="0" + max_displayed_count="99" name="Unread IM messages" pad_left="0" pad_right="0" @@ -365,17 +375,19 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. min_width="34" user_resize="false"> <chiclet_notification + flash_period="0.25" follows="right" height="23" layout="topleft" left="0" + max_displayed_count="99" name="notification_well" top="4" width="34"> <button image_selected="PushButton_Selected_Press" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" + image_pressed="WellButton_Lit" + image_pressed_selected="WellButton_Lit_Selected" auto_resize="true" halign="center" height="23" diff --git a/indra/newview/skins/default/xui/en/panel_classified.xml b/indra/newview/skins/default/xui/en/panel_classified.xml index 962231378623465b98b3b3bb3ef5e3034ac87cbf..c8293d366395b3e9517c78b4ba7486ffa751edc1 100644 --- a/indra/newview/skins/default/xui/en/panel_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_classified.xml @@ -107,7 +107,7 @@ top="48" width="130"> <combo_box.item - label="- Select Mature -" + label="- Select one -" name="select_mature" value="Select" /> <combo_box.item diff --git a/indra/newview/skins/default/xui/en/panel_friends.xml b/indra/newview/skins/default/xui/en/panel_friends.xml index 3a35465df27f7c79c40d01a6ec332d7ad8a6e5a1..ac731bcdf009e24d9e9bc1badf7784dcdec2e96b 100644 --- a/indra/newview/skins/default/xui/en/panel_friends.xml +++ b/indra/newview/skins/default/xui/en/panel_friends.xml @@ -8,7 +8,7 @@ width="100"> <panel.string name="Multiple"> - Multiple friends... + Multiple friends </panel.string> <scroll_list bottom="337" @@ -84,7 +84,7 @@ <button follows="top|right" height="22" - label="Teleport..." + label="Teleport" layout="topleft" left_delta="0" name="offer_teleport_btn" @@ -94,7 +94,7 @@ <button follows="top|right" height="22" - label="Pay..." + label="Pay" layout="topleft" left_delta="0" name="pay_btn" @@ -104,7 +104,7 @@ <button follows="top|right" height="22" - label="Remove..." + label="Remove" layout="topleft" left_delta="0" name="remove_btn" @@ -114,7 +114,7 @@ <button follows="top|right" height="22" - label="Add..." + label="Add" layout="topleft" left_delta="0" name="add_btn" diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 889f29fc5390c8c4a6cd3da0444355b3f2cfc514..a5445a57831b000b8b92988e9a8799dda4020081 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -1,14 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" - follows="left|top|right|bottom" + follows="all" height="238" name="panel_im_control_panel" width="180"> - <avatar_list color="DkGray2" - follows="left|top|right|bottom" + follows="all" height="100" ignore_online_status="true" layout="topleft" @@ -19,20 +18,18 @@ show_profile_btn="false" show_speaking_indicator="false" top="10" - width="180"/> - + width="180" /> <button bottom_pad="0" - follows="left|right|bottom" - height="20" - label="Group Info" + follows="left|right|bottom" + height="23" + label="Group Profile" left_delta="28" name="group_info_btn" - width="125"/> - + width="125" /> <panel background_visible="true" - bg_alpha_color="0.2 0.2 0.2 1" + bg_alpha_color="DkGray2" border="false" follows="left|right|bottom" height="70" @@ -41,34 +38,29 @@ name="panel_call_buttons" top_pad="0" width="180"> - <button bottom="10" - follows="all" - height="20" + follows="all" + height="23" label="Call Group" left_delta="28" name="call_btn" - width="125"/> - + width="125" /> <button bottom="40" - follows="all" - height="20" + follows="all" + height="23" label="Leave Call" name="end_call_btn" visible="false" - width="125"/> - + width="125" /> <button bottom="10" - follows="all" - height="20" + follows="all" + height="23" label="Open Voice Controls" name="voice_ctrls_btn" visible="false" - width="125"/> - + width="125" /> </panel> - </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 043edd10e1967aec67978d0f42c886e4fc8e4e07..af73faf9a1d4315dfd8d9c517af1a9ae0a506001 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -23,7 +23,7 @@ Hover your mouse over the options for more help. </panel.string> <text_editor type="string" - follows="left|top" + follows="left|top|right" left="5" height="60" layout="topleft" @@ -37,7 +37,7 @@ Hover your mouse over the options for more help. <name_list column_padding="0" draw_heading="true" - follows="left|top" + follows="left|top|right" heading_height="20" height="156" layout="topleft" @@ -55,10 +55,10 @@ Hover your mouse over the options for more help. relative_width="0.4" /> </name_list> <text - follows="left|top" + follows="left|top|right" type="string" height="12" - layout="topleft" + layout="left|top|right" left="5" name="active_title_label" top_pad="5" @@ -66,7 +66,7 @@ Hover your mouse over the options for more help. My Title </text> <combo_box - follows="left|top" + follows="left|top|right" height="20" layout="topleft" left="5" @@ -98,7 +98,7 @@ Hover your mouse over the options for more help. bevel_style="in" border="true" bg_alpha_color="FloaterUnfocusBorderColor" - follows="left|top" + follows="left|top|right" height="88" layout="topleft" left="2" @@ -106,7 +106,7 @@ Hover your mouse over the options for more help. name="preferences_container" top_pad="2"> <check_box - follows="right|top" + follows="right|top|left" height="16" label="Open enrollment" layout="topleft" @@ -126,26 +126,26 @@ Hover your mouse over the options for more help. width="300" /> <spinner decimal_digits="0" - follows="left|top" + follows="left|top|right" halign="left" height="16" increment="1" label_width="15" label="L$" layout="topleft" - right="-10" + right="-30" max_val="99999" left_pad="0" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked." - width="100" /> + width="80" /> <combo_box - follows="left|top" + follows="left|top|right" height="20" layout="topleft" left="10" name="group_mature_check" - tool_tip="Sets whether your group information is considered moderate" + tool_tip="Sets whether your group contains information rated as Moderate" top_pad="0" width="190"> <combo_box.item @@ -158,7 +158,7 @@ Hover your mouse over the options for more help. value="Mature" /> </combo_box> <check_box - follows="left|top" + follows="left|top|right" height="16" initial_value="true" label="Show in search" diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 0dea81eefe068caa55b8c1be1ce66791a36371df..1b70b95a93265017f74199d1df97d28150481b69 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -10,11 +10,9 @@ width="310"> <panel.string name="help_text"> - Notices let you send a message and -an optionally attached item. Notices only go to -group members in Roles with the ability to -receive Notices. You can turn off Notices on -the General tab. + Notices let you send a message and an optionally attached item. +Notices only go to group members in Roles with the ability to receive Notices. +You can turn off Notices on the General tab. </panel.string> <panel.string name="no_notices_text"> @@ -31,7 +29,7 @@ the General tab. name="lbl2" top="5" width="300"> - Notices are kept for 14 days + Notices are kept for 14 days. Maximum 200 per group daily </text> <scroll_list @@ -93,6 +91,7 @@ Maximum 200 per group daily layout="topleft" name="refresh_notices" right="-5" + tool_tip="Refresh list of notices" top_delta="0" width="23" /> <panel @@ -192,7 +191,7 @@ Maximum 200 per group daily top_pad="15" word_wrap="true" width="150"> - Drag here to attach something -- > + Drag and drop item here to attach it: </text> <icon height="72" @@ -228,7 +227,7 @@ Maximum 200 per group daily left="10" layout="topleft" name="drop_target" - tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." + tool_tip="Drag an inventory item onto this target box to send it with this notice. You must have permission to copy and transfer the item in order to attach it." width="280" /> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index a5bab3232cfd2b5158ee531adf5da39ab103b17e..9548119d58753abbae2d81af9abfe054af8345eb 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -258,7 +258,7 @@ things in this group. There's a broad variety of Abilities. name="static" top_pad="5" width="300"> - Assigned Roles + Assigned Members </text> <scroll_list draw_stripes="true" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index a219e30b8bc8c28d5150aa3d87b429bf56145d12..68e58b27ec2df9aede053e6a9b20e276b413a134 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -46,13 +46,13 @@ <!-- Texture names for rating icons --> <string name="icon_PG" - value="parcel_drk_PG" /> + value="Parcel_PG_Dark" /> <string name="icon_M" - value="parcel_drk_M" /> + value="Parcel_M_Dark" /> <string name="icon_R" - value="parcel_drk_R" /> + value="Parcel_R_Dark" /> <button follows="top|right" height="23" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index c52b0c83d0df30ca1e1d127074d83890d87c357d..1f211c0fed74538853c74bd0fb88e835aa0e023a 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -32,7 +32,7 @@ left="0" mouse_opaque="true" name="favorites_list" - start_folder="Favorite" + start_folder="Favorites" width="380"/> </accordion_tab> <accordion_tab diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 22977b2274d97693449c84c207c6f351f94c79c6..c9db75b5d86c3c0d1efa26441bc55d409419bb39 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -1,211 +1,212 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - follows="all" - height="600" - layout="topleft" - left="0" - name="panel_login" - top="600" +follows="all" +height="600" +layout="topleft" +left="0" +name="panel_login" +top="600" width="996"> - <panel.string +<panel.string name="create_account_url"> - http://join.secondlife.com/ - </panel.string> - <panel.string + http://join.secondlife.com/ +</panel.string> +<panel.string name="real_url"> - http://secondlife.com/app/login/ - </panel.string> + http://secondlife.com/app/login/ +</panel.string> <string name="reg_in_client_url"> - http://secondlife.eniac15.lindenlab.com/reg-in-client/ - </string> - <panel.string + http://secondlife.eniac15.lindenlab.com/reg-in-client/ +</string> +<panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp --> - <web_browser - border_visible="false" - bottom="600" - follows="all" - hide_loading="true" - left="0" - name="login_html" - start_url="" - top="0" - height="600" + http://secondlife.com/account/request.php +</panel.string> +<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp --> +<web_browser +border_visible="false" +bottom="600" +follows="all" +hide_loading="true" +left="0" +name="login_html" +start_url="" +top="0" +height="600" width="996" /> - <panel - follows="left|bottom|right" - name="login_widgets" - layout="topleft" - top="519" - width="996" +<panel +follows="left|bottom|right" +name="login_widgets" +layout="topleft" +top="519" +width="996" height="80"> - <text - follows="left|bottom" - font="SansSerifSmall" - height="16" - left="20" - name="first_name_text" - top="20" - width="150"> - Name: - </text> - <line_editor - follows="left|bottom" - handle_edit_keys_directly="true" - height="22" - label="First" - left_delta="0" - max_length="31" - name="first_name_edit" - select_on_focus="true" - tool_tip="[SECOND_LIFE] First Name" - top_pad="0" - width="135" /> - <line_editor - follows="left|bottom" - handle_edit_keys_directly="true" - height="22" - label="Last" - left_pad="8" - max_length="31" - name="last_name_edit" - select_on_focus="true" - tool_tip="[SECOND_LIFE] Last Name" - top_delta="0" - width="135" /> - <text - follows="left|bottom" - font="SansSerifSmall" - height="15" - left_pad="8" - name="password_text" - top="20" - width="150"> - Password: - </text> - <line_editor - follows="left|bottom" - handle_edit_keys_directly="true" - height="22" - left="304" - max_length="16" - name="password_edit" - select_on_focus="true" - top_pad="1" - width="135" /> - <check_box - control_name="RememberPassword" - follows="left|bottom" - font="SansSerifSmall" - height="16" - label="Remember" - left_pad="20" - top="20" - name="remember_check" - width="150" /> - <button - follows="left|bottom" - height="23" - image_unselected="PushButton_On" - image_selected="PushButton_On_Selected" - label="Log In" - label_color="White" - layout="topleft" - left="462" - name="connect_btn" - top="35" - width="90" /> - <text - follows="right|bottom" - font="SansSerifSmall" - height="15" - halign="right" - left_pad="10" - right="-240" - name="start_location_text" - top="20" - width="130"> - Starting location: - </text> - <combo_box - allow_text_entry="true" - control_name="LoginLocation" - follows="right|bottom" - height="23" - max_chars="128" - top_pad="0" - name="start_location_combo" +<text +follows="left|bottom" +font="SansSerifSmall" +height="16" +left="20" +name="first_name_text" +top="20" +width="150"> +First name: +</text> +<line_editor +follows="left|bottom" +handle_edit_keys_directly="true" +height="22" +label="First" +left_delta="0" +max_length="31" +name="first_name_edit" +select_on_focus="true" +tool_tip="[SECOND_LIFE] First Name" +top_pad="0" + width="135" /> + <text + follows="left|bottom" + font="SansSerifSmall" + height="16" + left_pad="8" + name="last_name_text" + top="20" + width="150"> + Last name: </text> +<line_editor +follows="left|bottom" +handle_edit_keys_directly="true" +height="22" +label="Last" +max_length="31" +name="last_name_edit" +select_on_focus="true" +tool_tip="[SECOND_LIFE] Last Name" + top_pad="0" + width="135" /> +<text +follows="left|bottom" +font="SansSerifSmall" +height="15" +left_pad="8" +name="password_text" +top="20" + width="150"> + Password: +</text> +<line_editor +follows="left|bottom" +handle_edit_keys_directly="true" + height="22" + max_length="16" +name="password_edit" +select_on_focus="true" + top_pad="0" + width="135" /> + <check_box +control_name="RememberPassword" +follows="left|bottom" +font="SansSerifSmall" +height="16" +label="Remember" + top_pad="3" + name="remember_check" + width="135" /> + <text + follows="left|bottom" + font="SansSerifSmall" + height="15" + left_pad="8" + name="start_location_text" +top="20" + width="130"> + Start at: + </text> +<combo_box +allow_text_entry="true" +control_name="LoginLocation" + follows="left|bottom" + height="23" +max_chars="128" +top_pad="0" +name="start_location_combo" width="135"> - <combo_box.item - label="My last location" - name="MyLastLocation" +<combo_box.item +label="My last location" +name="MyLastLocation" value="last" /> - <combo_box.item - label="My home" - name="MyHome" +<combo_box.item +label="My home" +name="MyHome" value="home" /> - <combo_box.item - label="<Type region name>" - name="Typeregionname" - value="" /> - </combo_box> - <combo_box - allow_text_entry="true" - font="SansSerifSmall" - follows="right|bottom" - height="23" - layout="topleft" - top_pad="2" - name="server_combo" - width="135" - visible="false" /> - <text - follows="right|bottom" - font="SansSerifSmall" - text_color="EmphasisColor" - halign="right" - height="16" - top="12" - left_pad="5" - right="-10" - name="create_new_account_text" - width="180"> - Sign up for account - </text> - <text - follows="right|bottom" - font="SansSerifSmall" - text_color="EmphasisColor" - halign="right" - height="16" - name="forgot_password_text" - top_pad="2" - width="180"> - Forgot your name or password? - </text> - <text - follows="right|bottom" - font="SansSerifSmall" - text_color="EmphasisColor" - halign="right" - height="16" - name="login_help" - top_pad="2" - width="180"> - Need help logging in? - </text> - <text - follows="right|bottom" - font="SansSerifSmall" - halign="right" - height="28" - top_pad="2" - name="channel_text" - width="180" - word_wrap="true"> - [VERSION] - </text> - </panel> +<combo_box.item +label="<Type region name>" +name="Typeregionname" value="" /> +</combo_box> +<combo_box +allow_text_entry="true" +font="SansSerifSmall" + follows="left|bottom" + height="23" +layout="topleft" +top_pad="2" +name="server_combo" +width="135" + visible="false" /> +<button + follows="left|bottom" + height="23" + image_unselected="PushButton_On" + image_selected="PushButton_On_Selected" + label="Log In" + label_color="White" + layout="topleft" + left_pad="15" + name="connect_btn" + top="35" + width="90" /> + <text +follows="right|bottom" +font="SansSerifSmall" +text_color="EmphasisColor" +halign="right" +height="16" +top="12" +left_pad="5" +right="-10" +name="create_new_account_text" + width="180"> + Sign up + </text> +<text +follows="right|bottom" +font="SansSerifSmall" +text_color="EmphasisColor" +halign="right" +height="16" +name="forgot_password_text" top_pad="12" + width="180"> + Forgot your name or password? +</text> +<text +follows="right|bottom" +font="SansSerifSmall" +text_color="EmphasisColor" +halign="right" +height="16" +name="login_help" +top_pad="2" + width="180"> + Need help logging in? </text> +<!-- <text + follows="right|bottom" + font="SansSerifSmall" + halign="right" + height="28" + top_pad="2" + name="channel_text" + width="180" + word_wrap="true"> + [VERSION] + </text>--> +</panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 94a54f08e4d9b9f3e3cba8517f58a8228cd8e624..c0168f62881b9a7059f68b49b545d8c611b90660 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -16,40 +16,44 @@ <filter_editor text_pad_left="14" follows="left|top|right" - font="SanSerif" - height="20" + height="23" label="Filter" layout="topleft" left="15" +max_length="300" name="inventory search editor" - top="34" - width="300" /> + top="26" + width="303" /> <tab_container - follows="left|top|right|bottom" +follows="all" +halign="center" height="300" layout="topleft" left_delta="-4" name="inventory filter tabs" + tab_height="30" tab_position="top" + tab_min_width="100" top_pad="4" width="305"> <inventory_panel - follows="left|top|right|bottom" + border="false" + follows="all" height="295" - label="All Items" + label="MY INVENTORY" layout="topleft" - left="1" + left="0" name="All Items" top="16" width="290" /> <inventory_panel - follows="left|top|right|bottom" + border="false" + follows="all" height="295" - label="Recent Items" + label="RECENT" layout="topleft" left_delta="0" name="Recent Items" - top_delta="0" width="290" /> </tab_container> @@ -106,12 +110,12 @@ <menu_bar bg_visible="false" follows="left|top|right" - height="18" + height="20" layout="topleft" - left_delta="0" + left="10" mouse_opaque="false" name="Inventory Menu" - top="15" + top="0" visible="true" width="290"> <menu diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index b82a435b415c0739e5204a1c527824db7dd18455..24c40b32fba71044489b1eeae39d84bbc7d402d1 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -71,7 +71,7 @@ name="current_url_label"> Current URL: </text> - <line_editor + <text bottom_delta="-20" enabled="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml index 7d9350b45f950e16aa1d7c88fe014da8f64f9757..6e82713f06278e34b99c5c7696bb5a975e5d4cd1 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml @@ -35,10 +35,10 @@ right="-35" width="16" height="16" - image_name="parcel_color_EXP" + image_name="Parcel_Exp_Color" mouse_opaque="true" follows="top|left" - name="parcel_color_EXP" + name="Parcel_Exp_Color" /> <text visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml index 3c8733119943c4ed3fc3b8714401885bf9a48335..d51893793c789489a05f6d03779389c1677a40cd 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -27,7 +27,7 @@ <string name="no_partner_text" value="None" /> - <string + <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> @@ -156,8 +156,8 @@ Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. </expandable_text> </panel> - - + + <!-- <panel name="lifes_images_panel" follows="left|top|right" @@ -207,10 +207,10 @@ top="25" width="18" /> </panel> --> - - - - + + + + <text type="string" follows="left|top" @@ -254,7 +254,7 @@ layout="topleft" left="10" name="register_date" - value="05/31/1976" + value="05/31/2376" width="280" word_wrap="true" /> <text @@ -351,11 +351,11 @@ name="profile_buttons_panel" top_pad="2" bottom="10" - height="19" + height="23" width="303"> <button follows="bottom|left" - height="19" + height="23" label="Add Friend" layout="topleft" left="0" @@ -365,7 +365,7 @@ width="75" /> <button follows="bottom|left" - height="19" + height="23" label="IM" layout="topleft" name="im" @@ -374,7 +374,7 @@ width="45" /> <button follows="bottom|left" - height="19" + height="23" label="Call" layout="topleft" name="call" @@ -384,7 +384,7 @@ <button enabled="false" follows="bottom|left" - height="19" + height="23" label="Map" layout="topleft" name="show_on_map_btn" @@ -393,7 +393,7 @@ width="45" /> <button follows="bottom|left" - height="19" + height="23" label="Teleport" layout="topleft" name="teleport" @@ -408,11 +408,11 @@ top_pad="-17" name="profile_me_buttons_panel" visible="false" - height="19" + height="23" width="303"> <button follows="bottom|right" - height="19" + height="23" left="10" label="Edit Profile" name="edit_profile_btn" @@ -420,7 +420,7 @@ width="130" /> <button follows="bottom|right" - height="19" + height="23" label="Edit Appearance" left_pad="10" name="edit_appearance_btn" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index de612fbbc3117455b977bd338137a19004a41ca8..2543656a8bd9c73222005e90bc3e6f65538a62e9 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -22,6 +22,7 @@ label="Click here to chat." layout="topleft" left_delta="7" + text_pad_right="25" left="0" max_length="512" name="chat_box" @@ -37,7 +38,7 @@ left_pad="-24" mouse_opaque="true" name="chat_zone_indicator" - top="1" + top="6" visible="true" width="20" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml index c02dabed2c160ae8897dfc9b2124f9d501acb206..9e7c9477d4616e1754d7c3f87a73196566b0983d 100644 --- a/indra/newview/skins/default/xui/en/panel_notes.xml +++ b/indra/newview/skins/default/xui/en/panel_notes.xml @@ -120,6 +120,7 @@ left="0" mouse_opaque="false" name="add_friend" + tool_tip="Offer friendship to the resident" top="5" width="55" /> <button @@ -128,6 +129,7 @@ label="IM" layout="topleft" name="im" + tool_tip="Open instant message session" top="5" left_pad="5" width="40" /> @@ -137,6 +139,7 @@ label="Call" layout="topleft" name="call" + tool_tip="Call this resident" left_pad="5" top="5" width="55" /> @@ -147,6 +150,7 @@ label="Map" layout="topleft" name="show_on_map_btn" + tool_tip="Show the resident on the map" top="5" left_pad="5" width="50" /> @@ -156,6 +160,7 @@ label="Teleport" layout="topleft" name="teleport" + tool_tip="Offer teleport" left_pad="5" top="5" width="90" /> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 51997a2813b3a60a220d89f3420eff21afe9017e..db95d01b43503b02e036101f3cc20341e226ba4f 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -1,56 +1,54 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="Outfits" - bottom="0" - height="326" - left="0" - width="310" - border="true" - follows="left|top|right|bottom"> +<panel name="Outfits" + height="510" + width="333" + follows="top|left" + left="0" + top_pad="0"> <accordion - follows="left|top|right|bottom" - height="315" - layout="topleft" - left="0" + single_expansion="true" + height="510" + layout="topleft" + left="0" + follows="top|left" name="outfits_accordion" - top="2" - width="310"> - <accordion_tab - layout="topleft" - name="tab_outfits" - title="Outfits"> - <inventory_panel - allow_multi_select="true" - border="true" - bottom="0" - follows="left|top|right|bottom" - height="326" - left="0" + top_pad="0" + width="333"> + <accordion_tab + expanded="false" + layout="topleft" + name="tab_cof" + title="Current Outfit"> + <inventory_panel + allow_multi_select="true" + border="false" + height="460" + left="0" + top="0" mouse_opaque="true" - name="outfitslist_accordionpanel" - width="310" - start_folder="My Outfits"/> + name="cof_accordionpanel" + start_folder="Current Outfit" /> </accordion_tab> <accordion_tab - layout="topleft" - name="tab_cof" - title="Current Outfit"> - <inventory_panel - allow_multi_select="true" - border="true" - bottom="0" - follows="left|top|right|bottom" - height="326" - left="0" + expanded="true" + layout="topleft" + name="tab_outfits" + title="My Outfits"> + <inventory_panel + allow_multi_select="true" + border="false" + follows="all" + left="0" + top="0" + height="460" mouse_opaque="true" - name="cof_accordionpanel" - width="310" - start_folder="Current Outfit"/> + name="outfitslist_accordionpanel" + start_folder="My Outfits" /> </accordion_tab> </accordion> - - <button bottom="0" + <!--<button bottom="0" halign="center" - height="16" + height="23" label=">" enabled="false" mouse_opaque="false" @@ -59,54 +57,5 @@ left="0" visible="false" follows="right|bottom" - tool_tip="View outfit properties"/> - <panel - background_visible="true" - bevel_style="none" - bottom="0" - follows="left|right|bottom" - height="30" - layout="bottomleft" - left="0" - visible="true" - name="bottom_panel" - width="310"> - <button - follows="bottom|left" - tool_tip="Show additional options" - height="18" - image_disabled="OptionsMenu_Disabled" - image_selected="OptionsMenu_Press" - image_unselected="OptionsMenu_Off" - layout="topleft" - left="10" - name="options_gear_btn" - picture_style="true" - top="6" - width="18" /> - <button - follows="bottom|left" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" - layout="topleft" - left_pad="5" - name="add_btn" - picture_style="true" - tool_tip="Add new item" - width="18" /> - <dnd_button - follows="bottom|right" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - layout="topleft" - right="-5" - name="trash_btn" - picture_style="true" - tool_tip="Remove selected item" - top="6" - width="18" /> - </panel> + tool_tip="View outfit properties" />--> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml index c8c79f87615493e144e86e61d762156b1fc1babf..7b88fca7c367135b07bce5db424ad8f3bb71d0a8 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml @@ -7,29 +7,65 @@ name="menu_gear_default" visible="false"> <menu_item_call - label="New Outfit" + label="Replace Current Outfit" layout="topleft" - name="new"> + name="wear"> <on_click function="panel_outfits_inventory_gear_default.Custom.Action" - parameter="new" /> + parameter="wear" /> <on_enable function="panel_outfits_inventory_gear_default.Enable" - parameter="new" /> + parameter="wear" /> </menu_item_call> <menu_item_call - label="Wear Outfit" + label="Add To Current Outfit" layout="topleft" - name="wear"> + name="add"> <on_click function="panel_outfits_inventory_gear_default.Custom.Action" - parameter="wear" /> + parameter="add" /> <on_enable function="panel_outfits_inventory_gear_default.Enable" - parameter="wear" /> + parameter="add" /> + </menu_item_call> + <menu_item_call + label="Remove From Current Outfit" + layout="topleft" + name="remove"> + <on_click + function="panel_outfits_inventory_gear_default.Custom.Action" + parameter="remove" /> + <on_enable + function="panel_outfits_inventory_gear_default.Enable" + parameter="remove" /> + </menu_item_call> + <menu_item_separator + layout="topleft" + name="Outfits Gear Separator" /> + <menu_item_call + label="Rename" + layout="topleft" + name="rename"> + <on_click + function="panel_outfits_inventory_gear_default.Custom.Action" + parameter="rename" /> + <on_enable + function="panel_outfits_inventory_gear_default.Enable" + parameter="rename" /> + </menu_item_call> + <menu_item_call + label="Remove" + layout="topleft" + name="remove_link"> + <on_click + function="panel_outfits_inventory_gear_default.Custom.Action" + parameter="remove_link" /> + <on_enable + function="panel_outfits_inventory_gear_default.Enable" + parameter="remove_link" /> </menu_item_call> <menu_item_call - label="Delete Outfit" + label="Delete" layout="topleft" name="delete"> <on_click diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 52bc72fe86873f103e12f75c236bb28dcc517437..4facedc7ea7db4d96674de726fa9cc732773e56a 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -106,7 +106,7 @@ layout="topleft" left_pad="15" name="new_btn" - tool_tip="Create new pick or classified at current location" + tool_tip="Create a new pick or classified at the current location" top="5" width="18" /> <button @@ -138,7 +138,7 @@ left="5" name="info_btn" tab_stop="false" - tool_tip="Show pic information" + tool_tip="Show pick information" top="0" width="55" /> <button @@ -162,7 +162,7 @@ left_pad="5" name="show_on_map_btn" tab_stop="false" - tool_tip="Show corresponding area on the world map" + tool_tip="Show the corresponding area on the World Map" top="0" width="50" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 3f5da66dcec8337777cdf1766c35e6d898476134..b25d9a7dfcc214062425599eca774765e96ca400 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -95,49 +95,49 @@ <!-- Texture names for parcel permissions icons --> <string name="icon_PG" - value="parcel_drk_PG" /> + value="Parcel_PG_Dark" /> <string name="icon_M" - value="parcel_drk_M" /> + value="Parcel_M_Dark" /> <string name="icon_R" - value="parcel_drk_R" /> + value="Parcel_R_Dark" /> <string name="icon_Voice" - value="parcel_drk_Voice" /> + value="Parcel_Voice_Dark" /> <string name="icon_VoiceNo" - value="parcel_drk_VoiceNo" /> + value="Parcel_VoiceNo_Dark" /> <string name="icon_Fly" - value="parcel_drk_Fly" /> + value="Parcel_Fly_Dark" /> <string name="icon_FlyNo" - value="parcel_drk_FlyNo" /> + value="Parcel_FlyNo_Dark" /> <string name="icon_Push" - value="parcel_drk_Push" /> + value="Parcel_Push_Dark" /> <string name="icon_PushNo" - value="parcel_drk_PushNo" /> + value="Parcel_PushNo_Dark" /> <string name="icon_Build" - value="parcel_drk_Build" /> + value="Parcel_Build_Dark" /> <string name="icon_BuildNo" - value="parcel_drk_BuildNo" /> + value="Parcel_BuildNo_Dark" /> <string name="icon_Scripts" - value="parcel_drk_Scripts" /> + value="Parcel_Scripts_Dark" /> <string name="icon_ScriptsNo" - value="parcel_drk_ScriptsNo" /> + value="Parcel_ScriptsNo_Dark" /> <string name="icon_Damage" - value="parcel_drk_Damage" /> + value="Parcel_Damage_Dark" /> <string name="icon_DamageNo" - value="parcel_drk_DamageNo" /> + value="Parcel_DamageNo_Dark" /> <button follows="top|right" height="23" @@ -335,7 +335,7 @@ <icon follows="top|left" height="16" - image_name="parcel_drk_PG" + image_name="Parcel_PG_Dark" layout="topleft" left="10" name="rating_icon" @@ -361,7 +361,7 @@ <icon follows="top|left" height="18" - image_name="parcel_drk_Voice" + image_name="Parcel_Voice_Dark" layout="topleft" left="10" name="voice_icon" @@ -388,7 +388,7 @@ <icon follows="top|left" height="18" - image_name="parcel_drk_Fly" + image_name="Parcel_Fly_Dark" layout="topleft" left="10" name="fly_icon" @@ -414,7 +414,7 @@ <icon follows="top|left" height="18" - image_name="parcel_drk_Push" + image_name="Parcel_Push_Dark" layout="topleft" left="10" name="push_icon" @@ -440,7 +440,7 @@ <icon follows="top|left" height="18" - image_name="parcel_drk_Build" + image_name="Parcel_Build_Dark" layout="topleft" left="10" name="build_icon" @@ -466,7 +466,7 @@ <icon follows="top|left" height="18" - image_name="parcel_drk_Scripts" + image_name="Parcel_Scripts_Dark" layout="topleft" left="10" name="scripts_icon" @@ -492,7 +492,7 @@ <icon follows="top|left" height="18" - image_name="parcel_drk_Damage" + image_name="Parcel_Damage_Dark" layout="topleft" left="10" name="damage_icon" @@ -591,7 +591,7 @@ <icon follows="top|left" height="16" - image_name="parcel_drk_PG" + image_name="Parcel_PG_Dark" layout="topleft" left_pad="0" name="region_rating_icon" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 6a61953319befdb1f2d9e40420192d5f8a53a96c..78b90eefcca3e447fc3f0102e7ec30e5ef12e898 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -70,7 +70,7 @@ </text> <combo_box allow_text_entry="true" - height="20" + height="23" follows="left|top" layout="topleft" left_pad="0" @@ -306,7 +306,7 @@ Avatars: <button follows="top|left" enabled_control="EnableVoiceChat" - height="20" + height="23" label="Set Key" left_delta="0" name="set_voice_hotkey_button" @@ -320,7 +320,7 @@ Avatars: enabled_control="EnableVoiceChat" follows="left" halign="center" - height="20" + height="23" label="Middle Mouse Button" left_delta="120" mouse_opaque="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index a94df4150da43eacfce0a30c66b15106dc3e931d..18d0f8acabfb5472e5c24d3164de12daefc6dba3 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -50,7 +50,7 @@ name="show_label" top_pad="14" width="450"> - Always show these alerts: + Always show these notifications: </text> <scroll_list follows="top|left" @@ -63,7 +63,7 @@ <button enabled_control="FirstSelectedDisabledPopups" follows="top|left" - height="20" + height="23" image_disabled="PushButton_Disabled" image_disabled_selected="PushButton_Disabled" image_overlay="Arrow_Up" @@ -81,7 +81,7 @@ <button enabled_control="FirstSelectedEnabledPopups" follows="top|left" - height="20" + height="23" image_disabled="PushButton_Disabled" image_disabled_selected="PushButton_Disabled" image_overlay="Arrow_Down" @@ -107,7 +107,7 @@ name="dont_show_label" top_pad="10" width="450"> - Never show these alerts: + Never show these notifications: </text> <scroll_list follows="top|left" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 3aa5d3fae423046223c9fdada0caf67f7f5dcee7..fff53c1de2ed053b98e74c337f10d958e04397fe 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -332,7 +332,7 @@ control_name="ChatWindow" name="chat_window" top_pad="10" - tool_tip="Show chat in multiple windows(by default) or in one multi-tabbed window (requires restart)" + tool_tip="Show your Instant Messages in separate windows, or in one window with many tabs (Requires restart)" width="331"> <radio_item height="16" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index ee9bfbae93f16266e7814a9cd0a139832c91ebd7..b5c6b637e5116216d6985d272a3d65f6da5fab6d 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -24,7 +24,7 @@ <combo_box control_name="Language" follows="left|bottom" - height="18" + height="23" layout="topleft" left_delta="50" max_chars="135" @@ -92,11 +92,7 @@ name="(Japanese)" value="ja" /> - <combo_box.item - enabled="true" - label="Test Language" - name="TestLanguage" - value="test" /> + </combo_box> <text type="string" @@ -136,7 +132,7 @@ <combo_box control_name="PreferredMaturity" follows="left|bottom" - height="18" + height="23" layout="topleft" left_delta="-10" name="maturity_desired_combobox" @@ -170,7 +166,7 @@ <combo_box control_name="LoginLocation" follows="left|bottom" - height="18" + height="23" layout="topleft" left_delta="50" name="start_location_combo" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index eb00b9b79a0490349ab60649a3d5565c4baa23db..04985d0fa982ad251ed75c76a6bcdd567715c184 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -708,7 +708,7 @@ </panel> <button follows="left|bottom" - height="20" + height="23" label="Apply" label_selected="Apply" layout="topleft" @@ -721,7 +721,7 @@ </button> <button follows="left|bottom" - height="20" + height="23" label="Reset" layout="topleft" left_pad="3" @@ -734,7 +734,7 @@ <button control_name="ShowAdvancedGraphicsSettings" follows="right|bottom" - height="20" + height="23" is_toggle="true" label="Advanced" layout="topleft" @@ -744,7 +744,7 @@ width="115" /> <button follows="right|bottom" - height="20" + height="23" label="Hardware" label_selected="Hardware" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 29e9b476eb70a8dadb6f66d09f57f01d19a36e03..25d7ba0903f193f5a8ba293157ae0970c0d3fba0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -15,7 +15,7 @@ </panel.string> <button follows="left|bottom" - height="20" + height="23" label="Clear History" layout="topleft" left="30" @@ -160,7 +160,7 @@ <button enabled="false" follows="right|bottom" - height="20" + height="23" label="Browse" label_selected="Browse" layout="topleft" @@ -173,7 +173,7 @@ </button> <button follows="left|bottom" - height="20" + height="23" label="Block list" layout="topleft" left="30" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 5cabae5fa0111691c609627757a0fbff624ac5a5..a7def5306e33ba9b3c6b0e6d62487b5ab9e121d3 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -10,7 +10,7 @@ top="1" width="517"> <button - height="20" + height="23" label="Other Devices" layout="topleft" left="30" @@ -138,7 +138,7 @@ enabled_control="BrowserProxyEnabled" decimal_digits="0" follows="left|top" - height="16" + height="23" increment="1" initial_value="80" label="Port number:" @@ -208,7 +208,7 @@ width="205" /> <button follows="left|top" - height="22" + height="23" label="Browse" label_selected="Browse" layout="topleft" @@ -221,7 +221,7 @@ </button> <button follows="left|top" - height="22" + height="23" label="Reset" label_selected="Set" layout="topleft" @@ -314,7 +314,7 @@ width="200" /> <button follows="left|top" - height="22" + height="23" enabled="false" label="Browse" label_selected="Browse" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 8ef2cdfc37fad3348759b54c3881d26d3c0a62f7..5332007bafaca34268828d8bfd33ce7f0cfa2330 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -23,7 +23,7 @@ name="System Volume" show_text="false" slider_label.halign="right" - top_pad="5" + top="10" volume="true" width="350"> <slider.commit_callback @@ -34,8 +34,8 @@ control_name="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -79,8 +79,8 @@ disabled_control="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -114,8 +114,8 @@ disabled_control="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -149,8 +149,8 @@ disabled_control="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -184,8 +184,8 @@ disabled_control="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -219,8 +219,8 @@ disabled_control="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -230,12 +230,13 @@ width="22" /> <check_box label_text.halign="left" - follows="right|top" - height="16" - control_name ="EnableVoiceChat" - disabled_control="CmdLineDisableVoice" - label="Voice" - left="50" + follows="left|top" + height="16" + control_name ="EnableVoiceChat" + disabled_control="CmdLineDisableVoice" + label="Enable voice" + layout="topleft" + left="28" name="enable_voice_check" top_pad="5" width="110" @@ -249,15 +250,16 @@ height="15" increment="0.05" initial_value="0.5" - label_width="0" + label="Voice" + label_width="160" layout="topleft" - left="165" - top_delta="0" + left="0" + top_delta="20" name="Voice Volume" show_text="false" slider_label.halign="right" volume="true" - width="185"> + width="350"> <slider.commit_callback function="Pref.setControlFalse" parameter="MuteVoice" /> @@ -268,8 +270,8 @@ disabled_control="MuteAudio" follows="top|right" height="18" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" layout="topleft" left_pad="16" @@ -283,63 +285,70 @@ follows="left|top" height="13" layout="topleft" - left="170" + left="30" name="Listen from" - width="200"> + width="200" + top="205"> Listen from: </text> <icon - follows="left" + follows="left|top" height="18" image_name="Cam_FreeCam_Off" + layout="topleft" name="camera_icon" mouse_opaque="false" visible="true" - width="18" /> + width="18" + left="80" + top="219"/> <icon - follows="left" + follows="left|top" height="18" image_name="Move_Walk_Off" + layout="topleft" name="avatar_icon" mouse_opaque="false" visible="true" - width="18" /> + width="18" + top="239" + left="80" + /> <radio_group enabled_control="EnableVoiceChat" control_name="VoiceEarLocation" draw_border="false" - follows="left" - left_delta="20" - top = "210" - width="221" - height="38" - name="ear_location"> - <radio_item - height="16" - label="Camera position" - left_pad="1" - follows="topleft" - name="0" - top_delta="-30" - width="200" /> - <radio_item - height="16" - follows="topleft" - label="Avatar position" - left_delta="0" - name="1" - top_delta="19" - width="200" /> - </radio_group> + follows="left|top" + layout="topleft" + left="100" + width="221" + height="38" + name="ear_location" + top="218"> + <radio_item + height="16" + label="Camera position" + follows="left|top" + layout="topleft" + name="0" + width="200"/> + <radio_item + height="16" + follows="left|top" + label="Avatar position" + layout="topleft" + name="1" + width="200" /> + </radio_group> <button control_name="ShowDeviceSettings" - follows="left|bottom" - height="19" + follows="left|top" + height="23" is_toggle="true" - label="Input/Output Devices" + label="Input/Output devices" layout="topleft" - left="165" - top_pad="12" + left="30" + top="270" name="device_settings_btn" width="190"> </button> @@ -382,7 +391,7 @@ Input </text> <combo_box - height="19" + height="23" control_name="VoiceInputAudioDevice" layout="topleft" left="165" @@ -390,31 +399,6 @@ name="voice_input_device" top_pad="0" width="200" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="165" - name="My volume label" - top_pad="10" - width="200"> - My volume: - </text> - <slider_bar - control_name="AudioLevelMic" - follows="left|top" - height="17" - increment="0.05" - initial_value="1.0" - layout="topleft" - left="160" - max_val="2" - name="mic_volume_slider" - tool_tip="Change the volume using this slider" - top_pad="0" - width="220" /> <text type="string" text_color="EmphasisColor" @@ -424,7 +408,7 @@ layout="topleft" left_pad="5" name="wait_text" - top_delta="0" + top_delta="5" width="110"> Please wait </text> @@ -433,7 +417,7 @@ layout="topleft" left_delta="0" name="bar0" - top_delta="5" + top_delta="-5" width="20" /> <locate height="20" @@ -463,23 +447,13 @@ name="bar4" top_delta="0" width="20" /> - <!-- <text - type="string" - height="37" - left="30" - name="voice_intro_text1" - top_pad="-4" - width="410" - word_wrap="true"> - Adjust the slider to control how loud you sound to other people. To test your volume, simply speak into your microphone - </text>--> <icon height="18" - image_name="parcel_lght_Voice" + image_name="Parcel_Voice_Light" left="80" name="speaker_icon" mouse_opaque="false" - top_pad="-8" + top_pad="4" visible="true" width="22" /> <text @@ -496,7 +470,7 @@ </text> <combo_box control_name="VoiceOutputAudioDevice" - height="19" + height="23" layout="topleft" left="165" max_chars="128" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index e21de314986ce40226ffc4ed9cd7397fbf31301b..b4f72a48bc285326dc7c760c0ca6dc7ad6fa9c6d 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -380,7 +380,7 @@ image_selected="AudioMute_Off" image_unselected="Audio_Off" hover_glow_amount="0.15" - name="media_volume_button" + name="media_mute_button" height="22" is_toggle="true" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 6be203ef9cc5791f7775cf1b4bedb27f32f5adea..638bc3cabd753b18406da380ae044280b2f12f80 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -286,6 +286,7 @@ left="0" mouse_opaque="false" name="add_friend" + tool_tip="Offer friendship to the resident" top="5" width="77" /> <button @@ -294,6 +295,7 @@ label="IM" layout="topleft" name="im" + tool_tip="Open instant message session" top="5" left_pad="5" width="33" /> @@ -303,6 +305,7 @@ label="Call" layout="topleft" name="call" + tool_tip="Call this resident" left_pad="5" top="5" width="40" /> @@ -313,6 +316,7 @@ label="Map" layout="topleft" name="show_on_map_btn" + tool_tip="Show the resident on the map" top="5" left_pad="5" width="44" /> @@ -322,6 +326,7 @@ label="Teleport" layout="topleft" name="teleport" + tool_tip="Offer teleport" left_pad="5" top="5" width="67" /> @@ -331,6 +336,7 @@ label="â–¼" layout="topleft" name="overflow_btn" + tool_tip="Pay money to or share inventory with the resident" right="-1" top="5" width="21" /> diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml index 75d7d85505f450068c224f8c14cbc7be3956cbb2..ff55090f162e9326e348430fa5aaaed23f4207ce 100644 --- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml @@ -3,6 +3,7 @@ border="true" follows="top|left" height="320" + help_topic="panel_region_covenant_tab" label="Covenant" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index e07585d285e992431aaee6ca13426d7169d02ca3..a6b4ddd01e8c5471b67e0c255da8d0778c4a04ce 100644 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -3,6 +3,7 @@ border="true" follows="top|left" height="320" + help_topic="panel_region_debug_tab" label="Debug" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index e25ff0d548503e4c47db38b5f0d277bebd58c468..ba39e880249daa24a57e32ef8f4271d9f2545f76 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -3,16 +3,13 @@ border="false" follows="top|left" height="320" + help_topic="panel_region_estate_tab" label="Estate" layout="topleft" left="0" name="Estate" top="320" width="480"> - <panel.string - name="email_unsupported"> - Feature unsupported - </panel.string> <text type="string" length="1" @@ -81,7 +78,7 @@ regions in the estate. <view_border bevel_style="in" follows="top|left" - height="310" + height="270" layout="topleft" left_delta="-4" top_pad="5" @@ -141,12 +138,12 @@ regions in the estate. name="Only Allow" top="250" width="278"> - Restrict Access To: + Restrict Access to Accounts Verified by: </text> <check_box follows="top|left" height="16" - label="Residents with payment info on file" + label="Payment Information on File" layout="topleft" left_delta="0" name="limit_payment" @@ -156,7 +153,7 @@ regions in the estate. <check_box follows="top|left" height="16" - label="Age-verified adults" + label="Age Verification" layout="topleft" left_delta="0" name="limit_age_verified" @@ -179,26 +176,6 @@ regions in the estate. name="allow_direct_teleport" top_pad="4" width="80" /> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="15" - name="abuse_email_text" - top_pad="10" - width="180"> - Abuse email address: - </text> - <line_editor - follows="top|left" - height="23" - layout="topleft" - left="15" - name="abuse_email_address" - top_pad="-5" - width="230" /> <button enabled="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 79d8f3a0ee0dc07f272f5b6697003e3839ec3f69..26568c2a289c01e8ae60100ba023bea8f2ad6f4e 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -3,6 +3,7 @@ border="true" follows="top|left" height="320" + help_topic="panel_region_general_tab" label="Region" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml index ffd51bf510fc1e60195f15cd00cbeed374fe75ac..5093c52129d53e7c6f7932a8bacc26e4b83da188 100644 --- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml @@ -3,6 +3,7 @@ border="true" follows="top|left" height="320" + help_topic="panel_region_terrain_tab" label="Terrain" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml index 5089064c0752629cb6b9ba7cd26af40005618031..a4d24cb0fce95fc038916ab548f5d11917180e70 100644 --- a/indra/newview/skins/default/xui/en/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml @@ -3,6 +3,7 @@ border="true" follows="top|left" height="320" + help_topic="panel_region_texture_tab" label="Ground Textures" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 5dcee9e965b9b70dd17d2ab19c7f0457d15b61e5..57b090e5b499883bc1056ee9b8edf6d9a14dafaf 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -72,8 +72,8 @@ <button follows="right|bottom" height="16" - image_selected="parcel_drk_VoiceNo" - image_unselected="parcel_drk_Voice" + image_selected="Parcel_VoiceNo_Dark" + image_unselected="Parcel_Voice_Dark" is_toggle="true" left_pad="18" top="1" diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index 6479fc91ca136a46fed016cad16b4971bec35e38..707b24c92cd89a5b3faad5fb80f45079a397aef0 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -46,7 +46,7 @@ </text> <button layout="topleft" - top="-6" + top="-14" left="293" width="17" height="17" diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml index b89a975430a4792364138a87ce1d709d5bf38811..a6036f8b781b20604fc52e33fab18f257e1cda63 100644 --- a/indra/newview/skins/default/xui/en/role_actions.xml +++ b/indra/newview/skins/default/xui/en/role_actions.xml @@ -4,39 +4,39 @@ description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation." name="Membership"> <action description="Invite People to this Group" - longdescription="Invite People to this Group using the 'Invite New Person...' button in the Members & Roles tab > Members sub-tab." + longdescription="Invite People to this Group using the 'Invite' button in the Roles section > Members tab." name="member invite" value="1" /> <action description="Eject Members from this Group" - longdescription="Eject Members from this Group using the 'Eject From Group' button in the Members & Roles tab > Members sub-tab. An Owner can eject anyone except another Owner. If you're not an Owner, a Member can be ejected from a group if, and only if, they're only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the 'Remove Members from Roles' Ability." + longdescription="Eject Members from this Group using the 'Eject' button in the Roles section > Members tab. An Owner can eject anyone except another Owner. If you're not an Owner, a Member can be ejected from a group if, and only if, they're only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the 'Remove Members from Roles' Ability." name="member eject" value="2" /> <action - description="Toggle 'Open Enrollment' and change 'Signup Fee'" - longdescription="Toggle 'Open Enrollment' to let new Members join without an invitation, and change 'Signup Fee' in the Group Preferences section of the General tab." + description="Toggle 'Open Enrollment' and change 'Enrollment fee'" + longdescription="Toggle 'Open Enrollment' to let new Members join without an invitation, and change the 'Enrollment fee' in the General section." name="member options" value="3" /> </action_set> <action_set description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles." name="Roles"> <action description="Create new Roles" - longdescription="Create new Roles in the Members & Roles tab > Roles sub-tab." + longdescription="Create new Roles in the Roles section > Roles tab." name="role create" value="4" /> <action description="Delete Roles" - longdescription="Delete Roles in the Members & Roles tab > Roles sub-tab." + longdescription="Delete Roles in the Roles section > Roles tab." name="role delete" value="5" /> - <action description="Change Role names, titles, descriptions, and whether Role members are publicly visible" - longdescription="Change Role names, titles, descriptions, and whether Role members are publicly visible. This is done at the bottom of the the Members & Roles tab > Roles sub-tab after selecting a Role." + <action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed" + longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section > Roles tab after selecting a Role." name="role properties" value="6" /> <action description="Assign Members to Assigner's Roles" - longdescription="Assign Members to Roles in the Assigned Roles section of the Members & Roles tab > Members sub-tab. A Member with this Ability can only add Members to a Role the assigner is already in." + longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section > Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in." name="role assign member limited" value="7" /> <action description="Assign Members to Any Role" - longdescription="Assign Members to Any Role in the Assigned Roles section of the Members & Roles tab > Members sub-tab. *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you're doing before assigning this Ability." + longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section > Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you're doing before assigning this Ability." name="role assign member" value="8" /> <action description="Remove Members from Roles" - longdescription="Remove Members from Roles in the Assigned Roles section of the Members & Roles tab > Members sub-tab. Owners can't be removed." + longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section > Members tab). Owners can't be removed." name="role remove member" value="9" /> <action description="Assign and Remove Abilities in Roles" - longdescription="Assign and Remove Abilities in Roles in the Allowed Abilities section of the Members & Roles tab > Roles sub-tab. *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you're doing before assigning this Ability." + longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section > Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you're doing before assigning this Ability." name="role change actions" value="10" /> </action_set> <action_set @@ -44,11 +44,11 @@ name="Group Identity"> <action description="Change Charter, Insignia, and 'Show in search'" - longdescription="Change Charter, Insignia, and 'Show in search'. This is done in the General tab." + longdescription="Change Charter, Insignia, and 'Show in search'. This is done in the General section." name="group change identity" value="11" /> </action_set> <action_set - description="These Abilities include powers to deed, modify, and sell land in this group's land holdings. To get to the About Land window, right-click the ground and select 'About Land...', or click the parcel info in the menu bar." + description="These Abilities include powers to deed, modify, and sell land in this group's land holdings. To get to the About Land window, right-click the ground and select 'About Land', or click the 'i' icon in the Navigation Bar." name="Parcel Management"> <action description="Deed land and buy land for group" longdescription="Deed land and buy land for group. This is done in About Land > General tab." @@ -60,18 +60,18 @@ longdescription="Set land for sale info. *WARNING* Any Member in a Role with this Ability can sell group-owned land in About Land > General tab as they wish! Be sure you know what you're doing before assigning this Ability." name="land set sale info" value="14" /> <action description="Subdivide and join parcels" - longdescription="Subdivide and join parcels. This is done by right-clicking the ground, 'Edit Terrain', and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click 'Subdivide...'. To join, select two or more contiguous parcels and click 'Join...'. " + longdescription="Subdivide and join parcels. This is done by right-clicking the ground, 'Edit Terrain', and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click 'Subdivide'. To join, select two or more contiguous parcels and click 'Join'. " name="land divide join" value="15" /> </action_set> <action_set description="These Abilities include powers to change the parcel name and publish settings, Find directory visibility, and landing point & TP routing options." name="Parcel Identity"> - <action description="Toggle 'Show in Find Places' and set category" - longdescription="Toggle 'Show in Find Places' and setting a parcel's category in About Land > Options tab." + <action description="Toggle 'Show Place in Search' and set category" + longdescription="Toggle 'Show Place in Search' and setting a parcel's category in About Land > Options tab." name="land find places" value="17" /> <action - description="Change parcel name, description, and 'Show in search' settings" - longdescription="Change parcel name, description, and 'Show in search' settings. This is done in About Land > Options tab." + description="Change parcel name, description, and 'Show Place in Search' settings" + longdescription="Change parcel name, description, and 'Show Place in Search' settings. This is done in About Land > Options tab." name="land change identity" value="18" /> <action description="Set landing point and set teleport routing" longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land > Options tab." @@ -87,7 +87,7 @@ longdescription="Toggle 'Edit Terrain'. *WARNING* About Land > Options tab > Edit Terrain allows anyone to terraform your land's shape, and place and move Linden plants. Be sure you know what you're doing before assigning this Ability. Editing terrain is toggled in About Land > Options tab." name="land edit" value="21" /> <action description="Toggle various About Land > Options settings" - longdescription="Toggle 'Safe (no damage)', 'Fly', and allow other Residents to: 'Create Objects', 'Edit Terrain', 'Create Landmarks', and 'Run Scripts' on group-owned land in About Land > Options tab." + longdescription="Toggle 'Safe (no damage)', 'Fly', and allow other Residents to: 'Edit Terrain', 'Build', 'Create Landmarks', and 'Run Scripts' on group-owned land in About Land > Options tab." name="land options" value="22" /> </action_set> <action_set @@ -106,7 +106,7 @@ longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it's turned off in About Land > Options tab." name="land allow landmark" value="26" /> <action description="Allow 'Set Home to Here' on group land" - longdescription="Members in a Role with this Ability can use World menu > Set Home to Here on a parcel deeded to this group." + longdescription="Members in a Role with this Ability can use World menu > Landmarks > Set Home to Here on a parcel deeded to this group." name="land allow set home" value="28" /> </action_set> <action_set @@ -116,13 +116,13 @@ longdescription="Manage parcel Access lists in About Land > Access tab." name="land manage allowed" value="29" /> <action description="Manage parcel Ban lists" - longdescription="Manage parcel Ban lists in About Land > Ban tab." + longdescription="Manage parcel Ban lists in About Land > Access tab." name="land manage banned" value="30" /> - <action description="Change parcel 'Sell passes...' settings" - longdescription="Change parcel 'Sell passes...' settings in About Land > Access tab." + <action description="Change parcel 'Sell passes to' settings" + longdescription="Change parcel 'Sell passes to' settings in About Land > Access tab." name="land manage passes" value="31" /> <action description="Eject and freeze Residents on parcels" - longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, More >, and selecting 'Eject...' or 'Freeze...'." + longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting 'Eject' or 'Freeze'." name="land admin" value="32" /> </action_set> <action_set @@ -138,20 +138,20 @@ longdescription="Return objects on group-owned parcels that are non-group in About Land > Objects tab." name="land return non group" value="34" /> <action description="Landscaping using Linden plants" - longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory's Library > Objects folder or they can be created via the Build button." + longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory's Library > Objects folder, or they can be created via the Build menu." name="land gardening" value="35" /> </action_set> <action_set - description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Edit Tools > General Tab. Right-click an object and Edit to see its settings. " + description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Build Tools > General tab. Right-click an object and Edit to see its settings. " name="Object Management"> <action description="Deed objects to group" - longdescription="Deed objects to group in the Edit Tools > General Tab." + longdescription="Deed objects to group in the Build Tools > General tab." name="object deed" value="36" /> <action description="Manipulate (move, copy, modify) group-owned objects" - longdescription="Manipulate (move, copy, modify) group-owned objects in the Edit Tools > General Tab." + longdescription="Manipulate (move, copy, modify) group-owned objects in the Build Tools > General tab." name="object manipulate" value="38" /> <action description="Set group-owned objects for sale" - longdescription="Set group-owned objects for sale in the Edit Tools > General tab." + longdescription="Set group-owned objects for sale in the Build Tools > General tab." name="object set sale" value="39" /> </action_set> <action_set @@ -165,10 +165,10 @@ description="These Abilities include powers to allow Members to send, receive, and view group Notices." name="Notices"> <action description="Send Notices" - longdescription="Members in a Role with this Ability can send Notices in Group Information > Notices tab." + longdescription="Members in a Role with this Ability can send Notices via the Group > Notices section." name="notices send" value="42" /> <action description="Receive Notices and view past Notices" - longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group Information > Notices tab." + longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group > Notices section." name="notices receive" value="43" /> </action_set> <action_set diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index 4dae8e48a0b36ac61e0bf8a92eeedb7f12fcaaac..3dac1a96140ee385511d5af6376c6da19097a8fe 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -1,111 +1,170 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - background_visible="true" - follows="all" - height="400" - label="Appearance" - layout="topleft" - min_height="350" - min_width="240" - name="appearance panel" - width="333"> - <string - name="No Outfit" - value="No Outfit" /> - <panel - left="5" width="320" height="55" - background_visible="true" - background_opaque="false" - bg_alpha_color="0.2 0.2 0.2 1.0" - name="panel_currentlook" - follows="left|top|right"> - <button - follows="left|right|top" - font="SansSerif" - top="28" right="-10" width="60" height="20" - layout="topleft" - label="Edit" - name="editappearance_btn"/> - <button - follows="left|right|top" - top="28" left="5" width="25" height="22" - image_overlay="Inv_LookFolderOpen" - layout="topleft" - name="openoutfit_btn" - picture_style="true" /> - <text - top="10" width="150" left="5" height="15" follows="left|right|top" - layout="topleft" - font="SansSerif" text_color="LtGray" word_wrap="true" - mouse_opaque="false" name="currentlook_title"> - Current Outfit: - </text> - <text - top="32" width="150" left="32" height="15" follows="left|right|top" - layout="topleft" - font="SansSerifBold" text_color="white" word_wrap="true" - mouse_opaque="false" name="currentlook_name" > - MyOutfit - </text> - </panel> - - <filter_editor - follows="left|top|right" - font="SansSerif" - label="Filter" - layout="topleft" - left="15" - width="313" - height="20" - name="Filter" /> - <panel - class="panel_outfits_inventory" - filename="panel_outfits_inventory.xml" - name="panel_outfits_inventory" - follows="all" - height="271" - halign="center" - layout="topleft" - left="10" - top_pad="19" - width="313" /> - <button - follows="bottom|left" - height="25" - label="Wear" - layout="topleft" - left="10" - name="wear_btn" - top_pad="0" - width="80" /> - <button - follows="bottom|left" - height="25" - label="New Outfit" - layout="topleft" - left_pad="0" - name="newlook_btn" - top_delta="0" - width="90" /> - - <panel - class="panel_look_info" - filename="panel_look_info.xml" - follows="all" - layout="topleft" - left="0" - name="panel_look_info" - top="-200" - visible="false" /> - - <panel - class="panel_edit_wearable" - filename="panel_edit_wearable.xml" - follows="all" - layout="topleft" - left="0" - name="panel_edit_wearable" - top="-200" - visible="false" - width="333" /> -</panel> +background_visible="true" +follows="all" +height="635" +label="Outfits" +layout="topleft" +min_height="460" +name="appearance panel" +top="0" +left="0" + width="333"> + <string + name="No Outfit" + value="No Outfit" /> + <panel + left="0" + top="0" + follows="left|top|right" + layout="topleft" + width="333" + height="33" + name="panel_currentlook" + > + <button + follows="left|top" + top="0" width="1" height="1" + layout="topleft" + left="0" + name="editappearance_btn" /> + <button + follows="left|top" + top="0" width="1" height="1" + layout="topleft" + left="0" + name="openoutfit_btn" /> + <icon + follows="top|left" + height="30" + image_name="TabIcon_Appearance_Off" + name="outfit_icon" + mouse_opaque="false" + visible="true" + left="5" + top="0" + width="30" /> + <text + font="SansSerifHuge" + height="20" + left_pad="5" + text_color="white" + top="3" + use_ellipses="true" + width="290" + follows="top|left" + word_wrap="true" + mouse_opaque="false" + name="currentlook_name"> + MyOutfit With a really Long Name like MOOSE + </text> + <!-- <text + text_color="LtGray_50" + width="290" + left="40" + height="1" + follows="top|left" + layout="topleft" + top_pad="-2" + mouse_opaque="false" + name="currentlook_title" > + (current outfit) + </text>--> + </panel> + <filter_editor + height="23" + follows="left|top|right" + layout="topleft" + left="15" + label="Filter Outfits" + max_length="300" + name="Filter" + top_pad="0" + width="303" /> + <panel + class="panel_outfits_inventory" + filename="panel_outfits_inventory.xml" + name="panel_outfits_inventory" + height="510" + min_height="510" + width="333" + top_pad="0" + follows="top|left" + /> + <panel + visible="true" + name="bottom_panel" + height="50" + left="0" + top_pad="3" + follows="bottom|left" + width="333"> + <button + follows="bottom|left" + tool_tip="Show additional options" + height="18" + image_disabled="OptionsMenu_Disabled" + image_selected="OptionsMenu_Press" + image_unselected="OptionsMenu_Off" + layout="topleft" + left="10" + name="options_gear_btn" + top="6" + width="18" /> + <button + follows="bottom|left" + height="18" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + layout="topleft" + left_pad="5" + name="newlook_btn" + tool_tip="Add new outfit" + width="18" /> + <dnd_button + follows="bottom|left" + height="18" + image_selected="TrashItem_Press" + image_unselected="TrashItem_Off" + layout="topleft" + right="-5" + name="trash_btn" + tool_tip="Remove selected item" + top="6" + width="18" /> + <button + follows="bottom|left" + height="23" + label="Wear" + layout="topleft" + name="wear_btn" + right="-5" + top_pad="0" + width="90" /> + </panel> + <!-- <button + follows="bottom|left" + height="23" + label="New outfit" + layout="topleft" + left_pad="5" + right="-10" + width="100" />--> + <panel + class="panel_look_info" + filename="panel_look_info.xml" + follows="all" + layout="topleft" + left="0" + name="panel_look_info" + visible="false" /> + <panel + class="panel_edit_wearable" + filename="panel_edit_wearable.xml" + follows="all" + layout="topleft" + left="0" + name="panel_edit_wearable" + visible="false" /> +</panel> \ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index 33a6a52f5c00336991ebe5c09211c3a2b734b1ab..b738e7242388cef415e9135ea72d23590390367b 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -41,47 +41,47 @@ <button enabled="true" follows="bottom|left" - height="25" - label="Info" + height="23" + label="Profile" layout="topleft" left="0" name="info_btn" top="0" - width="60" /> + width="100" /> <button enabled="false" follows="bottom|left" - height="25" + height="23" label="Wear" layout="topleft" left="130" name="wear_btn" top="0" - width="60" /> + width="100" /> <button enabled="false" follows="bottom|left" - height="25" + height="23" label="Play" layout="topleft" name="play_btn" left="130" top="0" - width="50" /> + width="80" /> <button enabled="false" follows="bottom|left" - height="25" + height="23" label="Teleport" layout="topleft" left="130" name="teleport_btn" top="0" - width="77" /> + width="100" /> </panel> </panel> - <panel +<panel follows="all" layout="topleft" left="0" @@ -95,7 +95,7 @@ width="330"> </panel> - <panel +<panel follows="all" layout="topleft" left="0" @@ -108,5 +108,4 @@ visible="false" width="330"> </panel> - </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index db8a844eb0fbb672625c441ede7510646ced95ba..3cddbed2d493ed1c559ccd5e9fee7843b30bcaff 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -6,7 +6,7 @@ name="item properties" help_topic="item_properties" save_rect="true" - title="Inventory Item Properties" + title="Object Profile" width="333"> <panel.string name="unknown"> @@ -39,27 +39,39 @@ top="4" width="18" /> <button - follows="top|right" - height="25" - image_overlay="BackArrow_Off" - layout="topleft" - name="back_btn" - picture_style="true" - right="-5" - tab_stop="false" - top="0" - width="25" /> + follows="top|right" + height="23" + image_overlay="BackArrow_Off" + layout="topleft" + left="10" + name="back_btn" + tab_stop="false" + top="0" + width="23" /> + <text + follows="top|left|right" + font="SansSerifHuge" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="LtGray" + top="0" + use_ellipses="true" + value="Object Profile" + width="275" /> <panel follows="all" height="500" label="" layout="topleft" - left="5" + left="10" help_topic="" top="30" - border="1" - width="313"> - <text + width="313" + background_visible="true" + bg_alpha_color="DkGray2"> + <text type="string" length="1" follows="left|top" @@ -67,7 +79,7 @@ layout="topleft" left="5" name="LabelItemNameTitle" - top="5" + top="10" width="78"> Name: </text> @@ -75,7 +87,7 @@ border_style="line" border_thickness="1" follows="left|top|right" - height="16" + height="20" layout="topleft" left_delta="78" max_length="63" @@ -90,7 +102,7 @@ layout="topleft" left="5" name="LabelItemDescTitle" - top_delta="20" + top_pad="10" width="78"> Description: </text> @@ -98,88 +110,106 @@ border_style="line" border_thickness="1" follows="left|top|right" - height="16" + height="23" layout="topleft" left_delta="78" max_length="127" name="LabelItemDesc" - top_delta="0" + top_delta="-5" width="225" /> <text type="string" length="1" follows="left|top" - height="16" + height="23" layout="topleft" - left="10" + left="5" name="LabelCreatorTitle" - top="65" +top_pad="10" width="78"> Creator: </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" + layout="topleft" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> <text type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" + follows="left|right" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" name="LabelCreatorName" - top_delta="0" + top_delta="6" width="140"> Nicole Linden </text> <button follows="top|right" - height="16" - label="Profile..." + height="23" + label="Profile" layout="topleft" - left_delta="144" + right="-1" name="BtnCreator" - top_delta="0" + top_delta="-6" width="78" /> <text type="string" length="1" follows="left|top" - height="16" + height="23" layout="topleft" - left="10" + left="5" name="LabelOwnerTitle" - top="85" +top_pad="5" width="78"> Owner: </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" + layout="topleft" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> <text type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" + follows="left|right" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" name="LabelOwnerName" - top_delta="0" + top_delta="6" width="140"> Thrax Linden </text> <button follows="top|right" - height="16" - label="Profile..." + height="23" + label="Profile" layout="topleft" - left_delta="144" + right="-1" name="BtnOwner" - top_delta="0" + top_delta="-3" width="78" /> <text type="string" length="1" follows="left|top" - height="16" + height="23" layout="topleft" - left="10" + left="5" name="LabelAcquiredTitle" - top="105" +top_pad="10" width="78"> Acquired: </text> @@ -187,7 +217,7 @@ type="string" length="1" follows="left|top" - height="16" + height="23" layout="topleft" left_delta="78" name="LabelAcquiredDate" @@ -195,134 +225,146 @@ width="222"> Wed May 24 12:50:46 2006 </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="OwnerLabel" - top="125" - width="78"> - You: - </text> + <panel + border="false" + follows="left|top" + layout="topleft" + mouse_opaque="false" + background_visible="true" + bg_alpha_color="DkGray" + name="perms_inv" + left="0" + top_pad="25" + height="155" + width="313"> + <text + type="string" + length="1" + left="10" + top_pad="13" + text_color="EmphasisColor" + height="15" + follows="left|top|right" + layout="topleft" + name="perm_modify" + width="200"> + You can: + </text> <check_box - height="16" - label="Edit" + height="18" + label="Modify" layout="topleft" - left_pad="5" + left="20" name="CheckOwnerModify" - top_delta="0" - width="78" /> + top_pad="0" + width="90" /> <check_box - height="16" + height="18" label="Copy" layout="topleft" - left_delta="0" + left_pad="0" name="CheckOwnerCopy" - top_pad="5" - width="88" /> + width="90" /> <check_box - height="16" - label="Resell" + height="18" + label="Transfer" layout="topleft" - left_delta="0" + left_pad="0" name="CheckOwnerTransfer" - top_pad="5" width="106" /> <text type="string" length="1" follows="left|top" - height="10" + height="16" layout="topleft" left="10" name="AnyoneLabel" - top_pad="5" - width="78"> + top_pad="8" + width="100"> Anyone: </text> <check_box - height="16" + height="18" label="Copy" layout="topleft" - left_pad="5" + left_pad="0" name="CheckEveryoneCopy" - top_delta="0" - width="130" /> + top_delta="-2" + width="150" /> <text type="string" length="1" follows="left|top" - height="10" + height="16" layout="topleft" left="10" name="GroupLabel" - top_pad="5" - width="78"> + top_pad="8" + width="100"> Group: </text> <check_box - height="16" + height="18" label="Share" layout="topleft" - left_pad="5" + left_pad="0" + top_delta="-2" name="CheckShareWithGroup" - top_delta="5" - width="106" /> + tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." + width="150" /> <text type="string" length="1" follows="left|top" - height="25" + height="16" layout="topleft" left="10" name="NextOwnerLabel" - top_pad="5" - width="78" + top_pad="8" + width="200" word_wrap="true"> Next owner: </text> <check_box - height="16" - label="Edit" + height="18" + label="Modify" layout="topleft" - left_pad="5" + left="20" + top_pad="0" name="CheckNextOwnerModify" - top_delta="0" - width="78" /> + width="90" /> <check_box - height="16" + height="18" label="Copy" layout="topleft" - left_delta="0" + left_pad="0" name="CheckNextOwnerCopy" - top_pad="5" - width="88" /> + width="90" /> <check_box - height="16" - label="Resell" + height="18" + label="Transfer" layout="topleft" - left_delta="0" + left_pad="0" name="CheckNextOwnerTransfer" - top_pad="5" + tool_tip="Next owner can give away or resell this object" width="106" /> + </panel> <check_box - height="16" + height="18" label="For Sale" layout="topleft" - left="10" + left="20" name="CheckPurchase" - top_pad="5" - width="78" /> + top_pad="20" + width="100" /> <combo_box - height="19" - left_pad="5" + height="23" + left_pad="0" layout="topleft" follows="left|top" name="combobox sale copy" - width="110"> + width="170"> <combo_box.item label="Copy" name="Copy" @@ -338,26 +380,14 @@ increment="1" control_name="Edit Cost" name="Edit Cost" - label="Price:" - label_width="100" - left="10" - width="192" + label="Price: L$" + label_width="75" + left="120" + width="170" min_val="1" - height="19" + height="23" max_val="999999999" - top_pad="5"/> - <text - type="string" - length="1" - height="15" - follows="left|top" - layout="topleft" - left_delta="82" - name="CurrencySymbol" - top_delta="1" - width="18"> - L$ - </text> + top_pad="10"/> <!--line_editor border_style="line" border_thickness="1" @@ -480,40 +510,4 @@ Price: L$ </text--> </panel> - <panel - height="25" - layout="bottomright" - help_topic="button_tab" - name="button_panel" - left="5" - bottom="5" - width="313"> - <button - follows="bottom|left" - height="25" - label="Edit" - layout="topleft" - left="0" - name="edit_btn" - top="0" - width="50" /> - <button - follows="bottom|right" - height="25" - label="Cancel" - layout="topleft" - name="cancel_btn" - right="-1" - top="0" - width="70" /> - <button - follows="bottom|right" - height="25" - label="Save" - layout="topleft" - name="save_btn" - left_pad="-135" - top="0" - width="60" /> - </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index 348f0dfc095edf6a4bb8eb823a3ccab16b8a0cfc..eff2ca1fcdeb516846c561c6b157507de783f9d9 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -482,16 +482,7 @@ left="5" bottom="5" width="313"> - <button - follows="bottom|left" - height="25" - label="Edit" - layout="topleft" - left="0" - name="edit_btn" - top="0" - width="50" /> - <button + <button follows="bottom|left" height="25" label="Open" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 91fd91ebff44d36c97e3c0449779a7bbc370ba4e..6938048d8b4c459453374327660a6811f96b895a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -460,7 +460,7 @@ Returns the rotation of detected object number (returns <0,0,0,1> if numbe </string> <string name="LSLTipText_llDetectedGroup" translate="false"> integer llDetectedGroup(integer number) -Returns TRUE if detected object is part of same group as owner +Returns an integer that is a boolean representing if the detected object or avatar is in the same group that the prim containing the script is set to </string> <string name="LSLTipText_llDetectedLinkNumber" translate="false"> integer llDetectedLinkNumber(integer number) @@ -812,7 +812,7 @@ Preloads a sound on viewers within range </string> <string name="LSLTipText_llRotLookAt" translate="false"> llRotLookAt(rotation target, float strength, float damping) -Causes object name to point its forward axis towards target +Causes object to point its forward axis towards target </string> <string name="LSLTipText_llStringLength" translate="false"> integer llStringLength(string str) @@ -1471,7 +1471,7 @@ Returns the requested permission mask for the root object the task is attached t </string> <string name="LSLTipText_llSetObjectPermMask" translate="false"> llSetObjectPermMask(integer mask, integer value) -Sets the given permission mask to the new value on the root object the task is attached to +Sets the given permission mask to the new value on the root object the task is attached to (requires God Mode) </string> <string name="LSLTipText_llGetInventoryPermMask" translate="false"> integer llGetInventoryPermMask(string item, integer mask) @@ -1479,7 +1479,7 @@ Returns the requested permission mask for the inventory item </string> <string name="LSLTipText_llSetInventoryPermMask" translate="false"> llSetInventoryPermMask(string item, integer mask, integer value) -Sets the given permission mask to the new value on the inventory item +Sets the given permission mask to the new value on the inventory item (requires God Mode) </string> <string name="LSLTipText_llGetInventoryCreator" translate="false"> key llGetInventoryCreator(string item) @@ -1770,7 +1770,8 @@ Clears (deletes) the media and all params from the given face. <string name="tattoo">Tattoo</string> <string name="invalid">invalid</string> - <!-- notify --> + <!-- LLGroupNotify --> + <!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 --> <string name="next">Next</string> <string name="ok">OK</string> <string name="GroupNotifyGroupNotice">Group Notice</string> @@ -1780,6 +1781,7 @@ Clears (deletes) the media and all params from the given face. <string name="GroupNotifyViewPastNotices">View past notices or opt-out of receiving these messages here.</string> <string name="GroupNotifyOpenAttachment">Open Attachment</string> <string name="GroupNotifySaveAttachment">Save Attachment</string> + <string name="TeleportOffer">Teleport offering</string> <!-- start-up toast's string--> <string name="StartUpNotifications">New notifications arrived while you were away.</string> @@ -1805,6 +1807,7 @@ Clears (deletes) the media and all params from the given face. <!-- inventory --> <string name="InventoryNoMatchingItems">No matching items found in inventory.</string> + <string name="FavoritesNoMatchingItems">Drag and drop a landmark here to add to your favorites.</string> <string name="InventoryNoTexture"> You do not have a copy of this texture in your inventory @@ -2214,7 +2217,7 @@ If this message persists, restart your computer. [APP_NAME] appears to have frozen or crashed on the previous run. Would you like to send a crash report? </string> - <string name="MBAlert">Alert</string> + <string name="MBAlert">Notification</string> <string name="MBNoDirectX"> [APP_NAME] is unable to detect DirectX 9.0b or greater. [APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b. @@ -2854,6 +2857,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="inventory_item_offered-im"> Inventory item offered </string> + <string name="share_alert"> + Drag items from inventory here + </string> + <string name="only_user_message"> You are the only user in this session. diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 0e34243349aa8357022808947d57e540b17065f3..48baa2812d70889ac4fe751e2062bd13a09e5065 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -4,6 +4,7 @@ search_button_visible="true" text_pad_left="7" select_on_focus="true" + text_tentative_color="TextFgTentativeColor" background_image="TextField_Search_Off" background_image_disabled="TextField_Search_Disabled" background_image_focused="TextField_Search_Active"> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 0e2700cb80fed410422e357a70d17dbb6af145a5..7ac44b412d47c6b4198b8a7fef28f493e2bd2c8d 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -22,9 +22,12 @@ > <!-- *NOTE: Tooltips are in strings.xml so they can be localized. See LocationCtrlAddLandmarkTooltip etc. --> - <info_button name="Place Information" - width="16" - height="16" + <info_button + name="Place Information" + width="16" + height="16" + left="4" + top="20" follows="left|top" hover_glow_amount="0.15" image_unselected="Info_Off" @@ -43,8 +46,8 @@ left="-3" /> <for_sale_button name="for_sale_btn" - image_unselected="parcel_lght_ForSale" - image_selected="parcel_lght_ForSale" + image_unselected="Parcel_ForSale_Light" + image_selected="Parcel_ForSale_Light" width="22" height="18" follows="right|top" @@ -58,7 +61,7 @@ height="18" top="21" follows="right|top" - image_name="parcel_lght_VoiceNo" + image_name="Parcel_VoiceNo_Light" /> <fly_icon name="fly_icon" @@ -66,7 +69,7 @@ height="18" top="21" follows="right|top" - image_name="parcel_lght_FlyNo" + image_name="Parcel_FlyNo_Light" /> <push_icon name="push_icon" @@ -74,7 +77,7 @@ height="18" top="21" follows="right|top" - image_name="parcel_lght_PushNo" + image_name="Parcel_PushNo_Light" /> <build_icon name="build_icon" @@ -82,7 +85,7 @@ height="18" top="21" follows="right|top" - image_name="parcel_lght_BuildNo" + image_name="Parcel_BuildNo_Light" /> <scripts_icon name="scripts_icon" @@ -90,7 +93,7 @@ height="18" top="21" follows="right|top" - image_name="parcel_lght_ScriptsNo" + image_name="Parcel_ScriptsNo_Light" /> <!-- NOTE: Placeholder icon, there is no dark grayscale version --> <damage_icon @@ -99,7 +102,7 @@ height="18" top="21" follows="right|top" - image_name="parcel_lght_Damage" + image_name="Parcel_Damage_Light" /> <!-- Default text color is invisible on top of nav bar background --> <damage_text diff --git a/indra/newview/skins/default/xui/en/widgets/output_monitor.xml b/indra/newview/skins/default/xui/en/widgets/output_monitor.xml index 98b3e2faaada9f6dbd9e6a97734a19d1f786de4f..21b957d089a6b18c56cff5c8ef668c804d0b3ba6 100644 --- a/indra/newview/skins/default/xui/en/widgets/output_monitor.xml +++ b/indra/newview/skins/default/xui/en/widgets/output_monitor.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <output_monitor - image_mute="parcel_lght_VoiceNo" + image_mute="Parcel_VoiceNo_Light" image_off="VoicePTT_Off" image_on="VoicePTT_On" image_level_1="VoicePTT_Lvl1" diff --git a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml index c2a70d4b39dcaaa53a544995007089b1267fee0f..5d429d5b5b989a67e46fd7a4af5748352335c631 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml @@ -13,7 +13,8 @@ <combo_editor name="child1" select_on_focus="true" - text_pad_left="30" + text_pad_left="30" + text_tentative_color="TextFgTentativeColor" background_image="TextField_Search_Off" background_image_disabled="TextField_Search_Disabled" background_image_focused="TextField_Search_Active"/> diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index f644a710b224ba9a7d27539e3eb459ff21190af6..1616e4c3f746e10740058628ff9d01c97af8865a 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -4,6 +4,7 @@ search_button_visible="true" text_pad_left="6" select_on_focus="true" + text_tentative_color="TextFgTentativeColor" background_image="TextField_Search_Off" background_image_disabled="TextField_Search_Disabled" background_image_focused="TextField_Search_Active" > diff --git a/indra/newview/skins/default/xui/en/widgets/spinner.xml b/indra/newview/skins/default/xui/en/widgets/spinner.xml index ab3f8df5f885af6b5d6749a7f0dd236b01353737..d7af6077e51388246ca6562b224ffc5fb9ca0caa 100644 --- a/indra/newview/skins/default/xui/en/widgets/spinner.xml +++ b/indra/newview/skins/default/xui/en/widgets/spinner.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <spinner text_enabled_color="LabelTextColor" text_disabled_color="LabelDisabledColor" - font="SansSerif" + font="SansSerifSmall" decimal_digits="3" label_width="40" > <spinner.up_button name="SpinCtrl Up" diff --git a/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c559aa18592be949c7fdcd2a10cb2683a19c595 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Menu items for the back button drop-down menu of locations. + Based on menu_item_call.xml --> +<teleport_history_menu_item + back_item_font="SansSerif" + current_item_font="SansSerif" + forward_item_font="SansSerif" + /> diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp index 6ff2c9446e72d723e340d38d7c03786314d93d98..33d413bd21133757f8d28a9fa5bdba61dde71b4f 100644 --- a/indra/newview/tests/llmediadataclient_test.cpp +++ b/indra/newview/tests/llmediadataclient_test.cpp @@ -75,15 +75,13 @@ <string>baz</string> \ </array>" -#define _DATA_URLS(ID,DIST,INT,URL1,URL2) " \ +#define _DATA_URLS(ID,INTEREST,NEW,URL1,URL2) " \ <llsd> \ <map> \ <key>uuid</key> \ <string>" ID "</string> \ - <key>distance</key> \ - <real>" DIST "</real> \ <key>interest</key> \ - <real>" INT "</real> \ + <real>" INTEREST "</real> \ <key>cap_urls</key> \ <map> \ <key>ObjectMedia</key> \ @@ -93,21 +91,26 @@ </map> \ <key>media_data</key> \ " MEDIA_DATA " \ + <key>is_dead</key> \ + <boolean>false</boolean> \ + <key>is_new</key> \ + <boolean>" NEW "</boolean> \ </map> \ </llsd>" -#define _DATA(ID,DIST,INT) _DATA_URLS(ID,DIST,INT,FAKE_OBJECT_MEDIA_CAP_URL,FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL) +#define _DATA(ID,INTEREST,NEW) _DATA_URLS(ID,INTEREST,NEW,FAKE_OBJECT_MEDIA_CAP_URL,FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL) -const char *DATA = _DATA(VALID_OBJECT_ID,"1.0","1.0"); +const char *DATA = _DATA(VALID_OBJECT_ID,"1.0","true"); #define STR(I) boost::lexical_cast<std::string>(I) #define LOG_TEST(N) LL_DEBUGS("LLMediaDataClient") << "\n" << \ "================================================================================\n" << \ -"===================================== TEST " #N " ===================================\n" << \ +"==================================== TEST " #N " ===================================\n" << \ "================================================================================\n" << LL_ENDL; LLSD *gPostRecords = NULL; +F64 gMinimumInterestLevel = (F64)0.0; // stubs: void LLHTTPClient::post( @@ -125,21 +128,20 @@ void LLHTTPClient::post( gPostRecords->append(record); // Magic URL that triggers a 503: + LLSD result; + result[LLTextureEntry::OBJECT_ID_KEY] = body[LLTextureEntry::OBJECT_ID_KEY]; if ( url == FAKE_OBJECT_MEDIA_CAP_URL_503 ) { responder->error(HTTP_SERVICE_UNAVAILABLE, "fake reason"); + return; } else if (url == FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL_ERROR) { - LLSD result; LLSD error; error["code"] = LLObjectMediaNavigateClient::ERROR_PERMISSION_DENIED_CODE; result["error"] = error; - responder->result(result); - } - else { - responder->result(LLSD()); - } + } + responder->result(result); } const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f; @@ -152,13 +154,12 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject std::istringstream d(data); LLSDSerialize::fromXML(mRep, d); mNumBounceBacks = 0; - mDead = false; // std::cout << ll_pretty_print_sd(mRep) << std::endl; // std::cout << "ID: " << getID() << std::endl; } LLMediaDataClientObjectTest(const LLSD &rep) - : mRep(rep), mNumBounceBacks(0), mDead(false) {} + : mRep(rep), mNumBounceBacks(0) {} ~LLMediaDataClientObjectTest() { LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClientObjectTest" << LL_ENDL; } @@ -169,43 +170,47 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject virtual LLUUID getID() const { return mRep["uuid"]; } virtual void mediaNavigateBounceBack(U8 index) - { - mNumBounceBacks++; - } + { mNumBounceBacks++; } virtual bool hasMedia() const { return mRep.has("media_data"); } - virtual void updateObjectMediaData(LLSD const &media_data_array) - { mRep["media_data"] = media_data_array; } + virtual void updateObjectMediaData(LLSD const &media_data_array, const std::string &media_version) + { mRep["media_data"] = media_data_array; mRep["media_version"] = media_version; } + + virtual F64 getMediaInterest() const + { return (LLSD::Real)mRep["interest"]; } - virtual F64 getDistanceFromAvatar() const - { return (LLSD::Real)mRep["distance"]; } + virtual bool isInterestingEnough() const + { return getMediaInterest() > gMinimumInterestLevel; } - virtual F64 getTotalMediaInterest() const - { return (LLSD::Real)mRep["interest"]; } - virtual std::string getCapabilityUrl(const std::string &name) const { return mRep["cap_urls"][name]; } virtual bool isDead() const - { return mDead; } - - void setDistanceFromAvatar(F64 val) - { mRep["distance"] = val; } + { return mRep["is_dead"]; } + + virtual U32 getMediaVersion() const + { return (LLSD::Integer)mRep["media_version"]; } + + virtual bool isNew() const + { return mRep["is_new"]; } - void setTotalMediaInterest(F64 val) + void setMediaInterest(F64 val) { mRep["interest"] = val; } int getNumBounceBacks() const { return mNumBounceBacks; } void markDead() - { mDead = true; } + { mRep["is_dead"] = true; } + + void markOld() + { mRep["is_new"] = false; } + private: LLSD mRep; int mNumBounceBacks; - bool mDead; }; // This special timer delay should ensure that the timer will fire on the very @@ -224,10 +229,11 @@ namespace tut { mediadataclient() { gPostRecords = &mLLSD; + gMinimumInterestLevel = (F64)0.0; - //LLError::setDefaultLevel(LLError::LEVEL_DEBUG); - //LLError::setClassLevel("LLMediaDataClient", LLError::LEVEL_DEBUG); - //LLError::setTagLevel("MediaOnAPrim", LLError::LEVEL_DEBUG); +// LLError::setDefaultLevel(LLError::LEVEL_DEBUG); +// LLError::setClassLevel("LLMediaDataClient", LLError::LEVEL_DEBUG); +// LLError::setTagLevel("MediaOnAPrim", LLError::LEVEL_DEBUG); } LLSD mLLSD; }; @@ -378,11 +384,11 @@ namespace tut LOG_TEST(4); LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest( - _DATA(VALID_OBJECT_ID_1,"3.0","1.0")); + _DATA(VALID_OBJECT_ID_1,"1.0","true")); LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest( - _DATA(VALID_OBJECT_ID_2,"1.0","1.0")); + _DATA(VALID_OBJECT_ID_2,"3.0","true")); LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest( - _DATA(VALID_OBJECT_ID_3,"2.0","1.0")); + _DATA(VALID_OBJECT_ID_3,"2.0","true")); { LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); const char *ORDERED_OBJECT_IDS[] = { VALID_OBJECT_ID_2, VALID_OBJECT_ID_3, VALID_OBJECT_ID_1 }; @@ -428,8 +434,7 @@ namespace tut LLMediaDataClientObject::ptr_t o = new LLMediaDataClientObjectTest( _DATA_URLS(VALID_OBJECT_ID, - "1.0", - "1.0", + "1.0","true", FAKE_OBJECT_MEDIA_CAP_URL_503, FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL)); int num_refs_start = o->getNumRefs(); @@ -484,8 +489,7 @@ namespace tut LLMediaDataClientObject::ptr_t o = new LLMediaDataClientObjectTest( _DATA_URLS(VALID_OBJECT_ID, - "1.0", - "1.0", + "1.0","true", FAKE_OBJECT_MEDIA_CAP_URL, FAKE_OBJECT_MEDIA_NAVIGATE_CAP_URL_ERROR)); { @@ -517,9 +521,9 @@ namespace tut LOG_TEST(7); LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest( - _DATA(VALID_OBJECT_ID_1,"3.0","1.0")); + _DATA(VALID_OBJECT_ID_1,"3.0","true")); LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest( - _DATA(VALID_OBJECT_ID_2,"1.0","1.0")); + _DATA(VALID_OBJECT_ID_2,"1.0","true")); int num_refs_start = o1->getNumRefs(); { LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); @@ -551,10 +555,10 @@ namespace tut // Test queue handling of objects that are marked dead. LOG_TEST(8); - LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","1.0")); - LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","1.0")); - LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","1.0")); - LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","1.0")); + LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"4.0","true")); + LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"3.0","true")); + LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"2.0","true")); + LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"1.0","true")); { LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); @@ -616,10 +620,11 @@ namespace tut // LOG_TEST(9); - LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"10.0","1.0")); - LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"20.0","1.0")); - LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"30.0","1.0")); - LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"40.0","1.0")); + LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"40.0","true")); + LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"30.0","true")); + LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"20.0","true")); + LLMediaDataClientObjectTest *object4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"10.0","true")); + LLMediaDataClientObject::ptr_t o4 = object4; { LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); @@ -630,53 +635,52 @@ namespace tut mdc->fetchMedia(o3); mdc->fetchMedia(o4); - int test_num = 0; + int tick_num = 0; - ensure(STR(test_num) + ". is in queue 1", mdc->isInQueue(o1)); - ensure(STR(test_num) + ". is in queue 2", mdc->isInQueue(o2)); - ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3)); - ensure(STR(test_num) + ". is in queue 4", mdc->isInQueue(o4)); - ensure(STR(test_num) + ". post records", gPostRecords->size(), 0); + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 0); ::pump_timers(); - ++test_num; + ++tick_num; // The first tick should remove the first one - ensure(STR(test_num) + ". is not in queue 1", !mdc->isInQueue(o1)); - ensure(STR(test_num) + ". is in queue 2", mdc->isInQueue(o2)); - ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3)); - ensure(STR(test_num) + ". is in queue 4", mdc->isInQueue(o4)); - ensure(STR(test_num) + ". post records", gPostRecords->size(), 1); + ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 1); // Now, pretend that object 4 moved relative to the avatar such // that it is now closest - static_cast<LLMediaDataClientObjectTest*>( - static_cast<LLMediaDataClientObject*>(o4))->setDistanceFromAvatar(5.0); + object4->setMediaInterest(50.0); ::pump_timers(); - ++test_num; + ++tick_num; // The second tick should still pick off item 2, but then re-sort // have picked off object 4 - ensure(STR(test_num) + ". is in queue 2", mdc->isInQueue(o2)); - ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3)); - ensure(STR(test_num) + ". is not in queue 4", !mdc->isInQueue(o4)); - ensure(STR(test_num) + ". post records", gPostRecords->size(), 2); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2); ::pump_timers(); - ++test_num; + ++tick_num; // The third tick should pick off object 2 - ensure(STR(test_num) + ". is not in queue 2", !mdc->isInQueue(o2)); - ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3)); - ensure(STR(test_num) + ". post records", gPostRecords->size(), 3); + ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3); // The fourth tick should pick off object 3 ::pump_timers(); - ++test_num; + ++tick_num; - ensure(STR(test_num) + ". is not in queue 3", !mdc->isInQueue(o3)); - ensure(STR(test_num) + ". post records", gPostRecords->size(), 4); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 4); ensure("queue empty", mdc->isEmpty()); } @@ -686,4 +690,249 @@ namespace tut ensure("refcount of o4", o4->getNumRefs(), 1); } + + template<> template<> + void mediadataclient_object_t::test<10>() + { + // + // Test using the "round-robin" queue + // + LOG_TEST(10); + + LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","true")); + LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","true")); + LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","false")); + LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","false")); + { + LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); + + // queue up all 4 objects. The first two should be in the sorted + // queue [2 1], the second in the round-robin queue. The queues + // are serviced interleaved, so we should expect: + // 2, 4, 1, 3 + mdc->fetchMedia(o1); + mdc->fetchMedia(o2); + mdc->fetchMedia(o3); + mdc->fetchMedia(o4); + + int tick_num = 0; + + // 0 + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 0); + + ::pump_timers(); + ++tick_num; + + // 1 The first tick should remove object 2 + ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 1); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[0]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_2)); + + ::pump_timers(); + ++tick_num; + + // 2 The second tick should send object 4, but it will still be + // "in the queue" + ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[1]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_4)); + + ::pump_timers(); + ++tick_num; + + // 3 The third tick should remove object 1 + ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[2]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_1)); + + ::pump_timers(); + ++tick_num; + + // 4 The fourth tick should send object 3, but it will still be + // "in the queue" + ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 4); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[3]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_3)); + + ::pump_timers(); + ++tick_num; + + // 5 The fifth tick should now identify objects 3 and 4 as no longer + // needing "updating", and remove them from the queue + ensure(STR(tick_num) + ". is not in queue 2", !mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 4); + + ::pump_timers(); + + // Whew....better be empty + ensure("queue empty", mdc->isEmpty()); + } + ensure("refcount of o1", o1->getNumRefs(), 1); + ensure("refcount of o2", o2->getNumRefs(), 1); + ensure("refcount of o3", o3->getNumRefs(), 1); + ensure("refcount of o4", o4->getNumRefs(), 1); + } + + + template<> template<> + void mediadataclient_object_t::test<11>() + { + // + // Test LLMediaDataClient's destructor + // + LOG_TEST(11); + + LLMediaDataClientObject::ptr_t o = new LLMediaDataClientObjectTest(DATA); + int num_refs_start = o->getNumRefs(); + { + LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); + mdc->fetchMedia(o); + // must tick enough times to clear refcount of mdc + ::pump_timers(); + } + // Make sure everyone's destroyed properly + ensure("REF COUNT", o->getNumRefs(), num_refs_start); + } + + template<> template<> + void mediadataclient_object_t::test<12>() + { + // + // Test the "not interesting enough" call + // + LOG_TEST(12); + + LLMediaDataClientObjectTest *object1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","true")); + LLMediaDataClientObject::ptr_t o1 = object1; + LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","true")); + LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","true")); + LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","true")); + { + LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD); + + // queue up all 4 objects. The first two are "interesting enough". + // Firing the timer 4 times should therefore leave them. + // Note that they should be sorted 4,3,2,1 + // Then, we'll make one "interesting enough", fire the timer a few + // times, and make sure only it gets pulled off the queue + gMinimumInterestLevel = 2.5; + mdc->fetchMedia(o1); + mdc->fetchMedia(o2); + mdc->fetchMedia(o3); + mdc->fetchMedia(o4); + + int tick_num = 0; + + // 0 + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is in queue 4", mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 0); + + ::pump_timers(); + ++tick_num; + + // 1 The first tick should remove object 4 + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is in queue 3", mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 1); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[0]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_4)); + + ::pump_timers(); + ++tick_num; + + // 2 The second tick should send object 3 + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[1]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_3)); + + ::pump_timers(); + ++tick_num; + + // 3 The third tick should not pull off anything + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2); + + ::pump_timers(); + ++tick_num; + + // 4 The fourth tick (for good measure) should not pull off anything + ensure(STR(tick_num) + ". is in queue 1", mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 2); + + // Okay, now futz with object 1's interest, such that it is now + // "interesting enough" + object1->setMediaInterest((F64)5.0); + + // This should sort so that the queue is now [1 2] + ::pump_timers(); + ++tick_num; + + // 5 The fifth tick should now identify objects 3 and 4 as no longer + // needing "updating", and remove them from the queue + ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3); + ensure(STR(tick_num) + ". post object id", (*gPostRecords)[2]["body"][LLTextureEntry::OBJECT_ID_KEY].asUUID(), LLUUID(VALID_OBJECT_ID_1)); + + ::pump_timers(); + ++tick_num; + + // 6 The sixth tick should not pull off anything + ensure(STR(tick_num) + ". is not in queue 1", !mdc->isInQueue(o1)); + ensure(STR(tick_num) + ". is in queue 2", mdc->isInQueue(o2)); + ensure(STR(tick_num) + ". is not in queue 3", !mdc->isInQueue(o3)); + ensure(STR(tick_num) + ". is not in queue 4", !mdc->isInQueue(o4)); + ensure(STR(tick_num) + ". post records", gPostRecords->size(), 3); + + ::pump_timers(); + ++tick_num; + + // Whew....better NOT be empty ... o2 should still be there + ensure("queue not empty", !mdc->isEmpty()); + + // But, we need to clear the queue, or else we won't destroy MDC... + // this is a strange interplay between the queue timer and the MDC + ensure("o2 couldn't be removed from queue", mdc->removeFromQueue(o2)); + // tick + ::pump_timers(); + } + ensure("refcount of o1", o1->getNumRefs(), 1); + ensure("refcount of o2", o2->getNumRefs(), 1); + ensure("refcount of o3", o3->getNumRefs(), 1); + ensure("refcount of o4", o4->getNumRefs(), 1); + } } diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 801ca3bf72f82b15505bbacb6184dec08f3ed51f..3543558adacfb5f476988b00f1b38eb8549fe8d8 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -809,7 +809,7 @@ def construct(self): # plugins if self.prefix(src="", dst="bin/llplugin"): self.path("../media_plugins/webkit/libmedia_plugin_webkit.so", "libmedia_plugin_webkit.so") - self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_quicktime.so") + self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so") self.end_prefix("bin/llplugin") self.path("featuretable_linux.txt") diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index 27cb52a507fecef9d60a4a242f72381936a56547..d183aac208f1f5bdb622a570309f9e561b4f61d7 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -1529,7 +1529,21 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) #elif LL_WINDOWS std::string launcher_name( "SLPlugin.exe" ); #endif - media_source->init( launcher_name, plugin_name ); + + // for this test app, use the cwd as the user data path (ugh). +#if LL_WINDOWS + std::string user_data_path = ".\\"; +#else + char cwd[ FILENAME_MAX ]; + if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) + { + std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; + return; + } + std::string user_data_path = std::string( cwd ) + "/"; +#endif + + media_source->init( launcher_name, plugin_name, false, user_data_path ); media_source->setDisableTimeout(mDisableTimeout); // make a new panel and save parameters @@ -1752,7 +1766,21 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) #elif LL_WINDOWS std::string launcher_name( "SLPlugin.exe" ); #endif - media_source->init( launcher_name, plugin_name ); + + // for this test app, use the cwd as the user data path (ugh). +#if LL_WINDOWS + std::string user_data_path = ".\\"; +#else + char cwd[ FILENAME_MAX ]; + if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) + { + std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; + return; + } + std::string user_data_path = std::string( cwd ) + "/"; +#endif + + media_source->init( launcher_name, plugin_name, false, user_data_path ); media_source->setDisableTimeout(mDisableTimeout); // make a new panel and save parameters diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp index b14c59ab9ac1d702501ae9a26b1a92fe4619f69e..02c13716eddae0e5a037359968351f8e905f5e3a 100644 --- a/indra/viewer_components/login/lllogin.cpp +++ b/indra/viewer_components/login/lllogin.cpp @@ -133,9 +133,16 @@ void LLLogin::Impl::connect(const std::string& uri, const LLSD& credentials) void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credentials) { - LL_INFOS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self) - << " with uri '" << uri << "', credentials " << credentials << LL_ENDL; - // Arriving in SRVRequest state + LLSD printable_credentials = credentials; + if(printable_credentials.has("params") + && printable_credentials["params"].has("passwd")) + { + printable_credentials["params"]["passwd"] = "*******"; + } + LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self) + << " with uri '" << uri << "', credentials " << printable_credentials << LL_ENDL; + + // Arriving in SRVRequest state LLEventStream replyPump("reply", true); // Should be an array of one or more uri strings. LLSD rewrittenURIs; @@ -144,7 +151,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential sendProgressEvent("offline", "srvrequest"); // Request SRV record. - LL_INFOS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL; + LL_DEBUGS("LLLogin") << "Requesting SRV record from " << uri << LL_ENDL; // *NOTE:Mani - Completely arbitrary default timeout value for SRV request. F32 seconds_to_timeout = 5.0f; @@ -193,6 +200,11 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential LLSD progress_data; progress_data["attempt"] = attempts; progress_data["request"] = request; + if(progress_data["request"].has("params") + && progress_data["request"]["params"].has("passwd")) + { + progress_data["request"]["params"]["passwd"] = "*******"; + } sendProgressEvent("offline", "authenticating", progress_data); // We expect zero or more "Downloading" status events, followed by diff --git a/install.xml b/install.xml index cac3d52c23bbbaaa57d90e6348e382e39c3bea07..15b92e8f10768f1cc248fdcecbd4cc5523fe491a 100644 --- a/install.xml +++ b/install.xml @@ -1459,23 +1459,23 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>dd66471b31d369bb7bcbcc1a833d9070</string> + <string>90a08e3a1dffa2ea45c1227c4d4d01f7</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7653-darwin-20091126.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7714-darwin-20091208.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>e56745bc71fc22fc90f80cb359db7022</string> + <string>390fe4ed062cfb05bbc534772837ce5e</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7653-linux-20091126.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7714-linux-20091208.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>3081bcc821cdc016aa4127cb026e4311</string> + <string>0232fb487bd31ea756604d139b2a2e34</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7653-windows-20091126.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7714-windows-20091208.tar.bz2</uri> </map> </map> </map>