237 lines
5.5 KiB
C++
237 lines
5.5 KiB
C++
/**
|
|
* @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 "llfocusmgr.h"
|
|
#include "lltoast.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();
|
|
if (elapsed_time > 4)
|
|
{
|
|
setBackgroundOpaque(FALSE);
|
|
}
|
|
if (elapsed_time > mTimerValue)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
void LLToast::hide()
|
|
{
|
|
setVisible(FALSE); //TODO: store in Chiclet's history
|
|
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);
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|