diff options
68 files changed, 521 insertions, 523 deletions
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 5a3990a8df..34d841a4e0 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -193,7 +193,12 @@ public: } protected: - LLInstanceTracker(KEY key) { add_(key); } + LLInstanceTracker(KEY key) + { + // make sure static data outlives all instances + getStatic(); + add_(key); + } virtual ~LLInstanceTracker() { // it's unsafe to delete instances of this type while all instances are being iterated over. @@ -281,7 +286,8 @@ public: protected: LLInstanceTracker() { - // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle. + // make sure static data outlives all instances + getStatic(); getSet_().insert(static_cast<T*>(this)); } virtual ~LLInstanceTracker() diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp index 128ba609cb..0e2f3f1961 100644 --- a/indra/llui/llcommandmanager.cpp +++ b/indra/llui/llcommandmanager.cpp @@ -41,7 +41,7 @@ // LLCommandId class // -const LLCommandId LLCommandId::null = LLCommandId(); +const LLCommandId LLCommandId::null = LLCommandId("null command"); // // LLCommand class @@ -67,10 +67,11 @@ LLCommand::Params::Params() } LLCommand::LLCommand(const LLCommand::Params& p) - : mAvailableInToybox(p.available_in_toybox) + : mIdentifier(p.name) + , mAvailableInToybox(p.available_in_toybox) , mIcon(p.icon) - , mIdentifier(p.name) , mLabelRef(p.label_ref) + , mName(p.name) , mTooltipRef(p.tooltip_ref) , mExecuteFunction(p.execute_function) , mExecuteParameters(p.execute_parameters) @@ -134,7 +135,7 @@ void LLCommandManager::addCommand(LLCommand * command) mCommandIndices[command_id.uuid()] = mCommands.size(); mCommands.push_back(command); - lldebugs << "Successfully added command: " << command->id().name() << llendl; + lldebugs << "Successfully added command: " << command->name() << llendl; } //static diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h index 9b93ab735a..a7276a48aa 100644 --- a/indra/llui/llcommandmanager.h +++ b/indra/llui/llcommandmanager.h @@ -50,31 +50,20 @@ public: {} }; - LLCommandId() - : mName("null command") - { - mUUID = LLUUID::generateNewID(mName); - } - LLCommandId(const std::string& name) - : mName(name) { mUUID = LLUUID::generateNewID(name); } LLCommandId(const Params& p) - : mName(p.name) { mUUID = LLUUID::generateNewID(p.name); } LLCommandId(const LLUUID& uuid) - : mName(""), - mUUID(uuid) - { - } + : mUUID(uuid) + {} - const std::string& name() const { return mName; } const LLUUID& uuid() const { return mUUID; } bool operator!=(const LLCommandId& command) const @@ -87,15 +76,9 @@ public: return (mUUID == command.mUUID); } - bool operator<(const LLCommandId& command) const - { - return (mName < command.mName); - } - static const LLCommandId null; private: - std::string mName; LLUUID mUUID; }; @@ -137,6 +120,7 @@ public: const std::string& icon() const { return mIcon; } const LLCommandId& id() const { return mIdentifier; } const std::string& labelRef() const { return mLabelRef; } + const std::string& name() const { return mName; } const std::string& tooltipRef() const { return mTooltipRef; } const std::string& executeFunctionName() const { return mExecuteFunction; } @@ -160,6 +144,7 @@ private: bool mAvailableInToybox; std::string mIcon; std::string mLabelRef; + std::string mName; std::string mTooltipRef; std::string mExecuteFunction; diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index ca2dc644a4..aea58be12a 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -162,10 +162,15 @@ void LLDockableFloater::setVisible(BOOL visible) void LLDockableFloater::setMinimized(BOOL minimize) { - if(minimize) + if(minimize && isDocked()) { + // minimizing a docked floater just hides it setVisible(FALSE); } + else + { + LLFloater::setMinimized(minimize); + } } LLView * LLDockableFloater::getDockWidget() diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index d1d840729d..7100ea13a7 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -165,6 +165,7 @@ LLFloater::Params::Params() : title("title"), short_title("short_title"), single_instance("single_instance", false), + reuse_instance("reuse_instance", false), can_resize("can_resize", false), can_minimize("can_minimize", true), can_close("can_close", true), @@ -174,6 +175,7 @@ LLFloater::Params::Params() save_rect("save_rect", false), save_visibility("save_visibility", false), can_dock("can_dock", false), + show_title("show_title", true), open_positioning("open_positioning", LLFloaterEnums::OPEN_POSITIONING_NONE), specified_left("specified_left"), specified_bottom("specified_bottom"), @@ -238,6 +240,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p) mTitle(p.title), mShortTitle(p.short_title), mSingleInstance(p.single_instance), + mReuseInstance(p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance), // reuse single-instance floaters by default mKey(key), mCanTearOff(p.can_tear_off), mCanMinimize(p.can_minimize), @@ -538,7 +541,6 @@ LLFloater::~LLFloater() delete mResizeHandle[i]; } - storeRectControl(); setVisible(false); // We're not visible if we're destroyed storeVisibilityControl(); storeDockStateControl(); @@ -683,7 +685,12 @@ void LLFloater::openFloater(const LLSD& key) } else { - applyControlsAndPosition(LLFloaterReg::getLastFloaterCascading()); + LLFloater* floater_to_stack = LLFloaterReg::getLastFloaterInGroup(mInstanceName); + if (!floater_to_stack) + { + floater_to_stack = LLFloaterReg::getLastFloaterCascading(); + } + applyControlsAndPosition(floater_to_stack); setMinimized(FALSE); setVisibleAndFrontmost(mAutoFocus); } @@ -776,12 +783,19 @@ void LLFloater::closeFloater(bool app_quitting) else { setVisible(FALSE); + if (!mReuseInstance) + { + destroy(); + } } } else { setVisible(FALSE); // hide before destroying (so handleVisibilityChange() gets called) - destroy(); + if (!mReuseInstance) + { + destroy(); + } } } } @@ -861,9 +875,16 @@ bool LLFloater::applyRectControl() { bool saved_rect = false; - // If we have a saved rect, use it - if (mRectControl.size() > 1) + LLFloater* last_in_group = LLFloaterReg::getLastFloaterInGroup(mInstanceName); + if (last_in_group && last_in_group != this) { + // other floaters in our group, position ourselves relative to them and don't save the rect + mRectControl.clear(); + mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP; + } + else if (mRectControl.size() > 1) + { + // If we have a saved rect, use it const LLRect& rect = getControlGroup()->getRect(mRectControl); saved_rect = rect.notEmpty(); if (saved_rect) @@ -912,6 +933,7 @@ void LLFloater::applyPositioning(LLFloater* other) } break; + case LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP: case LLFloaterEnums::OPEN_POSITIONING_CASCADING: if (other != NULL) { @@ -1051,6 +1073,7 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user) if (by_user) { storeRectControl(); + mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE; } // if not minimized, adjust all snapped dependents to new shape @@ -1142,10 +1165,6 @@ void LLFloater::setMinimized(BOOL minimize) mButtonsEnabled[BUTTON_RESTORE] = TRUE; } - if (mDragHandle) - { - mDragHandle->setVisible(TRUE); - } setBorderVisible(TRUE); for(handle_set_iter_t dependent_it = mDependents.begin(); @@ -1296,19 +1315,9 @@ void LLFloater::setIsChrome(BOOL is_chrome) mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome))); } - // no titles displayed on "chrome" floaters - if (mDragHandle) - mDragHandle->setTitleVisible(!is_chrome); - LLPanel::setIsChrome(is_chrome); } -void LLFloater::setTitleVisible(bool visible) -{ - if (mDragHandle) - mDragHandle->setTitleVisible(visible); -} - // Change the draw style to account for the foreground state. void LLFloater::setForeground(BOOL front) { @@ -1396,7 +1405,10 @@ void LLFloater::moveResizeHandlesToFront() BOOL LLFloater::isFrontmost() { - return gFloaterView && gFloaterView->getFrontmost() == this && getVisible(); + LLFloaterView* floater_view = getParentByType<LLFloaterView>(); + return getVisible() + && (floater_view + && floater_view->getFrontmost() == this); } void LLFloater::addDependentFloater(LLFloater* floaterp, BOOL reposition) @@ -1469,6 +1481,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask) if(offerClickToButton(x, y, mask, BUTTON_CLOSE)) return TRUE; if(offerClickToButton(x, y, mask, BUTTON_RESTORE)) return TRUE; if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE; + if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE; // Otherwise pass to drag handle for movement return mDragHandle->handleMouseDown(x, y, mask); @@ -1574,6 +1587,13 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock) { mDocked = docked; mButtonsEnabled[BUTTON_DOCK] = !mDocked; + + if (mDocked) + { + setMinimized(FALSE); + mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE; + } + updateTitleButtons(); storeDockStateControl(); @@ -1812,7 +1832,7 @@ void LLFloater::draw() { drawChild(mButtons[i]); } - drawChild(mDragHandle); + drawChild(mDragHandle, 0, 0, TRUE); } else { @@ -2963,6 +2983,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p) mHeaderHeight = p.header_height; mLegacyHeaderHeight = p.legacy_header_height; mSingleInstance = p.single_instance; + mReuseInstance = p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance; mOpenPositioning = p.open_positioning; mSpecifiedLeft = p.specified_left; @@ -2991,6 +3012,11 @@ void LLFloater::initFromParams(const LLFloater::Params& p) { setCloseCallback(initCommitCallback(p.close_callback)); } + + if (mDragHandle) + { + mDragHandle->setTitleVisible(p.show_title); + } } boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_t::slot_type& cb ) @@ -3239,7 +3265,6 @@ void LLFloater::stackWith(LLFloater& other) next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight()); - mRectControl.clear(); // don't save rect of stacked floaters setShape(next_rect); } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 8beb11507e..73e9c9e831 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -66,9 +66,9 @@ namespace LLFloaterEnums { OPEN_POSITIONING_NONE, OPEN_POSITIONING_CASCADING, + OPEN_POSITIONING_CASCADE_GROUP, OPEN_POSITIONING_CENTERED, OPEN_POSITIONING_SPECIFIED, - OPEN_POSITIONING_COUNT }; } @@ -120,6 +120,7 @@ public: short_title; Optional<bool> single_instance, + reuse_instance, can_resize, can_minimize, can_close, @@ -128,7 +129,8 @@ public: save_rect, save_visibility, save_dock_state, - can_dock; + can_dock, + show_title; Optional<LLFloaterEnums::EOpenPositioning> open_positioning; Optional<S32> specified_left; @@ -209,7 +211,6 @@ public: std::string getTitle() const; void setShortTitle( const std::string& short_title ); std::string getShortTitle() const; - void setTitleVisible(bool visible); virtual void setMinimized(BOOL b); void moveResizeHandlesToFront(); void addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE); @@ -409,6 +410,7 @@ private: LLUIString mShortTitle; BOOL mSingleInstance; // TRUE if there is only ever one instance of the floater + bool mReuseInstance; // true if we want to hide the floater when we close it instead of destroying it std::string mInstanceName; // Store the instance name so we can remove ourselves from the list BOOL mCanTearOff; diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 0edfc8da2d..e144b68f5e 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -167,6 +167,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key) res->setInstanceName(name); LLFloater *last_floater = (list.empty() ? NULL : list.back()); + res->applyControlsAndPosition(last_floater); gFloaterView->adjustToFitScreen(res, false); @@ -462,16 +463,16 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& else if (instance->isMinimized()) { instance->setMinimized(FALSE); - instance->setFocus(TRUE); + instance->setVisibleAndFrontmost(); } else if (!instance->isShown()) { instance->openFloater(key); - instance->setFocus(TRUE); + instance->setVisibleAndFrontmost(); } - else if (!instance->hasFocus() && !instance->getIsChrome()) + else if (!instance->isFrontmost()) { - instance->setFocus(TRUE); + instance->setVisibleAndFrontmost(); } else { diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 4991c4afa6..0e7060e22c 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -47,6 +47,19 @@ void LLLayoutStack::OrientationNames::declareValues() // // LLLayoutPanel // +LLLayoutPanel::Params::Params() +: expanded_min_dim("expanded_min_dim", 0), + min_dim("min_dim", 0), + max_dim("max_dim", S32_MAX), + user_resize("user_resize", true), + auto_resize("auto_resize", true) +{ + addSynonym(min_dim, "min_width"); + addSynonym(min_dim, "min_height"); + addSynonym(max_dim, "max_width"); + addSynonym(max_dim, "max_height"); +} + LLLayoutPanel::LLLayoutPanel(const Params& p) : LLPanel(p), mExpandedMinDimSpecified(false), @@ -527,8 +540,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize) // not enough room to fit existing contents if (force_resize == FALSE // layout did not complete by reaching target position - && ((mOrientation == VERTICAL && cur_y != -mPanelSpacing) - || (mOrientation == HORIZONTAL && cur_x != getRect().getWidth() + mPanelSpacing))) + && ((mOrientation == VERTICAL && llround(cur_y) != -mPanelSpacing) + || (mOrientation == HORIZONTAL && llround(cur_x) != getRect().getWidth() + mPanelSpacing))) { // do another layout pass with all stacked elements contributing // even those that don't usually resize diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 5d79505fc3..ede6149a80 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -161,18 +161,7 @@ public: Optional<bool> user_resize, auto_resize; - Params() - : expanded_min_dim("expanded_min_dim", 0), - min_dim("min_dim", 0), - max_dim("max_dim", 0), - user_resize("user_resize", true), - auto_resize("auto_resize", true) - { - addSynonym(min_dim, "min_width"); - addSynonym(min_dim, "min_height"); - addSynonym(max_dim, "max_width"); - addSynonym(max_dim, "max_height"); - } + Params(); }; ~LLLayoutPanel(); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 9c6a76822c..ad1f3c504d 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -548,23 +548,23 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) } S32 tab_count = getTabCount(); - if (tab_count > 0) + if (tab_count > 0 && !getTabsHidden()) { LLTabTuple* firsttuple = getTab(0); LLRect tab_rect; if (mIsVertical) { tab_rect = LLRect(firsttuple->mButton->getRect().mLeft, - has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop, - firsttuple->mButton->getRect().mRight, - has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom ); + has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop, + firsttuple->mButton->getRect().mRight, + has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom ); } else { tab_rect = LLRect(has_scroll_arrows ? mPrevArrowBtn->getRect().mRight : mJumpPrevArrowBtn->getRect().mLeft, - firsttuple->mButton->getRect().mTop, - has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight, - firsttuple->mButton->getRect().mBottom ); + firsttuple->mButton->getRect().mTop, + has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight, + firsttuple->mButton->getRect().mBottom ); } if( tab_rect.pointInRect( x, y ) ) { @@ -681,7 +681,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask) { static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0); BOOL handled = LLPanel::handleToolTip( x, y, mask); - if (!handled && getTabCount() > 0) + if (!handled && getTabCount() > 0 && !getTabsHidden()) { LLTabTuple* firsttuple = getTab(0); @@ -812,7 +812,9 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag { BOOL has_scroll_arrows = (getMaxScrollPos() > 0); - if( mDragAndDropDelayTimer.getStarted() && mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME ) + if( !getTabsHidden() + && mDragAndDropDelayTimer.getStarted() + && mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME ) { if (has_scroll_arrows) { diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 629c7d9bc7..515605200e 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -217,7 +217,7 @@ bool LLToolBar::addCommand(const LLCommandId& commandId, int rank) if ((rank >= mButtonCommands.size()) || (rank == RANK_NONE)) { // In that case, back load - mButtonCommands.push_back(commandId); + mButtonCommands.push_back(command->id()); mButtons.push_back(button); } else @@ -232,7 +232,7 @@ bool LLToolBar::addCommand(const LLCommandId& commandId, int rank) rank--; } // ...then insert - mButtonCommands.insert(it_command,commandId); + mButtonCommands.insert(it_command, command->id()); mButtons.insert(it_button,button); } @@ -302,7 +302,50 @@ bool LLToolBar::enableCommand(const LLCommandId& commandId, bool enabled) command_id_map::iterator it = mButtonMap.find(commandId.uuid()); if (it != mButtonMap.end()) { - it->second->setEnabled(enabled); + command_button = it->second; + command_button->setEnabled(enabled); + } + } + + return (command_button != NULL); +} + +bool LLToolBar::stopCommandInProgress(const LLCommandId& commandId) +{ + // + // Note from Leslie: + // + // This implementation was largely put in place to handle EXP-1348 which is related to + // dragging and dropping the "speak" button. The "speak" button can be in one of two + // modes, i.e., either a toggle action or a push-to-talk action. Because of this it + // responds to mouse down and mouse up in different ways, based on which behavior the + // button is currently set to obey. This was the simplest way of getting the button + // to turn off the microphone for both behaviors without risking duplicate state. + // + + LLToolBarButton * command_button = NULL; + + if (commandId != LLCommandId::null) + { + LLCommand* command = LLCommandManager::instance().getCommand(commandId); + llassert(command); + + // If this command has an explicit function for execution stop + if (command->executeStopFunctionName().length() > 0) + { + command_id_map::iterator it = mButtonMap.find(commandId.uuid()); + if (it != mButtonMap.end()) + { + command_button = it->second; + llassert(command_button->mIsRunningSignal); + + // Check to see if it is running + if ((*command_button->mIsRunningSignal)(command_button, command->isRunningParameters())) + { + // Trigger an additional button commit, which calls mouse down, mouse up and commit + command_button->onCommit(); + } + } } } @@ -778,7 +821,7 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id) if (!commandp) return NULL; LLToolBarButton::Params button_p; - button_p.name = id.name(); + button_p.name = commandp->name(); button_p.label = LLTrans::getString(commandp->labelRef()); button_p.tool_tip = LLTrans::getString(commandp->tooltipRef()); button_p.image_overlay = LLUI::getUIImage(commandp->icon()); @@ -956,13 +999,13 @@ BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask) { if (!mIsDragged) { - mStartDragItemCallback(x,y,mId.uuid()); + mStartDragItemCallback(x, y, this); mIsDragged = true; handled = TRUE; } else { - handled = mHandleDragItemCallback(x,y,mId.uuid(),LLAssetType::AT_WIDGET); + handled = mHandleDragItemCallback(x, y, mId.uuid(), LLAssetType::AT_WIDGET); } } else diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index 616710ea70..e634e57f93 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -36,8 +36,9 @@ #include "llassettype.h" class LLToolBar; +class LLToolBarButton; -typedef boost::function<void (S32 x, S32 y, const LLUUID& uuid)> tool_startdrag_callback_t; +typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_startdrag_callback_t; typedef boost::function<BOOL (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t; typedef boost::function<BOOL (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t; @@ -185,6 +186,7 @@ public: int removeCommand(const LLCommandId& commandId); // Returns the rank the removed command was at, RANK_NONE if not found bool hasCommand(const LLCommandId& commandId) const; bool enableCommand(const LLCommandId& commandId, bool enabled); + bool stopCommandInProgress(const LLCommandId& commandId); void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; } void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; } diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index fdb84f1ec5..3fd7e48428 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -721,7 +721,7 @@ LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& m // XDATA might be MASK, or S32 clicks template <typename METHOD, typename XDATA> -LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra) +LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block) { BOOST_FOREACH(LLView* viewp, mChildList) { @@ -734,7 +734,7 @@ LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDA } if ((viewp->*method)( local_x, local_y, extra ) - || viewp->blockMouseEvent( local_x, local_y )) + || (allow_mouse_block && viewp->blockMouseEvent( local_x, local_y ))) { viewp->logMouseEvent(); return viewp; @@ -1021,7 +1021,7 @@ BOOL LLView::handleMiddleMouseUp(S32 x, S32 y, MASK mask) LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks) { - return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks); + return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks, false); } // Called during downward traversal diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 6d1dda90af..08828e55e6 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -565,7 +565,7 @@ protected: private: template <typename METHOD, typename XDATA> - LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra); + LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block = true); template <typename METHOD, typename CHARTYPE> LLView* childrenHandleCharEvent(const std::string& desc, const METHOD& method, diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 1e295ada2d..183472450d 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -982,7 +982,7 @@ namespace LLInitParam if (parser.readValue(name)) { // try to parse a per type named value - if (name_value_lookup_t::getValueFromName(name, typed_param.mValues)) + if (name_value_lookup_t::getValueFromName(name, value)) { typed_param.add(value); typed_param.mValues.back().setValueName(name); @@ -1013,7 +1013,7 @@ namespace LLInitParam bool value_written = parser.writeValue(*it, name_stack); if (!value_written) { - std::string calculated_key = typed_param.calcValueName(typed_param.getValue()); + std::string calculated_key = it->calcValueName(key); if (!parser.writeValue(calculated_key, name_stack)) { break; diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index d4556113ea..878f992178 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -51,6 +51,14 @@ static LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs; static LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs; static LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs; +static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs; + +const char* NO_VALUE_MARKER = "no_value"; + +const S32 LINE_NUMBER_HERE = 0; + struct MaxOccur : public LLInitParam::ChoiceBlock<MaxOccur> { Alternative<int> count; @@ -1190,12 +1198,6 @@ struct ScopedFile LLFILE* mFile; }; -static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs; -static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs; -static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs; - -const char* NO_VALUE_MARKER = "no_value"; - LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb) : Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs), mCurReadDepth(0), @@ -1300,6 +1302,11 @@ void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int self->characterData(s, len); } +void LLSimpleXUIParser::characterData(const char *s, int len) +{ + mTextContents += std::string(s, len); +} + void LLSimpleXUIParser::startElement(const char *name, const char **atts) { processText(); @@ -1372,6 +1379,37 @@ void LLSimpleXUIParser::startElement(const char *name, const char **atts) } +void LLSimpleXUIParser::endElement(const char *name) +{ + bool has_text = processText(); + + // no text, attributes, or children + if (!has_text && mEmptyLeafNode.back()) + { + // submit this as a valueless name (even though there might be text contents we haven't seen yet) + mCurAttributeValueBegin = NO_VALUE_MARKER; + mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + } + + if (--mOutputStack.back().second == 0) + { + if (mOutputStack.empty()) + { + LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL; + } + mOutputStack.pop_back(); + } + + S32 num_tokens_to_pop = mTokenSizeStack.back(); + mTokenSizeStack.pop_back(); + while(num_tokens_to_pop-- > 0) + { + mNameStack.pop_back(); + } + mScope.pop_back(); + mEmptyLeafNode.pop_back(); +} + bool LLSimpleXUIParser::readAttributes(const char **atts) { typedef boost::tokenizer<boost::char_separator<char> > tokenizer; @@ -1421,43 +1459,6 @@ bool LLSimpleXUIParser::processText() return false; } -void LLSimpleXUIParser::endElement(const char *name) -{ - bool has_text = processText(); - - // no text, attributes, or children - if (!has_text && mEmptyLeafNode.back()) - { - // submit this as a valueless name (even though there might be text contents we haven't seen yet) - mCurAttributeValueBegin = NO_VALUE_MARKER; - mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); - } - - if (--mOutputStack.back().second == 0) - { - if (mOutputStack.empty()) - { - LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL; - } - mOutputStack.pop_back(); - } - - S32 num_tokens_to_pop = mTokenSizeStack.back(); - mTokenSizeStack.pop_back(); - while(num_tokens_to_pop-- > 0) - { - mNameStack.pop_back(); - } - mScope.pop_back(); - mEmptyLeafNode.pop_back(); -} - -void LLSimpleXUIParser::characterData(const char *s, int len) -{ - mTextContents += std::string(s, len); -} - - /*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName() { std::string full_name; @@ -1471,8 +1472,6 @@ void LLSimpleXUIParser::characterData(const char *s, int len) return full_name; } -const S32 LINE_NUMBER_HERE = 0; - void LLSimpleXUIParser::parserWarning(const std::string& message) { #ifdef LL_WINDOWS diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 391a864846..a44b895f7b 100644 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -10,7 +10,7 @@ is_running_function="Floater.IsOpen" is_running_parameters="about_land" /> - <command name="appearance" + <command name="appearance" available_in_toybox="true" icon="Command_Appearance_Icon" label_ref="Command_Appearance_Label" diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7396209e27..3c53a9d44c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1836,7 +1836,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>Cursor3D</key> <map> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 773e20eda7..f8b204eca0 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -175,7 +175,9 @@ bool LLAgent::isActionAllowed(const LLSD& sdname) } else if (param == "speak") { - if ( gAgent.isVoiceConnected() ) + if ( gAgent.isVoiceConnected() && + LLViewerParcelMgr::getInstance()->allowAgentVoice() && + ! LLVoiceClient::getInstance()->inTuningMode() ) { retval = true; } @@ -305,13 +307,6 @@ LLAgent::LLAgent() : mListener.reset(new LLAgentListener(*this)); mMoveTimer.stop(); - - LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback)); - - LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2)); - LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2)); - LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2)); - LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2)); } // Requires gSavedSettings to be initialized. @@ -333,6 +328,14 @@ void LLAgent::init() gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2)); gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2)); + + LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback)); + + LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2)); + LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2)); + LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2)); + LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2)); + mInitialized = TRUE; } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index e38f86d0fc..ecfd101eeb 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -89,6 +89,7 @@ #include "llweb.h" #include "llsecondlifeurls.h" #include "llupdaterservice.h" +#include "llcallfloater.h" // Linden library includes #include "llavatarnamecache.h" @@ -112,6 +113,7 @@ #include <boost/foreach.hpp> + #if LL_WINDOWS # include <share.h> // For _SH_DENYWR in initMarkerFile #else @@ -1183,6 +1185,7 @@ bool LLAppViewer::mainLoop() LLVoiceChannel::initClass(); LLVoiceClient::getInstance()->init(gServicePump); + LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true); LLTimer frameTimer,idleTimer; LLTimer debugTime; LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index cc2a189b76..e3217668c5 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -44,6 +44,7 @@ #include "llparticipantlist.h" #include "llspeakers.h" #include "lltextutil.h" +#include "lltransientfloatermgr.h" #include "llviewercontrol.h" #include "llviewerdisplayname.h" #include "llviewerwindow.h" @@ -96,7 +97,7 @@ static void* create_non_avatar_caller(void*) LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = NULL; LLCallFloater::LLCallFloater(const LLSD& key) -: LLFloater(key) +: LLTransientDockableFloater(NULL, false, key) , mSpeakerManager(NULL) , mParticipants(NULL) , mAvatarList(NULL) @@ -112,6 +113,7 @@ LLCallFloater::LLCallFloater(const LLSD& key) mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL); LLVoiceClient::instance().addObserver(this); + LLTransientFloaterMgr::getInstance()->addControlView(this); // update the agent's name if display name setting change LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this)); @@ -134,6 +136,7 @@ LLCallFloater::~LLCallFloater() { LLVoiceClient::getInstance()->removeObserver(this); } + LLTransientFloaterMgr::getInstance()->removeControlView(this); } // virtual @@ -151,10 +154,6 @@ BOOL LLCallFloater::postBuild() connectToChannel(LLVoiceChannel::getCurrentVoiceChannel()); - setIsChrome(true); - //chrome="true" hides floater caption - if (mDragHandle) - mDragHandle->setTitleVisible(TRUE); updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) updateSession(); diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 7282f7a8be..00a3f76e56 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -28,7 +28,7 @@ #ifndef LL_LLCALLFLOATER_H #define LL_LLCALLFLOATER_H -#include "llfloater.h" +#include "lltransientdockablefloater.h" #include "llvoicechannel.h" #include "llvoiceclient.h" @@ -52,7 +52,7 @@ class LLSpeakersDelayActionsStorage; * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel * also provides a 'Leave Call' button to allow the Resident to leave that voice channel. */ -class LLCallFloater : public LLFloater, LLVoiceClientParticipantObserver +class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver { public: @@ -262,6 +262,9 @@ private: */ static LLVoiceChannel* sCurrentVoiceChannel; + /* virtual */ + LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; } + boost::signals2::connection mVoiceChannelStateChangeConnection; }; diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index cc6ba05e7e..ba511a3693 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -147,3 +147,12 @@ LLDebugView::~LLDebugView() gTextureCategoryView = NULL; } +void LLDebugView::draw() +{ + LLView* floater_snap_region = getRootView()->getChildView("floater_snap_region"); + LLRect debug_rect; + floater_snap_region->localRectToOtherView(floater_snap_region->getLocalRect(), &debug_rect, getParent()); + + setShape(debug_rect); + LLView::draw(); +} diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h index 20262fc89e..907a42c981 100644 --- a/indra/newview/lldebugview.h +++ b/indra/newview/lldebugview.h @@ -55,6 +55,7 @@ public: ~LLDebugView(); void init(); + void draw(); void setStatsVisible(BOOL visible); diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index aa78bc4f29..b33dea4890 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -347,13 +347,12 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val) mPrevMode(CAMERA_CTRL_MODE_PAN) { LLHints::registerHintTarget("view_popup", LLView::getHandle()); + mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); } // virtual BOOL LLFloaterCamera::postBuild() { - setIsChrome(TRUE); - setTitleVisible(TRUE); // restore title visibility after chrome applying updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) mRotate = getChild<LLJoystickCameraRotate>(ORBIT); diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp index 4181d1906e..58c76a0b85 100644 --- a/indra/newview/llfloaterhud.cpp +++ b/indra/newview/llfloaterhud.cpp @@ -54,14 +54,6 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key) return; } - // Don't grab the focus as it will impede performing in-world actions - // while using the HUD - setIsChrome(TRUE); - - // Chrome doesn't show the window title by default, but here we - // want to show it. - setTitleVisible(true); - // Opaque background since we never get the focus setBackgroundOpaque(TRUE); } diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index df769bdd88..9b9b90e521 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -98,3 +98,12 @@ void LLFloaterInventory::onOpen(const LLSD& key) { //LLFirstUse::useInventory(); } + +void LLFloaterInventory::onClose(bool app_quitting) +{ + LLFloater::onClose(app_quitting); + if (mKey.asInteger() > 1) + { + destroy(); + } +} diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index f59a015b07..823c4903b4 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -58,6 +58,7 @@ public: // Inherited functionality /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); LLInventoryPanel* getPanel(); LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;} diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 8713513054..a65e9e911a 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -105,9 +105,6 @@ BOOL LLFloaterMap::postBuild() // Get the drag handle all the way in back sendChildToBack(getDragHandle()); - //setIsChrome(TRUE); - //getDragHandle()->setTitleVisible(TRUE); - // keep onscreen gFloaterView->adjustToFitScreen(this, FALSE); diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index 56c0806546..72c077d215 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -55,9 +55,6 @@ BOOL LLFloaterSoundDevices::postBuild() { LLTransientDockableFloater::postBuild(); - setIsChrome(TRUE); - if (mDragHandle) - mDragHandle->setTitleVisible(TRUE); updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel"); diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index b4c9894271..66f644748e 100644 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -39,7 +39,6 @@ LLFloaterToybox::LLFloaterToybox(const LLSD& key) : LLFloater(key) - , mBtnRestoreDefaults(NULL) , mToolBar(NULL) { mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this)); @@ -59,20 +58,19 @@ bool compare_localized_command_labels(LLCommand * cmd1, LLCommand * cmd2) BOOL LLFloaterToybox::postBuild() { - mBtnRestoreDefaults = getChild<LLButton>("btn_restore_defaults"); mToolBar = getChild<LLToolBar>("toybox_toolbar"); + mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); - LLCommandManager& cmdMgr = LLCommandManager::instance(); - // // Sort commands by localized labels so they will appear alphabetized in all languages // std::list<LLCommand *> alphabetized_commands; + LLCommandManager& cmdMgr = LLCommandManager::instance(); for (U32 i = 0; i < cmdMgr.commandCount(); i++) { LLCommand * command = cmdMgr.getCommand(i); diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h index f0a6cf1a8b..62bf68680d 100644 --- a/indra/newview/llfloatertoybox.h +++ b/indra/newview/llfloatertoybox.h @@ -53,7 +53,6 @@ protected: void onBtnRestoreDefaults(); public: - LLButton * mBtnRestoreDefaults; LLToolBar * mToolBar; }; diff --git a/indra/newview/llhudeffectblob.cpp b/indra/newview/llhudeffectblob.cpp index d8687eed8d..c909551b51 100644 --- a/indra/newview/llhudeffectblob.cpp +++ b/indra/newview/llhudeffectblob.cpp @@ -44,12 +44,20 @@ LLHUDEffectBlob::~LLHUDEffectBlob() { } +void LLHUDEffectBlob::markDead() +{ + mImage = NULL; + + LLHUDEffect::markDead(); +} + void LLHUDEffectBlob::render() { F32 time = mTimer.getElapsedTimeF32(); if (mDuration < time) { markDead(); + return; } LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal); diff --git a/indra/newview/llhudeffectblob.h b/indra/newview/llhudeffectblob.h index f4c1691108..ce3e8500fc 100644 --- a/indra/newview/llhudeffectblob.h +++ b/indra/newview/llhudeffectblob.h @@ -35,6 +35,8 @@ class LLHUDEffectBlob : public LLHUDEffect public: friend class LLHUDObject; + void markDead(); + void setPixelSize(S32 pixels) { mPixelSize = pixels; } protected: diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 67d745248f..3418462192 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -214,9 +214,10 @@ void LLNearbyChat::updateChatHistoryStyle() //static void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue) { - //LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); - //if(nearby_chat) - // nearby_chat->updateChatHistoryStyle(); + LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar"); + LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat"); + if(nearby_chat) + nearby_chat->updateChatHistoryStyle(); } bool isWordsName(const std::string& name) diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 3e4228cfb6..a811332261 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -53,6 +53,8 @@ S32 LLNearbyChatBar::sLastSpecialChatChannel = 0; const S32 EXPANDED_HEIGHT = 300; +const S32 COLLAPSED_HEIGHT = 60; +const S32 EXPANDED_MIN_HEIGHT = 150; // legacy callback glue void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel); @@ -102,7 +104,7 @@ BOOL LLNearbyChatBar::postBuild() // Register for font change notifications LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1)); - mExpandedHeight = getMinHeight() + EXPANDED_HEIGHT; + mExpandedHeight = COLLAPSED_HEIGHT + EXPANDED_HEIGHT; enableResizeCtrls(true, true, false); @@ -112,14 +114,19 @@ BOOL LLNearbyChatBar::postBuild() bool LLNearbyChatBar::applyRectControl() { bool rect_controlled = LLFloater::applyRectControl(); - - if (getRect().getHeight() > getMinHeight()) + + LLView* nearby_chat = getChildView("nearby_chat"); + if (!nearby_chat->getVisible()) + { + reshape(getRect().getWidth(), getMinHeight()); + enableResizeCtrls(true, true, false); + } + else { - getChildView("nearby_chat")->setVisible(true); - mExpandedHeight = getRect().getHeight(); enableResizeCtrls(true); + setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT); } - + return rect_controlled; } @@ -373,15 +380,19 @@ void LLNearbyChatBar::onToggleNearbyChatPanel() if (nearby_chat->getVisible()) { mExpandedHeight = getRect().getHeight(); + setResizeLimits(getMinWidth(), COLLAPSED_HEIGHT); nearby_chat->setVisible(FALSE); - reshape(getRect().getWidth(), getMinHeight()); + reshape(getRect().getWidth(), COLLAPSED_HEIGHT); enableResizeCtrls(true, true, false); + storeRectControl(); } else { nearby_chat->setVisible(TRUE); + setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT); reshape(getRect().getWidth(), mExpandedHeight); enableResizeCtrls(true); + storeRectControl(); } } diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 79171dbcb9..d3543daff0 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -389,6 +389,7 @@ LLTeleportHistoryPanel::~LLTeleportHistoryPanel() { LLTeleportHistoryFlatItemStorage::instance().purge(); delete mGearMenuHandle.get(); + mTeleportHistoryChangedConnection.disconnect(); } BOOL LLTeleportHistoryPanel::postBuild() @@ -679,29 +680,32 @@ void LLTeleportHistoryPanel::refresh() // tab_boundary_date would be earliest possible date for this tab S32 tab_idx = 0; getNextTab(date, tab_idx, tab_boundary_date); - - LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx); - tab->setVisible(true); - - // Expand all accordion tabs when filtering - if(!sFilterSubString.empty()) + tab_idx = mItemContainers.size() - 1 - tab_idx; + if (tab_idx >= 0) { - //store accordion tab state when filter is not empty - tab->notifyChildren(LLSD().with("action","store_state")); - - tab->setDisplayChildren(true); - } - // Restore each tab's expand state when not filtering - else - { - bool collapsed = isAccordionCollapsedByUser(tab); - tab->setDisplayChildren(!collapsed); + LLAccordionCtrlTab* tab = mItemContainers.get(tab_idx); + tab->setVisible(true); + + // Expand all accordion tabs when filtering + if(!sFilterSubString.empty()) + { + //store accordion tab state when filter is not empty + tab->notifyChildren(LLSD().with("action","store_state")); - //restore accordion state after all those accodrion tabmanipulations - tab->notifyChildren(LLSD().with("action","restore_state")); - } + tab->setDisplayChildren(true); + } + // Restore each tab's expand state when not filtering + else + { + bool collapsed = isAccordionCollapsedByUser(tab); + tab->setDisplayChildren(!collapsed); + + //restore accordion state after all those accodrion tabmanipulations + tab->notifyChildren(LLSD().with("action","restore_state")); + } - curr_flat_view = getFlatListViewFromTab(tab); + curr_flat_view = getFlatListViewFromTab(tab); + } } if (curr_flat_view) @@ -760,7 +764,12 @@ void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index) void LLTeleportHistoryPanel::replaceItem(S32 removed_index) { // Flat list for 'Today' (mItemContainers keeps accordion tabs in reverse order) - LLFlatListView* fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]); + LLFlatListView* fv = NULL; + + if (mItemContainers.size() > 0) + { + fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]); + } // Empty flat list for 'Today' means that other flat lists are empty as well, // so all items from teleport history should be added. @@ -828,19 +837,27 @@ void LLTeleportHistoryPanel::showTeleportHistory() // Starting to add items from last one, in reverse order, // since TeleportHistory keeps most recent item at the end + if (!mTeleportHistory) + { + mTeleportHistory = LLTeleportHistoryStorage::getInstance(); + } + mCurrentItem = mTeleportHistory->getItems().size() - 1; for (S32 n = mItemContainers.size() - 1; n >= 0; --n) { LLAccordionCtrlTab* tab = mItemContainers.get(n); - tab->setVisible(false); - - LLFlatListView* fv = getFlatListViewFromTab(tab); - if (fv) + if (tab) { - // Detached panels are managed by LLTeleportHistoryFlatItemStorage - std::vector<LLPanel*> detached_items; - fv->detachItems(detached_items); + tab->setVisible(false); + + LLFlatListView* fv = getFlatListViewFromTab(tab); + if (fv) + { + // Detached panels are managed by LLTeleportHistoryFlatItemStorage + std::vector<LLPanel*> detached_items; + fv->detachItems(detached_items); + } } } } diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index 0d8b45db1f..50a088b799 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -56,7 +56,8 @@ const std::string& LLTeleportHistoryItem::getTitle() const LLTeleportHistory::LLTeleportHistory(): mCurrentItem(-1), mRequestedItem(-1), - mGotInitialUpdate(false) + mGotInitialUpdate(false), + mTeleportHistoryStorage(NULL) { mTeleportFinishedConn = LLViewerParcelMgr::getInstance()-> setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this, _1)); @@ -115,6 +116,10 @@ void LLTeleportHistory::handleLoginComplete() void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) { + if (!mTeleportHistoryStorage) + { + mTeleportHistoryStorage = LLTeleportHistoryStorage::getInstance(); + } if (mRequestedItem != -1) // teleport within the history in progress? { mCurrentItem = mRequestedItem; @@ -152,7 +157,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check { llwarns << "Invalid current item. (this should not happen)" << llendl; - llassert(!"Invalid current teleport histiry item"); + llassert(!"Invalid current teleport history item"); return; } LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos); diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h index e45dc28f9b..e9c29c39bf 100644 --- a/indra/newview/llteleporthistory.h +++ b/indra/newview/llteleporthistory.h @@ -33,6 +33,7 @@ #include <string> #include <boost/function.hpp> #include <boost/signals2.hpp> +#include "llteleporthistorystorage.h" /** @@ -210,6 +211,8 @@ private: */ bool mGotInitialUpdate; + LLTeleportHistoryStorage* mTeleportHistoryStorage; + /** * Signal emitted when the history gets changed. * diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp index 0ba455e7d5..af5a047da4 100644 --- a/indra/newview/llteleporthistorystorage.cpp +++ b/indra/newview/llteleporthistorystorage.cpp @@ -66,6 +66,7 @@ struct LLSortItemsByDate LLTeleportHistoryStorage::LLTeleportHistoryStorage() : mFilename("teleport_history.txt") { + mItems.clear(); LLTeleportHistory *th = LLTeleportHistory::getInstance(); if (th) th->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryStorage::onTeleportHistoryChange, this)); diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h index 6cae0a3454..cf4c85a991 100644 --- a/indra/newview/llteleporthistorystorage.h +++ b/indra/newview/llteleporthistorystorage.h @@ -93,9 +93,6 @@ public: void removeItem(S32 idx); void save(); - void load(); - - void dump() const; /** * Set a callback to be called upon history changes. @@ -113,6 +110,9 @@ public: private: + void load(); + void dump() const; + void onTeleportHistoryChange(); bool compareByTitleAndGlobalPos(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b); diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 6873cf058a..de305bf3d9 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -91,8 +91,6 @@ mCloseNotificationOnDestroy(true) sFont = LLFontGL::getFontSansSerif(); sFontSmall = LLFontGL::getFontSansSerifSmall(); } - // clicking on a button does not steal current focus - setIsChrome(TRUE); // initialize setFocusRoot(!mIsTip); // get a form for the notification diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 21e682f072..619d17efad 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -29,6 +29,7 @@ #include "lltoolbarview.h" +#include "llappviewer.h" #include "lldir.h" #include "llxmlnode.h" #include "lltoolbar.h" @@ -36,12 +37,18 @@ #include "lltooldraganddrop.h" #include "llclipboard.h" +#include "llagent.h" // HACK for destinations guide on startup +#include "llfloaterreg.h" // HACK for destinations guide on startup +#include "llviewercontrol.h" // HACK for destinations guide on startup + #include <boost/foreach.hpp> LLToolBarView* gToolBarView = NULL; static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view"); +void handleLoginToolbarSetup(); + bool isToolDragged() { return (LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_VIEWER); @@ -63,7 +70,9 @@ LLToolBarView::LLToolBarView(const LLToolBarView::Params& p) : LLUICtrl(p), mToolbarLeft(NULL), mToolbarRight(NULL), - mToolbarBottom(NULL) + mToolbarBottom(NULL), + mDragStarted(false), + mDragToolbarButton(NULL) { } @@ -95,6 +104,8 @@ BOOL LLToolBarView::postBuild() mToolbarBottom->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); mToolbarBottom->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); mToolbarBottom->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); + + LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&handleLoginToolbarSetup)); return TRUE; } @@ -126,7 +137,7 @@ bool LLToolBarView::addCommand(const LLCommandId& command, LLToolBar* toolbar) } else { - llwarns << "Toolbars creation : the command " << command.name() << " cannot be found in the command manager" << llendl; + llwarns << "Toolbars creation : the command with id " << command.uuid().asString() << " cannot be found in the command manager" << llendl; return false; } return true; @@ -191,9 +202,12 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; mToolbarLeft->setButtonType(button_type); } - BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.left_toolbar.commands) + BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.left_toolbar.commands) { - addCommand(LLCommandId(command),mToolbarLeft); + if (addCommand(LLCommandId(command_name_param), mToolbarLeft) == false) + { + llwarns << "Error adding command '" << command_name_param.name() << "' to left toolbar." << llendl; + } } } if (toolbar_set.right_toolbar.isProvided() && mToolbarRight) @@ -203,9 +217,12 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; mToolbarRight->setButtonType(button_type); } - BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.right_toolbar.commands) + BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.right_toolbar.commands) { - addCommand(LLCommandId(command),mToolbarRight); + if (addCommand(LLCommandId(command_name_param), mToolbarRight) == false) + { + llwarns << "Error adding command '" << command_name_param.name() << "' to right toolbar." << llendl; + } } } if (toolbar_set.bottom_toolbar.isProvided() && mToolbarBottom) @@ -215,9 +232,12 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; mToolbarBottom->setButtonType(button_type); } - BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.bottom_toolbar.commands) + BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.bottom_toolbar.commands) { - addCommand(LLCommandId(command),mToolbarBottom); + if (addCommand(LLCommandId(command_name_param), mToolbarBottom) == false) + { + llwarns << "Error adding command '" << command_name_param.name() << "' to bottom toolbar." << llendl; + } } } return true; @@ -278,13 +298,19 @@ void LLToolBarView::saveToolbars() const // Enumerate the commands in command_list and add them as Params to the toolbar void LLToolBarView::addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const { + LLCommandManager& mgr = LLCommandManager::instance(); + for (command_id_list_t::const_iterator it = command_list.begin(); it != command_list.end(); ++it) { - LLCommandId::Params command; - command.name = it->name(); - toolbar.commands.add(command); + LLCommand* command = mgr.getCommand(*it); + if (command) + { + LLCommandId::Params command_name_param; + command_name_param.name = command->name(); + toolbar.commands.add(command_name_param); + } } } @@ -328,13 +354,11 @@ void LLToolBarView::draw() // ---------------------------------------- -void LLToolBarView::startDragTool( S32 x, S32 y, const LLUUID& uuid) +void LLToolBarView::startDragTool(S32 x, S32 y, LLToolBarButton* button) { + resetDragTool(button); + // Flag the tool dragging but don't start it yet - gToolBarView->mDragStarted = false; - gToolBarView->mDragCommand = LLCommandId::null; - gToolBarView->mDragRank = LLToolBar::RANK_NONE; - gToolBarView->mDragToolbar = NULL; LLToolDragAndDrop::getInstance()->setDragStart( x, y ); } @@ -355,30 +379,12 @@ BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_VIEWER; LLUUID srcID; LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src, srcID); - - // Second, check if the command is present in one of the 3 toolbars - // If it is, store the command, the toolbar and the rank in the toolbar and - // set a callback on end drag so that we reinsert the command if no drop happened - /* - gToolBarView->mDragCommand = LLCommandId(uuid); - if ((gToolBarView->mDragRank = gToolBarView->mToolbarLeft->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE) - { - gToolBarView->mDragToolbar = gToolBarView->mToolbarLeft; - } - else if ((gToolBarView->mDragRank = gToolBarView->mToolbarRight->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE) - { - gToolBarView->mDragToolbar = gToolBarView->mToolbarRight; - } - else if ((gToolBarView->mDragRank = gToolBarView->mToolbarBottom->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE) - { - gToolBarView->mDragToolbar = gToolBarView->mToolbarBottom; - } - if (gToolBarView->mDragRank != LLToolBar::RANK_NONE) - { - llinfos << "Merov debug: rank of dragged tool = " << gToolBarView->mDragRank << llendl; - LLToolDragAndDrop::getInstance()->setEndDragCallback(boost::bind(&LLToolBarView::onEndDrag, gToolBarView)); - } - */ + + // Second, stop the command if it is in progress and requires stopping! + LLCommandId command_id = LLCommandId(uuid); + gToolBarView->mToolbarLeft->stopCommandInProgress(command_id); + gToolBarView->mToolbarRight->stopCommandInProgress(command_id); + gToolBarView->mToolbarBottom->stopCommandInProgress(command_id); gToolBarView->mDragStarted = true; return TRUE; @@ -407,42 +413,32 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t LLCommand* command = mgr.getCommand(command_id); if (command) { - // Convert the (x,y) position in rank in toolbar - int new_rank = LLToolBar::RANK_NONE; - if (!toolbar->isReadOnly()) - { - new_rank = toolbar->getRankFromPosition(x,y); - } // Suppress the command from the toolbars (including the one it's dropped in, // this will handle move position). - int old_rank = LLToolBar::RANK_NONE; + bool command_present = gToolBarView->hasCommand(command_id); LLToolBar* old_toolbar = NULL; - int rank; - if ((rank = gToolBarView->mToolbarLeft->removeCommand(command_id)) != LLToolBar::RANK_NONE) - { - old_rank = rank; - old_toolbar = gToolBarView->mToolbarLeft; - } - if ((rank = gToolBarView->mToolbarRight->removeCommand(command_id)) != LLToolBar::RANK_NONE) - { - old_rank = rank; - old_toolbar = gToolBarView->mToolbarRight; - } - if ((rank = gToolBarView->mToolbarBottom->removeCommand(command_id)) != LLToolBar::RANK_NONE) + + if (command_present) { - old_rank = rank; - old_toolbar = gToolBarView->mToolbarBottom; + llassert(gToolBarView->mDragToolbarButton); + old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); + if (old_toolbar->isReadOnly() && toolbar->isReadOnly()) + { + // do nothing + } + else + { + gToolBarView->mToolbarBottom->removeCommand(command_id); + gToolBarView->mToolbarLeft->removeCommand(command_id); + gToolBarView->mToolbarRight->removeCommand(command_id); + } } - // Now insert it in the toolbar at the detected rank + + // Convert the (x,y) position in rank in toolbar if (!toolbar->isReadOnly()) { - if ((old_toolbar == toolbar) && (old_rank != LLToolBar::RANK_NONE) && (old_rank < new_rank)) - { - // If we just removed the command from the same toolbar, we need to consider that it might - // change the target rank. - new_rank -= 1; - } - toolbar->addCommand(command->id(),new_rank); + int new_rank = toolbar->getRankFromPosition(x,y); + toolbar->addCommand(command_id, new_rank); } } else @@ -450,27 +446,16 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t llwarns << "Command couldn't be found in command manager" << llendl; } } - stopDragTool(); + + resetDragTool(NULL); return handled; } -void LLToolBarView::stopDragTool() +void LLToolBarView::resetDragTool(LLToolBarButton* button) { // Clear the saved command, toolbar and rank gToolBarView->mDragStarted = false; - gToolBarView->mDragCommand = LLCommandId::null; - gToolBarView->mDragRank = LLToolBar::RANK_NONE; - gToolBarView->mDragToolbar = NULL; -} - -void LLToolBarView::onEndDrag() -{ - // If there's a saved command, reinsert it in the saved toolbar - if (gToolBarView->mDragRank != LLToolBar::RANK_NONE) - { - gToolBarView->mDragToolbar->addCommand(gToolBarView->mDragCommand,gToolBarView->mDragRank); - } - stopDragTool(); + gToolBarView->mDragToolbarButton = button; } void LLToolBarView::setToolBarsVisible(bool visible) @@ -490,3 +475,18 @@ bool LLToolBarView::isModified() const return modified; } + + +// +// HACK to bring up destinations guide at startup +// + +void handleLoginToolbarSetup() +{ + // Open the destinations guide by default on first login, per Rhett + if (gSavedSettings.getBOOL("FirstLoginThisInstall") || gAgent.isFirstLogin()) + { + LLFloaterReg::showInstance("destinations"); + } +} + diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index 8b3af43875..60ad6316f8 100644 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -76,11 +76,10 @@ public: static bool loadDefaultToolbars(); - static void startDragTool( S32 x, S32 y, const LLUUID& uuid); - static BOOL handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); - static BOOL handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar); - static void stopDragTool(); - void onEndDrag(); + static void startDragTool(S32 x, S32 y, LLToolBarButton* button); + static BOOL handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); + static BOOL handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar); + static void resetDragTool(LLToolBarButton* button); bool isModified() const; @@ -100,10 +99,8 @@ private: LLToolBar* mToolbarRight; LLToolBar* mToolbarBottom; - LLCommandId mDragCommand; - int mDragRank; - LLToolBar* mDragToolbar; - bool mDragStarted; + bool mDragStarted; + LLToolBarButton* mDragToolbarButton; }; extern LLToolBarView* gToolBarView; diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 51c0e2eeed..6bc7c6de11 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -247,24 +247,10 @@ bool LLToolMgr::canEdit() void LLToolMgr::toggleBuildMode() { - if (inBuildMode()) - { - if (gSavedSettings.getBOOL("EditCameraMovement")) - { - // just reset the view, will pull us out of edit mode - handle_reset_view(); - } - else - { - // manually disable edit mode, but do not affect the camera - gAgentCamera.resetView(false); - LLFloaterReg::hideInstance("build"); - gViewerWindow->showCursor(); - } - // avoid spurious avatar movements pulling out of edit mode - LLViewerJoystick::getInstance()->setNeedsReset(); - } - else + LLFloaterReg::toggleInstanceOrBringToFront("build"); + + bool build_visible = LLFloaterReg::instanceVisible("build"); + if (build_visible) { ECameraMode camMode = gAgentCamera.getCameraMode(); if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode) @@ -291,7 +277,7 @@ void LLToolMgr::toggleBuildMode() } } - + setCurrentToolset(gBasicToolset); getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() ); @@ -304,6 +290,24 @@ void LLToolMgr::toggleBuildMode() LLViewerJoystick::getInstance()->setNeedsReset(); } + else + { + if (gSavedSettings.getBOOL("EditCameraMovement")) + { + // just reset the view, will pull us out of edit mode + handle_reset_view(); + } + else + { + // manually disable edit mode, but do not affect the camera + gAgentCamera.resetView(false); + LLFloaterReg::hideInstance("build"); + gViewerWindow->showCursor(); + } + // avoid spurious avatar movements pulling out of edit mode + LLViewerJoystick::getInstance()->setNeedsReset(); + } + } bool LLToolMgr::inBuildMode() diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 983108391f..efe9bb8da7 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -53,10 +53,12 @@ #include "llinventorymodel.h" #include "llinventoryobserver.h" #include "lllandmarklist.h" +#include "llprogressview.h" #include "llsky.h" #include "llui.h" #include "llviewercamera.h" #include "llviewerinventory.h" +#include "llviewerwindow.h" #include "llworld.h" #include "llworldmapview.h" #include "llviewercontrol.h" @@ -111,6 +113,8 @@ void LLTracker::drawHUDArrow() { if (!gSavedSettings.getBOOL("RenderTrackerBeacon")) return; + if (gViewerWindow->getProgressView()->getVisible()) return; + static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white); /* tracking autopilot destination has been disabled diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8576d81196..6fcbc401af 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3174,7 +3174,7 @@ void LLViewerWindow::updateLayout() //gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible()); } - LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options"); + LLFloaterBuildOptions* build_options_floater = LLFloaterReg::findTypedInstance<LLFloaterBuildOptions>("build_options"); if (build_options_floater && build_options_floater->getVisible()) { build_options_floater->updateGridMode(); diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 3c7de6f334..2d973e7d90 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater + open_positioning="cascading" + ignore_ui_scale="false" legacy_header_height="225" can_minimize="true" can_close="true" @@ -12,6 +14,7 @@ single_instance="true" help_topic="avatar" save_rect="true" + save_visibility="true" title="AVATAR PICKER" width="635"> <web_browser diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index afe8584a2d..e7f5207271 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -14,6 +14,7 @@ save_visibility="true" single_instance="true" title="VIEW" + chrome="true" save_rect="true" width="228"> <floater.string @@ -166,14 +167,10 @@ <joystick_rotate follows="top|left" height="78" - image_selected="Cam_Rotate_In" - image_unselected="Cam_Rotate_Out" layout="topleft" left="7" - mouse_opaque="false" name="cam_rotate_stick" quadrant="left" - scale_image="false" sound_flags="3" visible="true" tool_tip="Orbit camera around focus" diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml index e63dc02a57..373114a1eb 100644 --- a/indra/newview/skins/default/xui/en/floater_destinations.xml +++ b/indra/newview/skins/default/xui/en/floater_destinations.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater open_positioning="cascading" + ignore_ui_scale="false" legacy_header_height="225" can_minimize="true" can_close="true" @@ -14,6 +15,7 @@ single_instance="true" help_topic="destinations" save_rect="true" + save_visibility="true" title="DESTINATIONS" width="840"> <web_browser diff --git a/indra/newview/skins/default/xui/en/floater_how_to.xml b/indra/newview/skins/default/xui/en/floater_how_to.xml index 0369ecbeff..8c0077a8cc 100644 --- a/indra/newview/skins/default/xui/en/floater_how_to.xml +++ b/indra/newview/skins/default/xui/en/floater_how_to.xml @@ -10,6 +10,7 @@ top="10" min_width="335" name="floater_how_to" + help_topic="how_to" single_instance="true" save_rect="true" title="HOW TO" diff --git a/indra/newview/skins/default/xui/en/floater_hud.xml b/indra/newview/skins/default/xui/en/floater_hud.xml index 99a6a95828..e2d860881a 100644 --- a/indra/newview/skins/default/xui/en/floater_hud.xml +++ b/indra/newview/skins/default/xui/en/floater_hud.xml @@ -8,6 +8,7 @@ help_topic="floater_hud" save_rect="true" save_visibility="true" + chrome="true" title="TUTORIAL" width="362"> <web_browser diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml index 58d67c8221..31972d4122 100644 --- a/indra/newview/skins/default/xui/en/floater_map.xml +++ b/indra/newview/skins/default/xui/en/floater_map.xml @@ -3,6 +3,7 @@ open_positioning="cascading" can_minimize="true" can_resize="true" + chrome="true" follows="top|right" height="200" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml index b7370580af..e96039a3e1 100644 --- a/indra/newview/skins/default/xui/en/floater_moveview.xml +++ b/indra/newview/skins/default/xui/en/floater_moveview.xml @@ -14,7 +14,8 @@ help_topic="move_floater" save_rect="true" save_visibility="true" - save_dock_state="true" + single_instance="true" + chrome="true" title="MOVE" width="133"> <string diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml index d9f3f1e13f..a40393aed8 100644 --- a/indra/newview/skins/default/xui/en/floater_my_appearance.xml +++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml @@ -10,6 +10,7 @@ help_topic="appearance" save_rect="true" single_instance="true" + reuse_instance="true" title="APPEARANCE" min_height="260" min_width="333" diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml index 44491c671f..cd0b59dc51 100644 --- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml @@ -10,6 +10,7 @@ name="floater_my_inventory" save_rect="true" save_visibility="true" + reuse_instance="true" title="INVENTORY" width="333" > <panel diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml index 9c1d121433..32dda1b694 100644 --- a/indra/newview/skins/default/xui/en/floater_people.xml +++ b/indra/newview/skins/default/xui/en/floater_people.xml @@ -12,6 +12,7 @@ name="floater_people" save_rect="true" single_instance="true" + reuse_instance="true" title="PEOPLE" width="333"> <panel_container diff --git a/indra/newview/skins/default/xui/en/floater_picks.xml b/indra/newview/skins/default/xui/en/floater_picks.xml index 2d307028e4..7882116662 100644 --- a/indra/newview/skins/default/xui/en/floater_picks.xml +++ b/indra/newview/skins/default/xui/en/floater_picks.xml @@ -10,6 +10,7 @@ name="floater_picks" save_rect="true" save_visibility="true" + reuse_instance="true" title="Picks" width="333" > <panel diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml index b7cb86b468..6484b54360 100644 --- a/indra/newview/skins/default/xui/en/floater_places.xml +++ b/indra/newview/skins/default/xui/en/floater_places.xml @@ -9,6 +9,7 @@ name="floater_places" help_topic="floater_places" save_rect="true" + reuse_instance="true" title="PLACES" min_height="230" min_width="333" diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml index 3dbe4adf28..dec0e9b6c6 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml @@ -6,6 +6,7 @@ can_minimize="true" can_resize="false" can_close="false" + chrome="true" save_dock_state="true" save_visibility="true" save_rect="true" 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 3f5768bc0b..93a04050b6 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -4,6 +4,7 @@ can_resize="true" can_minimize="true" can_close="true" + chrome="true" height="205" layout="topleft" min_height="124" @@ -18,19 +19,19 @@ width="282"> <string name="title_nearby"> - Nearby voice + VOICE SETTINGS </string> <string name="title_group"> - Group call with [GROUP] + GROUP CALL WITH [GROUP] </string> <string name="title_adhoc"> - Conference call + CONFERENCE CALL </string> <string name="title_peer_2_peer"> - Call with [NAME] + CALL WITH [NAME] </string> <string name="no_one_near"> @@ -51,6 +52,7 @@ user_resize="false" auto_resize="false" layout="topleft" + min_height="20" height="20" name="my_panel"> <avatar_icon @@ -132,6 +134,7 @@ height="132" name="callers_panel" user_resize="false" + auto_resize="true" width="280"> <avatar_list follows="all" diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml deleted file mode 100644 index 1a102c21bb..0000000000 --- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml +++ /dev/null @@ -1,163 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu - height="201" - layout="topleft" - left="100" - mouse_opaque="false" - name="hide_camera_move_controls_menu" - top="624" - visible="false" - width="128"> - <menu_item_check - label="Speak Button" - layout="topleft" - name="EnableVoiceChat"> - <menu_item_check.on_click - function="ToggleControl" - parameter="EnableVoiceChat" /> - <menu_item_check.on_check - function="CheckControl" - parameter="EnableVoiceChat" /> - </menu_item_check> - <menu_item_check - label="Gesture button" - layout="topleft" - name="ShowGestureButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowGestureButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowGestureButton" /> - </menu_item_check> - <menu_item_check - label="Move button" - layout="topleft" - name="ShowMoveButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowMoveButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowMoveButton" /> - </menu_item_check> - <menu_item_check - label="View button" - layout="topleft" - name="ShowCameraButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowCameraButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowCameraButton" /> - </menu_item_check> - <menu_item_check - label="Snapshot button" - layout="topleft" - name="ShowSnapshotButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowSnapshotButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowSnapshotButton" /> - </menu_item_check> - <menu_item_check - label="Build button" - layout="topleft" - name="ShowBuildButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowBuildButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowBuildButton" /> - </menu_item_check> - <menu_item_check - label="Search button" - layout="topleft" - name="ShowSearchButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowSearchButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowSearchButton" /> - </menu_item_check> - <menu_item_check - label="Map button" - layout="topleft" - name="ShowWorldMapButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowWorldMapButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowWorldMapButton" /> - </menu_item_check> - <menu_item_check - label="Mini-map button" - layout="topleft" - name="ShowMiniMapButton"> - <menu_item_check.on_click - function="ToggleControl" - parameter="ShowMiniMapButton" /> - <menu_item_check.on_check - function="CheckControl" - parameter="ShowMiniMapButton" /> - </menu_item_check> - <menu_item_separator - name="Separator" /> - <menu_item_call - label="Cut" - name="NearbyChatBar_Cut"> - <menu_item_call.on_click - function="NearbyChatBar.Action" - parameter="cut" /> - <menu_item_call.on_enable - function="NearbyChatBar.EnableMenuItem" - parameter="can_cut" /> - </menu_item_call> - <menu_item_call - label="Copy" - name="NearbyChatBar_Copy"> - <menu_item_call.on_click - function="NearbyChatBar.Action" - parameter="copy" /> - <menu_item_call.on_enable - function="NearbyChatBar.EnableMenuItem" - parameter="can_copy" /> - </menu_item_call> - <menu_item_call - label="Paste" - name="NearbyChatBar_Paste"> - <menu_item_call.on_click - function="NearbyChatBar.Action" - parameter="paste" /> - <menu_item_call.on_enable - function="NearbyChatBar.EnableMenuItem" - parameter="can_paste" /> - </menu_item_call> - <menu_item_call - label="Delete" - name="NearbyChatBar_Delete"> - <menu_item_call.on_click - function="NearbyChatBar.Action" - parameter="delete" /> - <menu_item_call.on_enable - function="NearbyChatBar.EnableMenuItem" - parameter="can_delete" /> - </menu_item_call> - <menu_item_call - label="Select All" - name="NearbyChatBar_Select_All"> - <menu_item_call.on_click - function="NearbyChatBar.Action" - parameter="select_all" /> - <menu_item_call.on_enable - function="NearbyChatBar.EnableMenuItem" - parameter="can_select_all" /> - </menu_item_call> - -</menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 6720d8131e..3ed8c30ca8 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5432,21 +5432,23 @@ Your calling card was declined. </notification> <notification - icon="notifytip.tga" - name="TeleportToLandmark" - type="notifytip"> -You can teleport to locations like '[NAME]' by opening the Places panel on the right side of your screen, and then select the Landmarks tab. -Click on any landmark to select it, then click 'Teleport' at the bottom of the panel. -(You can also double-click on the landmark, or right-click it and choose 'Teleport'.) + icon="notifytip.tga" + name="TeleportToLandmark" + type="notifytip"> + To teleport to locations like '[NAME]', click on the "Places" button, + then select the Landmarks tab in the window that opens. Click on any + landmark to select it, then click 'Teleport' at the bottom of the window. + (You can also double-click on the landmark, or right-click it and + choose 'Teleport'.) </notification> <notification icon="notifytip.tga" name="TeleportToPerson" type="notifytip"> -You can contact Residents like '[NAME]' by opening the People panel on the right side of your screen. -Select the Resident from the list, then click 'IM' at the bottom of the panel. -(You can also double-click on their name in the list, or right-click and choose 'IM'). + To contact Residents like '[NAME]', click on the "People" button , select a Resident from the window that opens, then click 'IM' at the + bottom of the window. + (You can also double-click on their name in the list, or right-click and choose 'IM'). </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml index 34c6e02684..6af1105400 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_item.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml @@ -2,7 +2,7 @@ <!-- All our XML is utf-8 encoded. --> <panel name="instant_message" - width="315" + width="300" height="180" follows="all"> <avatar_icon @@ -22,6 +22,7 @@ text_color="white" word_wrap="true" mouse_opaque="true" + valign="bottom" name="msg_text"> </text_chat> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml index 355a76e05f..41d1036a4d 100644 --- a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml @@ -42,7 +42,7 @@ top="7" width="189"> <button - auto_resize="true" + auto_resize="false" follows="right" height="29" image_hover_selected="SegmentedBtn_Left_Over" @@ -57,9 +57,9 @@ tab_stop="false" top="-28" visible="false" - width="7" /> + width="12" /> <button - auto_resize="true" + auto_resize="false" follows="right" height="29" image_hover_selected="SegmentedBtn_Right_Over" @@ -74,7 +74,7 @@ tab_stop="false" top="-28" visible="false" - width="7" /> + width="12" /> </chiclet_panel> </layout_panel> <layout_panel auto_resize="false" @@ -110,7 +110,7 @@ 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" + auto_resize="false" follows="right" halign="center" height="23" @@ -151,7 +151,7 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well top="5" width="35"> <button - auto_resize="true" + auto_resize="false" bottom_pad="3" follows="right" halign="center" diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml index 59ead84127..f6f62ac54e 100644 --- a/indra/newview/skins/default/xui/en/panel_notification.xml +++ b/indra/newview/skins/default/xui/en/panel_notification.xml @@ -9,6 +9,8 @@ layout="topleft" left="0" name="notification_panel" + chrome="true" + show_title="false" top="0" height="140" translate="false" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index db7c07f2f8..c4031de0f8 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2028,7 +2028,7 @@ Returns a string with the requested data about the region <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string> <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string> <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string> - <string name="InventoryInboxNoItems">Items purchased through the marketplace will be delivered here.</string> + <string name="InventoryInboxNoItems">When you purchase or otherwise receive an item, it will appear here so you can drag it to a folder in your inventory, or delete it if you do not wish to keep it.</string> <string name="MarketplaceURL">http://marketplace.[DOMAIN_NAME]</string> <string name="MarketplaceURL_CreateStore">http://marketplace.[DOMAIN_NAME]/create_store</string> <string name="MarketplaceURL_LearnMore">http://marketplace.[DOMAIN_NAME]/learn_more</string> @@ -3678,7 +3678,7 @@ Try enclosing path to the editor with double quotes. <string name="Command_Snapshot_Label">Snapshot</string> <string name="Command_Speak_Label">Speak</string> <string name="Command_View_Label">View</string> - <string name="Command_Voice_Label">Nearby voice</string> + <string name="Command_Voice_Label">Voice settings</string> <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string> <string name="Command_Appearance_Tooltip">Change your avatar</string> @@ -3703,7 +3703,7 @@ Try enclosing path to the editor with double quotes. <string name="Command_Snapshot_Tooltip">Take a picture</string> <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string> <string name="Command_View_Tooltip">Changing camera angle</string> - <string name="Command_Voice_Tooltip">People nearby with voice capability</string> + <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string> <!-- Mesh UI terms --> <string name="Retain%">Retain%</string> diff --git a/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml new file mode 100644 index 0000000000..a190da3909 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<joystick_rotate + image_selected="Cam_Rotate_In" + image_unselected="Cam_Rotate_Out" + scale_image="false" + mouse_opaque="false" + held_down_delay.seconds="0"/> |