fixed EXT-6736 Notecard floater missing Keep/Discard Buttons (vwr 2.0)
Added functionality to close hidden IM toasts when IM floater opens. reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/321/ --HG-- branch : product-enginemeow-7.2.2
parent
38086b7425
commit
8dae4c265e
|
|
@ -243,3 +243,19 @@ void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLS
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
LLNotificationsUI::LLScreenChannel* LLChannelManager::getNotificationScreenChannel()
|
||||
{
|
||||
LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
|
||||
(LLNotificationsUI::LLChannelManager::getInstance()->
|
||||
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
|
||||
|
||||
if (channel == NULL)
|
||||
{
|
||||
llwarns << "Can't find screen channel by NotificationChannelUUID" << llendl;
|
||||
llassert(!"Can't find screen channel by NotificationChannelUUID");
|
||||
}
|
||||
|
||||
return channel;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,11 @@ public:
|
|||
*/
|
||||
void killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher);
|
||||
|
||||
/**
|
||||
* Returns notification screen channel.
|
||||
*/
|
||||
static LLNotificationsUI::LLScreenChannel* getNotificationScreenChannel();
|
||||
|
||||
private:
|
||||
|
||||
LLScreenChannel* createChannel(LLChannelManager::Params& p);
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
#include "llsyswellwindow.h"
|
||||
#include "lltrans.h"
|
||||
#include "llchathistory.h"
|
||||
#include "llnotifications.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llvoicechannel.h"
|
||||
#include "lltransientfloatermgr.h"
|
||||
|
|
@ -371,6 +372,8 @@ void LLIMFloater::onSlide()
|
|||
//static
|
||||
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
|
||||
{
|
||||
closeHiddenIMToasts();
|
||||
|
||||
if (!gIMMgr->hasSession(session_id)) return NULL;
|
||||
|
||||
if(!isChatMultiTab())
|
||||
|
|
@ -1083,6 +1086,26 @@ void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLIMFloater::closeHiddenIMToasts()
|
||||
{
|
||||
class IMToastMatcher: public LLNotificationsUI::LLScreenChannel::Matcher
|
||||
{
|
||||
public:
|
||||
bool matches(const LLNotificationPtr notification) const
|
||||
{
|
||||
// "notifytoast" type of notifications is reserved for IM notifications
|
||||
return "notifytoast" == notification->getType();
|
||||
}
|
||||
};
|
||||
|
||||
LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
|
||||
if (channel != NULL)
|
||||
{
|
||||
channel->closeHiddenToasts(IMToastMatcher());
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLIMFloater::isChatMultiTab()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -148,6 +148,8 @@ private:
|
|||
// Remove the "User is typing..." indicator.
|
||||
void removeTypingIndicator(const LLIMInfo* im_info = NULL);
|
||||
|
||||
static void closeHiddenIMToasts();
|
||||
|
||||
LLPanelChatControlPanel* mControlPanel;
|
||||
LLUUID mSessionID;
|
||||
S32 mLastMessageIndex;
|
||||
|
|
|
|||
|
|
@ -706,6 +706,31 @@ void LLScreenChannel::hideToast(const LLUUID& notification_id)
|
|||
}
|
||||
}
|
||||
|
||||
void LLScreenChannel::closeHiddenToasts(const Matcher& matcher)
|
||||
{
|
||||
// since we can't guarantee that close toast operation doesn't change mToastList
|
||||
// we collect matched toasts that should be closed into separate list
|
||||
std::list<ToastElem> toasts;
|
||||
for (std::vector<ToastElem>::iterator it = mToastList.begin(); it
|
||||
!= mToastList.end(); it++)
|
||||
{
|
||||
LLToast * toast = it->toast;
|
||||
// add to list valid toast that match to provided matcher criteria
|
||||
if (toast != NULL && !toast->isDead() && toast->getNotification() != NULL
|
||||
&& !toast->getVisible() && matcher.matches(toast->getNotification()))
|
||||
{
|
||||
toasts.push_back(*it);
|
||||
}
|
||||
}
|
||||
|
||||
// close collected toasts
|
||||
for (std::list<ToastElem>::iterator it = toasts.begin(); it
|
||||
!= toasts.end(); it++)
|
||||
{
|
||||
it->toast->closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
void LLScreenChannel::removeToastsFromChannel()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -173,6 +173,12 @@ public:
|
|||
void hideToastsFromScreen();
|
||||
// hide toast by notification id
|
||||
void hideToast(const LLUUID& notification_id);
|
||||
|
||||
/**
|
||||
* Closes hidden matched toasts from channel.
|
||||
*/
|
||||
void closeHiddenToasts(const Matcher& matcher);
|
||||
|
||||
// removes all toasts from a channel
|
||||
void removeToastsFromChannel();
|
||||
// show all toasts in a channel
|
||||
|
|
|
|||
Loading…
Reference in New Issue