phoenix-firestorm/indra/newview/lltoast.h

257 lines
7.7 KiB
C++

/**
* @file lltoast.h
* @brief This class implements a placeholder for any notification panel.
*
* $LicenseInfo:firstyear=2003&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLTOAST_H
#define LL_LLTOAST_H
#include "llinstancetracker.h"
#include "llpanel.h"
#include "llmodaldialog.h"
#include "lleventtimer.h"
#include "llnotificationptr.h"
#include "llviewercontrol.h"
#include "lltexteditor.h"
#include <memory>
#define MOUSE_LEAVE false
#define MOUSE_ENTER true
namespace LLNotificationsUI
{
class LLToast;
/**
* Timer for toasts.
*/
class LLToastLifeTimer: public LLEventTimer
{
public:
LLToastLifeTimer(LLToast* toast, F32 period);
/*virtual*/
bool tick();
void stop();
void start();
void restart();
bool getStarted();
void setPeriod(F32 period);
F32 getRemainingTimeF32();
LLTimer& getEventTimer() { return mEventTimer;}
private :
LLToast* mToast;
};
/**
* Represents toast pop-up.
* This is a parent view for all toast panels.
*/
class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>
{
friend class LLToastLifeTimer;
public:
typedef boost::function<void (LLToast* toast)> toast_callback_t;
typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t;
typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t;
struct Params : public LLInitParam::Block<Params>
{
Mandatory<LLPanel*> panel;
Optional<LLUUID> notif_id, //notification ID
session_id; //im session ID
Optional<LLNotificationPtr> notification;
//NOTE: Life time of a toast (i.e. period of time from the moment toast was shown
//till the moment when toast was hidden) is the sum of lifetime_secs and fading_time_secs.
Optional<F32> lifetime_secs, // Number of seconds while a toast is non-transparent
fading_time_secs; // Number of seconds while a toast is transparent
Optional<toast_callback_t> on_delete_toast;
Optional<bool> can_fade,
can_be_stored,
enable_hide_btn,
is_modal,
is_tip,
force_show,
force_store;
Params();
};
static void updateClass();
static void cleanupToasts();
static bool isAlertToastShown() { return sModalToastsList.size() > 0; }
LLToast(const LLToast::Params& p);
virtual ~LLToast();
bool postBuild();
/*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true);
// Toast handlers
virtual bool handleMouseDown(S32 x, S32 y, MASK mask);
//Fading
/** Stop lifetime/fading timer */
virtual void stopTimer();
/** Start lifetime/fading timer */
virtual void startTimer();
bool isHovered() { return mIsHovered; }
// Operating with toasts
// insert a panel to a toast
void insertPanel(LLPanel* panel);
void reshapeToPanel();
// get toast's panel
LLPanel* getPanel() const { return mPanel; }
// enable/disable Toast's Hide button
void setHideButtonEnabled(bool enabled);
//
F32 getTimeLeftToLive();
//
LLToastLifeTimer* getTimer() { return mTimer.get();}
//
virtual void draw();
//
virtual void setVisible(bool show);
/*virtual*/ void setBackgroundOpaque(bool b);
//
virtual void hide();
/*virtual*/ void setFocus(bool b);
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
void setLifetime(S32 seconds);
void setFadingTime(S32 seconds);
void closeToast();
/**
* Returns padding between floater top and wrapper_panel top.
* This padding should be taken into account when positioning or reshaping toasts
*/
S32 getTopPad();
S32 getRightPad();
// get/set Toast's flags or states
// get information whether the notification corresponding to the toast is valid or not
bool isNotificationValid();
// get toast's Notification ID
const LLUUID getNotificationID() const { return mNotificationID;}
// get toast's Session ID
const LLUUID getSessionID() const { return mSessionID;}
//
void setCanFade(bool can_fade);
//
void setCanBeStored(bool can_be_stored) { mCanBeStored = can_be_stored; }
//
bool getCanBeStored() { return mCanBeStored; }
// set whether this toast considered as hidden or not
void setIsHidden( bool is_toast_hidden ) { mIsHidden = is_toast_hidden; }
const LLNotificationPtr& getNotification() const { return mNotification;}
// Registers signals/callbacks for events
boost::signals2::connection setOnFadeCallback(const toast_signal_t::slot_type& cb) { return mOnFadeSignal.connect(cb); }
boost::signals2::connection setOnToastDestroyedCallback(const toast_signal_t::slot_type& cb) { return mOnToastDestroyedSignal.connect(cb); }
boost::signals2::connection setOnToastHoverCallback(const toast_hover_check_signal_t::slot_type& cb) { return mOnToastHoverSignal.connect(cb); }
boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };
boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };
virtual S32 notifyParent(const LLSD& info);
LLHandle<LLToast> getHandle() const { return getDerivedHandle<LLToast>(); }
protected:
void updateTransparency();
private:
void updateHoveredState();
void expire();
void setFading(bool fading);
LLUUID mNotificationID;
LLUUID mSessionID;
LLNotificationPtr mNotification;
//LLRootHandle<LLToast> mHandle;
LLPanel* mWrapperPanel;
// timer counts a lifetime of a toast
std::unique_ptr<LLToastLifeTimer> mTimer;
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
LLPanel* mPanel;
LLButton* mHideBtn;
LLColor4 mBgColor;
bool mCanFade;
bool mCanBeStored;
bool mHideBtnEnabled;
bool mHideBtnPressed;
bool mIsHidden; // this flag is true when a toast has faded or was hidden with (x) button (EXT-1849)
bool mIsTip;
bool mIsFading;
bool mIsHovered;
toast_signal_t mOnFadeSignal;
toast_signal_t mOnDeleteToastSignal;
toast_signal_t mOnToastDestroyedSignal;
toast_hover_check_signal_t mOnToastHoverSignal;
commit_signal_t mToastMouseEnterSignal;
commit_signal_t mToastMouseLeaveSignal;
static std::list<LLToast*> sModalToastsList;
};
}
#endif