diff options
Diffstat (limited to 'indra/newview/llmoveview.cpp')
-rw-r--r-- | indra/newview/llmoveview.cpp | 165 |
1 files changed, 93 insertions, 72 deletions
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 14da35594f..97e2b5b86e 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -156,6 +156,34 @@ void LLFloaterMove::setEnabled(BOOL enabled) showModeButtons(enabled); } +// *NOTE: we assume that setVisible() is called on floater close. +// virtual +void LLFloaterMove::setVisible(BOOL visible) +{ + // Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?). + if (getVisible() == visible) + { + LLTransientDockableFloater::setVisible(visible); + return; + } + + if (visible) + { + // Attach the Stand/Stop Flying panel. + LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance(); + ssf_panel->reparent(this); + const LLRect& mode_actions_rect = mModeActionsPanel->getRect(); + ssf_panel->setOrigin(mode_actions_rect.mLeft, mode_actions_rect.mBottom); + } + else + { + // Detach the Stand/Stop Flying panel. + LLPanelStandStopFlying::getInstance()->reparent(NULL); + } + + LLTransientDockableFloater::setVisible(visible); +} + // static F32 LLFloaterMove::getYawRate( F32 time ) { @@ -222,6 +250,12 @@ void LLFloaterMove::setSittingMode(BOOL bSitting) else { LLPanelStandStopFlying::clearStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STAND); + + // show "Stop Flying" button if needed. EXT-871 + if (gAgent.getFlying()) + { + LLPanelStandStopFlying::setStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STOP_FLYING); + } } enableInstance(!bSitting); } @@ -424,43 +458,6 @@ void LLFloaterMove::showModeButtons(BOOL bShow) if (NULL == mModeActionsPanel || mModeActionsPanel->getVisible() == bShow) return; mModeActionsPanel->setVisible(bShow); - - if (isDocked()) - { - return; - } - - updateHeight(bShow); -} - -void LLFloaterMove::updateHeight(bool show_mode_buttons) -{ - static bool size_changed = false; - static S32 origin_height = getRect().getHeight(); - LLRect rect = getRect(); - - static S32 mode_panel_height = mModeActionsPanel->getRect().getHeight(); - - S32 newHeight = getRect().getHeight(); - - if (!show_mode_buttons && origin_height == newHeight) - { - newHeight -= mode_panel_height; - size_changed = true; - } - else if (show_mode_buttons && origin_height > newHeight) - { - newHeight += mode_panel_height; - size_changed = true; - } - - if (!size_changed) - return; - - rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), newHeight); - reshape(rect.getWidth(), rect.getHeight()); - setRect(rect); - size_changed = false; } //static @@ -504,14 +501,6 @@ void LLFloaterMove::onOpen(const LLSD& key) //virtual void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/) { - LLDockableFloater::setDocked(docked, pop_on_undock); - bool show_mode_buttons = isDocked() || !gAgent.getFlying(); - - if (!isMinimized()) - { - updateHeight(show_mode_buttons); - } - LLTransientDockableFloater::setDocked(docked, pop_on_undock); } @@ -535,7 +524,8 @@ void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode) /************************************************************************/ LLPanelStandStopFlying::LLPanelStandStopFlying() : mStandButton(NULL), - mStopFlyingButton(NULL) + mStopFlyingButton(NULL), + mAttached(false) { // make sure we have the only instance of this class static bool b = true; @@ -587,7 +577,7 @@ BOOL LLPanelStandStopFlying::postBuild() mStandButton->setVisible(FALSE); mStopFlyingButton = getChild<LLButton>("stop_fly_btn"); - mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE)); + //mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE)); mStopFlyingButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStopFlyingButtonClick, this)); mStopFlyingButton->setVisible(FALSE); @@ -598,16 +588,22 @@ BOOL LLPanelStandStopFlying::postBuild() void LLPanelStandStopFlying::setVisible(BOOL visible) { //we dont need to show the panel if these buttons are not activated - if (visible && !mStandButton->getVisible() && !mStopFlyingButton->getVisible()) visible = false; - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false; if (visible) { updatePosition(); - getParent()->sendChildToFront(this); } + // do not change parent visibility in case panel is attached into Move Floater: EXT-3632, EXT-4646 + if (!mAttached) + { + //change visibility of parent layout_panel to animate in/out. EXT-2504 + if (getParent()) getParent()->setVisible(visible); + } + + // also change own visibility to avoid displaying the panel in mouselook (broken when EXT-2504 was implemented). + // See EXT-4718. LLPanel::setVisible(visible); } @@ -624,7 +620,49 @@ BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask) LLToolTipMgr::instance().show(mStopFlyingButton->getToolTip()); } - return TRUE; + return LLPanel::handleToolTip(x, y, mask); +} + +void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view) +{ + LLPanel* parent = dynamic_cast<LLPanel*>(getParent()); + if (!parent) + { + llwarns << "Stand/stop flying panel parent is unset, already attached?: " << mAttached << ", new parent: " << (move_view == NULL ? "NULL" : "Move Floater") << llendl; + return; + } + + if (move_view != NULL) + { + llassert(move_view != parent); // sanity check + + // Save our original container. + if (!mOriginalParent.get()) + mOriginalParent = parent->getHandle(); + + // Attach to movement controls. + parent->removeChild(this); + move_view->addChild(this); + // Origin must be set by movement controls. + mAttached = true; + } + else + { + if (!mOriginalParent.get()) + { + llwarns << "Original parent of the stand / stop flying panel not found" << llendl; + return; + } + + // Detach from movement controls. + parent->removeChild(this); + mOriginalParent.get()->addChild(this); + // update parent with self visibility (it is changed in setVisible()). EXT-4743 + mOriginalParent.get()->setVisible(getVisible()); + + mAttached = false; + updatePosition(); // don't defer until next draw() to avoid flicker + } } ////////////////////////////////////////////////////////////////////////// @@ -638,7 +676,7 @@ LLPanelStandStopFlying* LLPanelStandStopFlying::getStandStopFlyingPanel() LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_stand_stop_flying.xml"); panel->setVisible(FALSE); - LLUI::getRootView()->addChild(panel); + //LLUI::getRootView()->addChild(panel); llinfos << "Build LLPanelStandStopFlying panel" << llendl; @@ -652,10 +690,6 @@ void LLPanelStandStopFlying::onStandButtonClick() gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); setFocus(FALSE); // EXT-482 - - BOOL fly = gAgent.getFlying(); - mStopFlyingButton->setVisible(fly); - setVisible(fly); } void LLPanelStandStopFlying::onStopFlyingButtonClick() @@ -671,27 +705,14 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick() */ void LLPanelStandStopFlying::updatePosition() { - LLBottomTray* tray = LLBottomTray::getInstance(); - if (!tray) return; + if (!tray || mAttached) return; LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - //align centers of a button and a floater + // Align centers of the button and the panel. S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - - S32 y = tray->getRect().getHeight(); - - LLFloater *move_floater = LLFloaterReg::findInstance("moveview"); - if (move_floater) - { - if (move_floater->isDocked()) - { - y = move_floater->getRect().mBottom + getRect().getHeight(); - } - } - - setOrigin(x, y); + setOrigin(x, 0); } |