diff options
Diffstat (limited to 'indra/newview/llbottomtray.cpp')
-rw-r--r-- | indra/newview/llbottomtray.cpp | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp new file mode 100644 index 0000000000..861f23abb7 --- /dev/null +++ b/indra/newview/llbottomtray.cpp @@ -0,0 +1,268 @@ +/** + * @file llbottomtray.cpp + * @brief LLBottomTray class implementation + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" // must be first include +#include "llbottomtray.h" + +#include "llagent.h" +#include "llchiclet.h" +#include "llfloaterreg.h" +#include "llflyoutbutton.h" +#include "lllayoutstack.h" +#include "llnearbychatbar.h" +#include "llsplitbutton.h" +#include "llsyswellwindow.h" +#include "llfloatercamera.h" +#include "llimpanel.h" + +LLBottomTray::LLBottomTray(const LLSD&) +: mChicletPanel(NULL), + mSysWell(NULL), + mTalkBtn(NULL), + mNearbyChatBar(NULL), + mToolbarStack(NULL) + +{ + mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); + + LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml"); + + mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); + mSysWell = getChild<LLNotificationChiclet>("sys_well"); + + mSysWell->setNotificationChicletWindow(LLFloaterReg::getInstance("syswell_window")); + + mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1)); + + LLSplitButton* presets = getChild<LLSplitButton>("presets"); + presets->setSelectionCallback(LLFloaterCamera::onClickCameraPresets); + + LLIMMgr::getInstance()->addSessionObserver(this); + + //this is to fix a crash that occurs because LLBottomTray is a singleton + //and thus is deleted at the end of the viewers lifetime, but to be cleanly + //destroyed LLBottomTray requires some subsystems that are long gone + LLUI::getRootView()->addChild(this); + + // Necessary for focus movement among child controls + setFocusRoot(TRUE); +} + +BOOL LLBottomTray::postBuild() +{ + mCommitCallbackRegistrar.add("ShowCamMoveCtrls.Action", boost::bind(&LLBottomTray::onShowCamMoveCtrlsContextMenuItemClicked, this, _2)); + mEnableCallbackRegistrar.add("ShowCamMoveCtrls.EnableMenuItem", boost::bind(&LLBottomTray::onShowCamMoveCtrlsContextMenuItemEnabled, this, _2)); + + mShowCamMoveCtrlsContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_hide_camera_move_controls.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + gMenuHolder->addChild(mShowCamMoveCtrlsContextMenu); + + mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); + mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); + mMovementPanel = getChild<LLPanel>("movement_panel"); + mCamPanel = getChild<LLPanel>("cam_panel"); + + return TRUE; +} + +LLBottomTray::~LLBottomTray() +{ + if (!LLSingleton<LLIMMgr>::destroyed()) + { + LLIMMgr::getInstance()->removeSessionObserver(this); + } +} + +void LLBottomTray::onChicletClick(LLUICtrl* ctrl) +{ + LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(ctrl); + if (chiclet) + { + // Until you can type into an IM Window and have a conversation, + // still show the old communicate window + //LLFloaterReg::showInstance("communicate", chiclet->getSessionId()); + + // Show after comm window so it is frontmost (and hence will not + // auto-hide) + +// this logic has been moved to LLIMChiclet::handleMouseDown +// LLIMFloater::show(chiclet->getSessionId()); +// chiclet->setCounter(0); + } +} + +void* LLBottomTray::createNearbyChatBar(void* userdata) +{ + return new LLNearbyChatBar(); +} + +LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id) +{ + if(session_id.isNull()) + { + return NULL; + } + + LLFloaterIMPanel* im = LLIMMgr::getInstance()->findFloaterBySession(session_id); + if (!im) + { + return NULL; //should never happen + } + + switch(im->getDialogType()) + { + case IM_NOTHING_SPECIAL: + return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id); + break; + case IM_SESSION_GROUP_START: + case IM_SESSION_INVITE: + return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id); + break; + default: + return NULL; + break; + } +} + +//virtual +void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) +{ + if(getChicletPanel()) + { + if(getChicletPanel()->findChiclet<LLChiclet>(session_id)) + { + + } + else + { + LLIMChiclet* chiclet = createIMChiclet(session_id); + if(chiclet) + { + chiclet->setIMSessionName(name); + chiclet->setOtherParticipantId(other_participant_id); + } + else + { + llerrs << "Could not create chiclet" << llendl; + } + } + } +} + +//virtual +void LLBottomTray::sessionRemoved(const LLUUID& session_id) +{ + if(getChicletPanel()) + { + getChicletPanel()->removeChiclet(session_id); + } +} + +//virtual +void LLBottomTray::onFocusLost() +{ + if (gAgent.cameraMouselook()) + { + setVisible(FALSE); + } +} + +//virtual +// setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode. +// If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true), +void LLBottomTray::setVisible(BOOL visible) +{ + LLPanel::setVisible(visible); + + // *NOTE: we must check mToolbarStack against NULL because setVisible is called from the + // LLPanel::initFromParams BEFORE postBuild is called and child controls are not exist yet + if (NULL != mToolbarStack) + { + BOOL visibility = gAgent.cameraMouselook() ? false : true; + + for ( child_list_const_iter_t child_it = mToolbarStack->getChildList()->begin(); + child_it != mToolbarStack->getChildList()->end(); child_it++) + { + LLView* viewp = *child_it; + std::string name = viewp->getName(); + + if ("chat_bar" == name || "movement_panel" == name || "cam_panel" == name) + continue; + else + { + viewp->setVisible(visibility); + } + } + } +} + +BOOL LLBottomTray::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + if (mShowCamMoveCtrlsContextMenu) + { + mShowCamMoveCtrlsContextMenu->buildDrawLabels(); + mShowCamMoveCtrlsContextMenu->updateParent(LLMenuGL::sMenuContainer); + LLMenuGL::showPopup(this, mShowCamMoveCtrlsContextMenu, x, y); + } + + return TRUE; +} + +bool LLBottomTray::onShowCamMoveCtrlsContextMenuItemEnabled(const LLSD& userdata) +{ + std::string item = userdata.asString(); + + if (item == "show_camera_move_controls") + { + return gSavedSettings.getBOOL("ShowCameraAndMoveControls"); + } + + return FALSE; +} + +void LLBottomTray::onShowCamMoveCtrlsContextMenuItemClicked(const LLSD& userdata) +{ + std::string item = userdata.asString(); + + if (item == "show_camera_move_controls") + { + BOOL state = !gSavedSettings.getBOOL("ShowCameraAndMoveControls"); + + showCameraAndMoveControls(state); + gSavedSettings.setBOOL("ShowCameraAndMoveControls", state); + } +} + +void LLBottomTray::showCameraAndMoveControls(BOOL visible) +{ + mCamPanel->setVisible(visible); + mMovementPanel->setVisible(visible); +} |