diff options
Diffstat (limited to 'indra/newview/lltoast.cpp')
-rw-r--r-- | indra/newview/lltoast.cpp | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp new file mode 100644 index 0000000000..6f5b25214e --- /dev/null +++ b/indra/newview/lltoast.cpp @@ -0,0 +1,239 @@ +/** + * @file lltoast.cpp + * @brief This class implements a placeholder for any notification panel. + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-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 "lltoast.h" + +#include "llbutton.h" +#include "llfocusmgr.h" + +using namespace LLNotificationsUI; + +//-------------------------------------------------------------------------- +LLToast::LLToast(LLPanel* panel) : + LLFloater(), + mTimerValue(5), + mIsViewed(false), + mPanel(panel), + mCanFade(true), + mHideBtn(NULL), + mIsModal(false), + mCanBeStored(true) +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_toast.xml"); + + mHideBtn = getChild<LLButton>("hide_btn"); + if(mHideBtn) + { + mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this)); + } + if(mPanel) + { + arrange(mPanel); + } + + // disable unnecessary Floater's functionality + setTitleVisible(FALSE); + setCanMinimize(FALSE); + setCanClose(FALSE); + setCanTearOff(FALSE); + setCanResize(FALSE); + setCanDrag(FALSE); +} + +//-------------------------------------------------------------------------- +void LLToast::setHideButtonEnabled(bool enabled) +{ + if(mHideBtn) + mHideBtn->setEnabled(enabled); +} + +//-------------------------------------------------------------------------- +LLToast::~LLToast() +{ + if(mIsModal) + { + gFocusMgr.unlockFocus(); + gFocusMgr.releaseFocusIfNeeded( this ); + } +} + +//-------------------------------------------------------------------------- +void LLToast::setAndStartTimer(F32 period) +{ + if(mCanFade) + { + mTimerValue = period; + mTimer.start(); + } +} + +//-------------------------------------------------------------------------- +bool LLToast::timerHasExpired() +{ + if (mTimer.getStarted()) + { + F32 elapsed_time = mTimer.getElapsedTimeF32(); + // after 4 seconds a toast should start fade + if (elapsed_time > 4) + { + setBackgroundOpaque(FALSE); + } + if (elapsed_time > mTimerValue) + { + return true; + } + } + return false; +} + +//-------------------------------------------------------------------------- +void LLToast::hide() +{ + setVisible(FALSE); + mIsViewed = false; + mTimer.stop(); + mOnFade(this, LLSD()); +} + +//-------------------------------------------------------------------------- +void LLToast::setCanFade(bool can_fade) +{ + mCanFade = can_fade; + if(!mCanFade) + mTimer.stop(); +} + +//-------------------------------------------------------------------------- +void LLToast::tick() +{ + if(mCanFade) + { + setVisible(FALSE); + mTimer.stop(); + mOnFade(this, LLSD()); + } +} + +//-------------------------------------------------------------------------- +void LLToast::arrange(LLPanel* panel) +{ + LLRect panel_rect, toast_rect; + + panel_rect = panel->getRect(); + reshape(panel_rect.getWidth(), panel_rect.getHeight()); + panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight()); + panel->setRect(panel_rect); + addChild(panel); +} + +//-------------------------------------------------------------------------- +void LLToast::draw() +{ + if(timerHasExpired()) + { + tick(); + } + + LLFloater::draw(); +} + +//-------------------------------------------------------------------------- +void LLToast::setModal(bool modal) +{ + mIsModal = modal; + if(mIsModal) + { + gFocusMgr.setMouseCapture( this ); + gFocusMgr.setTopCtrl( this ); + setFocus(TRUE); + } +} + +//-------------------------------------------------------------------------- +void LLToast::setVisible(BOOL show) +{ + if(show) + { + setBackgroundOpaque(TRUE); + } + LLPanel::setVisible(show); + if(mPanel) + { + if(!mPanel->isDead()) + { + mPanel->setVisible(show); + } + } +} + +//-------------------------------------------------------------------------- +void LLToast::onMouseEnter(S32 x, S32 y, MASK mask) +{ + mOnToastHover(this, MOUSE_ENTER); + + setVisibleAndFrontmost(); + setBackgroundOpaque(TRUE); + if(mCanFade && !mIsViewed) + { + mTimer.stop(); + } + + sendChildToFront(mHideBtn); + if(mHideBtn && mHideBtn->getEnabled()) + mHideBtn->setVisible(TRUE); + mOnMousEnter(this, LLSD()); +} + +//-------------------------------------------------------------------------- +void LLToast::onMouseLeave(S32 x, S32 y, MASK mask) +{ + mOnToastHover(this, MOUSE_LEAVE); + + if(mCanFade && !mIsViewed) + { + mTimer.start(); + } + if(mHideBtn && mHideBtn->getEnabled()) + { + if( mHideBtn->getRect().pointInRect(x, y) ) + return; + mHideBtn->setVisible(FALSE); + } +} + +//-------------------------------------------------------------------------- + + + + |