From e5d6a14f05f857ecbbbd9b464db3ece82d1d099f Mon Sep 17 00:00:00 2001 From: pavelk_productengine <none@none> Date: Fri, 9 Jan 2015 20:17:39 +0200 Subject: [PATCH] MAINT-4734 (Separate transaction notices from group notice/invites) - initial version Works: 1) All new notices shown on "Invites" tab of new floater "NOTIFICATIONS TABBED" in condensed view To be done: 1) Show other types of notices, like transactions and system 2) Separate notices between tabs "Invites", "System", "Transactions" 3) Design full notice view (in addition to condensed view) --- indra/newview/CMakeLists.txt | 2 + indra/newview/llchannelmanager.cpp | 4 +- indra/newview/llchiclet.cpp | 10 +- indra/newview/llchicletbar.cpp | 4 +- .../newview/llfloaternotificationstabbed.cpp | 377 ++++++++++++++++++ indra/newview/llfloaternotificationstabbed.h | 143 +++++++ indra/newview/llsyswellitem.cpp | 80 ++++ indra/newview/llsyswellitem.h | 54 +++ indra/newview/llviewerfloaterreg.cpp | 6 +- .../textures/icons/Icon_Attachment_Large.png | Bin 0 -> 4182 bytes .../textures/icons/Icon_Attachment_Small.png | Bin 0 -> 3774 bytes .../textures/icons/Icon_Group_Large.png | Bin 0 -> 12280 bytes .../textures/icons/Icon_Group_Small.png | Bin 0 -> 4473 bytes .../icons/Icon_Notification_Condense.png | Bin 0 -> 262 bytes .../icons/Icon_Notification_Expand.png | Bin 0 -> 239 bytes .../skins/default/textures/textures.xml | 7 + .../xui/en/floater_notifications_tabbed.xml | 134 +++++++ .../default/xui/en/language_settings.xml | 2 +- .../skins/default/xui/en/menu_login.xml | 2 +- .../xui/en/panel_notification_tabbed_item.xml | 53 +++ 20 files changed, 870 insertions(+), 8 deletions(-) create mode 100644 indra/newview/llfloaternotificationstabbed.cpp create mode 100644 indra/newview/llfloaternotificationstabbed.h create mode 100644 indra/newview/skins/default/textures/icons/Icon_Attachment_Large.png create mode 100644 indra/newview/skins/default/textures/icons/Icon_Attachment_Small.png create mode 100644 indra/newview/skins/default/textures/icons/Icon_Group_Large.png create mode 100644 indra/newview/skins/default/textures/icons/Icon_Group_Small.png create mode 100644 indra/newview/skins/default/textures/icons/Icon_Notification_Condense.png create mode 100644 indra/newview/skins/default/textures/icons/Icon_Notification_Expand.png create mode 100644 indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml create mode 100644 indra/newview/skins/default/xui/en/panel_notification_tabbed_item.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e8f4144e70d..b17811d6448 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -262,6 +262,7 @@ set(viewer_SOURCE_FILES llfloatermodeluploadbase.cpp llfloaternamedesc.cpp llfloaternotificationsconsole.cpp + llfloaternotificationstabbed.cpp llfloaterobjectweights.cpp llfloateropenobject.cpp llfloateroutbox.cpp @@ -870,6 +871,7 @@ set(viewer_HEADER_FILES llfloatermodeluploadbase.h llfloaternamedesc.h llfloaternotificationsconsole.h + llfloaternotificationstabbed.h llfloaterobjectweights.h llfloateropenobject.h llfloateroutbox.h diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index b0537a83f16..49a71b0018a 100755 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -35,6 +35,7 @@ #include "llviewerwindow.h" #include "llrootview.h" #include "llsyswellwindow.h" +#include "llfloaternotificationstabbed.h" #include "llfloaterreg.h" #include <algorithm> @@ -131,7 +132,8 @@ void LLChannelManager::onLoginCompleted() S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); - mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + //mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + mStartUpChannel->setMouseDownCallback(boost::bind(&LLFloaterNotificationsTabbed::onStartUpToastClick, LLFloaterNotificationsTabbed::getInstance(), _2, _3, _4)); mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index c0823182c04..6435c934b98 100755 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -35,6 +35,7 @@ #include "llscriptfloater.h" #include "llsingleton.h" #include "llsyswellwindow.h" +#include "llfloaternotificationstabbed.h" static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel"); static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification"); @@ -165,7 +166,8 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p) mNotificationChannel.reset(new ChicletNotificationChannel(this)); // ensure that notification well window exists, to synchronously // handle toast add/delete events. - LLNotificationWellWindow::getInstance()->setSysWellChiclet(this); + //LLNotificationWellWindow::getInstance()->setSysWellChiclet(this); + LLFloaterNotificationsTabbed::getInstance()->setSysWellChiclet(this); } void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data) @@ -173,7 +175,8 @@ void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data) std::string action = user_data.asString(); if("close all" == action) { - LLNotificationWellWindow::getInstance()->closeAll(); + //LLNotificationWellWindow::getInstance()->closeAll(); + LLFloaterNotificationsTabbed::getInstance()->closeAll(); LLIMWellWindow::getInstance()->closeAll(); } } @@ -224,7 +227,8 @@ bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNo bool displayNotification; if ( (notification->getName() == "ScriptDialog") // special case for scripts // if there is no toast window for the notification, filter it - || (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID())) + //|| (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID())) + || (!LLFloaterNotificationsTabbed::getInstance()->findItemByID(notification->getID())) ) { displayNotification = false; diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp index 28e367fbe1a..45510d08243 100755 --- a/indra/newview/llchicletbar.cpp +++ b/indra/newview/llchicletbar.cpp @@ -31,6 +31,7 @@ #include "lllayoutstack.h" #include "llpaneltopinfobar.h" #include "llsyswellwindow.h" +#include "llfloaternotificationstabbed.h" namespace { @@ -59,7 +60,8 @@ BOOL LLChicletBar::postBuild() mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); - showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty()); + //showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty()); + showWellButton("notification_well", !LLFloaterNotificationsTabbed::getInstance()->isWindowEmpty()); LLPanelTopInfoBar::instance().setResizeCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this)); LLPanelTopInfoBar::instance().setVisibleCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this)); diff --git a/indra/newview/llfloaternotificationstabbed.cpp b/indra/newview/llfloaternotificationstabbed.cpp new file mode 100644 index 00000000000..09f0a0ed5e0 --- /dev/null +++ b/indra/newview/llfloaternotificationstabbed.cpp @@ -0,0 +1,377 @@ +/** + * @file llfloaternotificationstabbed.cpp + * @brief // TODO + * $LicenseInfo:firstyear=2000&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$ + */ + +#include "llviewerprecompiledheaders.h" // must be first include +#include "llfloaternotificationstabbed.h" + +#include "llchiclet.h" +#include "llchicletbar.h" +#include "llflatlistview.h" +#include "llfloaterreg.h" +#include "llnotificationmanager.h" +#include "llnotificationsutil.h" +#include "llscriptfloater.h" +#include "llspeakers.h" +#include "lltoastpanel.h" +#include "lltoastnotifypanel.h" + +//--------------------------------------------------------------------------------- +LLFloaterNotificationsTabbed::LLFloaterNotificationsTabbed(const LLSD& key) : LLTransientDockableFloater(NULL, true, key), + mChannel(NULL), + mMessageList(NULL), + mSysWellChiclet(NULL), + NOTIFICATION_TABBED_ANCHOR_NAME("notification_well_panel"), + IM_WELL_ANCHOR_NAME("im_well_panel"), + mIsReshapedByUser(false) + +{ + setOverlapsScreenChannel(true); + mNotificationUpdates.reset(new NotificationTabbedChannel(this)); +} + +//--------------------------------------------------------------------------------- +BOOL LLFloaterNotificationsTabbed::postBuild() +{ + mMessageList = getChild<LLFlatListView>("notification_list"); + + // get a corresponding channel + initChannel(); + BOOL rv = LLTransientDockableFloater::postBuild(); + + //LLNotificationWellWindow::postBuild() + //-------------------------- + setTitle(getString("title_notification_tabbed_window")); + return rv; +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::setMinimized(BOOL minimize) +{ + LLTransientDockableFloater::setMinimized(minimize); +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::handleReshape(const LLRect& rect, bool by_user) +{ + mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user + LLTransientDockableFloater::handleReshape(rect, by_user); +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::onStartUpToastClick(S32 x, S32 y, MASK mask) +{ + // just set floater visible. Screen channels will be cleared. + setVisible(TRUE); +} + +void LLFloaterNotificationsTabbed::setSysWellChiclet(LLSysWellChiclet* chiclet) +{ + mSysWellChiclet = chiclet; + if(NULL != mSysWellChiclet) + { + mSysWellChiclet->updateWidget(isWindowEmpty()); + } +} + +//--------------------------------------------------------------------------------- +LLFloaterNotificationsTabbed::~LLFloaterNotificationsTabbed() +{ +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::removeItemByID(const LLUUID& id) +{ + if(mMessageList->removeItemByValue(id)) + { + if (NULL != mSysWellChiclet) + { + mSysWellChiclet->updateWidget(isWindowEmpty()); + } + reshapeWindow(); + } + else + { + LL_WARNS() << "Unable to remove notification from the list, ID: " << id + << LL_ENDL; + } + + // hide chiclet window if there are no items left + if(isWindowEmpty()) + { + setVisible(FALSE); + } +} + +//--------------------------------------------------------------------------------- +LLPanel * LLFloaterNotificationsTabbed::findItemByID(const LLUUID& id) +{ + return mMessageList->getItemByValue(id); +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::initChannel() +{ + LLNotificationsUI::LLScreenChannelBase* channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID( + LLUUID(gSavedSettings.getString("NotificationChannelUUID"))); + mChannel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>(channel); + if(NULL == mChannel) + { + LL_WARNS() << "LLSysWellWindow::initChannel() - could not get a requested screen channel" << LL_ENDL; + } + + //LLSysWellWindow::initChannel(); + //--------------------------------------------------------------------------------- + if(mChannel) + { + mChannel->addOnStoreToastCallback(boost::bind(&LLFloaterNotificationsTabbed::onStoreToast, this, _1, _2)); + } +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::setVisible(BOOL visible) +{ + //LLNotificationWellWindow::setVisible + //-------------------------- + if (visible) + { + // when Notification channel is cleared, storable toasts will be added into the list. + clearScreenChannels(); + } + //-------------------------- + if (visible) + { + if (NULL == getDockControl() && getDockTongue().notNull()) + { + setDockControl(new LLDockControl( + LLChicletBar::getInstance()->getChild<LLView>(getAnchorViewName()), this, + getDockTongue(), LLDockControl::BOTTOM)); + } + } + + // do not show empty window + if (NULL == mMessageList || isWindowEmpty()) visible = FALSE; + + LLTransientDockableFloater::setVisible(visible); + + // update notification channel state + initChannel(); // make sure the channel still exists + if(mChannel) + { + mChannel->updateShowToastsState(); + mChannel->redrawToasts(); + } +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::setDocked(bool docked, bool pop_on_undock) +{ + LLTransientDockableFloater::setDocked(docked, pop_on_undock); + + // update notification channel state + if(mChannel) + { + mChannel->updateShowToastsState(); + mChannel->redrawToasts(); + } +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::reshapeWindow() +{ + // save difference between floater height and the list height to take it into account while calculating new window height + // it includes height from floater top to list top and from floater bottom and list bottom + static S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight(); + + if (!mIsReshapedByUser) // Don't reshape Well window, if it ever was reshaped by user. See EXT-5715. + { + S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth(); + + LLRect curRect = getRect(); + + S32 new_window_height = notif_list_height + parent_list_delta_height; + + if (new_window_height > MAX_WINDOW_HEIGHT) + { + new_window_height = MAX_WINDOW_HEIGHT; + } + S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH : curRect.getWidth(); + + curRect.setLeftTopAndSize(curRect.mLeft, curRect.mTop, newWidth, new_window_height); + reshape(curRect.getWidth(), curRect.getHeight(), TRUE); + setRect(curRect); + } + + // update notification channel state + // update on a window reshape is important only when a window is visible and docked + if(mChannel && getVisible() && isDocked()) + { + mChannel->updateShowToastsState(); + } +} + +//--------------------------------------------------------------------------------- +bool LLFloaterNotificationsTabbed::isWindowEmpty() +{ + return mMessageList->size() == 0; +} + +LLFloaterNotificationsTabbed::NotificationTabbedChannel::NotificationTabbedChannel(LLFloaterNotificationsTabbed* notifications_tabbed_window) + : LLNotificationChannel(LLNotificationChannel::Params().name(notifications_tabbed_window->getPathname())), + mNotificationsTabbedWindow(notifications_tabbed_window) +{ + connectToChannel("Notifications"); + connectToChannel("Group Notifications"); + connectToChannel("Offer"); +} + +/* +LLFloaterNotificationsTabbed::LLNotificationWellWindow(const LLSD& key) + : LLSysWellWindow(key) +{ + mNotificationUpdates.reset(new NotificationTabbedChannel(this)); +} +*/ + +// static +LLFloaterNotificationsTabbed* LLFloaterNotificationsTabbed::getInstance(const LLSD& key /*= LLSD()*/) +{ + return LLFloaterReg::getTypedInstance<LLFloaterNotificationsTabbed>("notification_well_window", key); +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::addItem(LLNotificationTabbedItem::Params p) +{ + LLSD value = p.notification_id; + // do not add clones + if( mMessageList->getItemByValue(value)) + return; + + LLNotificationTabbedItem* new_item = new LLNotificationTabbedItem(p); + if (mMessageList->addItem(new_item, value, ADD_TOP)) + { + mSysWellChiclet->updateWidget(isWindowEmpty()); + reshapeWindow(); + new_item->setOnItemCloseCallback(boost::bind(&LLFloaterNotificationsTabbed::onItemClose, this, _1)); + new_item->setOnItemClickCallback(boost::bind(&LLFloaterNotificationsTabbed::onItemClick, this, _1)); + } + else + { + LL_WARNS() << "Unable to add Notification into the list, notification ID: " << p.notification_id + << ", title: " << p.title + << LL_ENDL; + + new_item->die(); + } +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::closeAll() +{ + // Need to clear notification channel, to add storable toasts into the list. + clearScreenChannels(); + std::vector<LLPanel*> items; + mMessageList->getItems(items); + for (std::vector<LLPanel*>::iterator + iter = items.begin(), + iter_end = items.end(); + iter != iter_end; ++iter) + { + LLNotificationTabbedItem* sys_well_item = dynamic_cast<LLNotificationTabbedItem*>(*iter); + if (sys_well_item) + onItemClose(sys_well_item); + } +} + +////////////////////////////////////////////////////////////////////////// +// PRIVATE METHODS +//void LLFloaterNotificationsTabbed::initChannel() +//{ +// LLFloaterNotificationsTabbed::initChannel(); +// if(mChannel) +// { +// mChannel->addOnStoreToastCallback(boost::bind(&LLFloaterNotificationsTabbed::onStoreToast, this, _1, _2)); +// } +//} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::clearScreenChannels() +{ + // 1 - remove StartUp toast and channel if present + if(!LLNotificationsUI::LLScreenChannel::getStartUpToastShown()) + { + LLNotificationsUI::LLChannelManager::getInstance()->onStartUpToastClose(); + } + + // 2 - remove toasts in Notification channel + if(mChannel) + { + mChannel->removeAndStoreAllStorableToasts(); + } +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::onStoreToast(LLPanel* info_panel, LLUUID id) +{ + LLNotificationTabbedItem::Params p; + p.notification_id = id; + p.title = static_cast<LLToastPanel*>(info_panel)->getTitle(); + LLNotificationsUI::LLToast* toast = mChannel->getToastByNotificationID(id); + LLSD payload = toast->getNotification()->getPayload(); + LLDate time_stamp = toast->getNotification()->getDate(); + p.group_id = payload["group_id"]; + p.sender = payload["name"]; + p.time_stamp = time_stamp; + addItem(p); +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::onItemClick(LLNotificationTabbedItem* item) +{ + LLUUID id = item->getID(); + LLFloaterReg::showInstance("inspect_toast", id); +} + +//--------------------------------------------------------------------------------- +void LLFloaterNotificationsTabbed::onItemClose(LLNotificationTabbedItem* item) +{ + LLUUID id = item->getID(); + + if(mChannel) + { + // removeItemByID() is invoked from killToastByNotificationID() and item will removed; + mChannel->killToastByNotificationID(id); + } + else + { + // removeItemByID() should be called one time for each item to remove it from notification well + removeItemByID(id); + } + +} + +void LLFloaterNotificationsTabbed::onAdd( LLNotificationPtr notify ) +{ + removeItemByID(notify->getID()); +} diff --git a/indra/newview/llfloaternotificationstabbed.h b/indra/newview/llfloaternotificationstabbed.h new file mode 100644 index 00000000000..1fd60826cbb --- /dev/null +++ b/indra/newview/llfloaternotificationstabbed.h @@ -0,0 +1,143 @@ +/** + * @file llfloaternotificationstabbed.h + * @brief // TODO + * + * $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_FLOATERNOTIFICATIONSTABBED_H +#define LL_FLOATERNOTIFICATIONSTABBED_H + +#include "llimview.h" +#include "llnotifications.h" +#include "llscreenchannel.h" +#include "llsyswellitem.h" +#include "lltransientdockablefloater.h" + +class LLAvatarName; +class LLChiclet; +class LLFlatListView; +class LLIMChiclet; +class LLScriptChiclet; +class LLSysWellChiclet; + +class LLFloaterNotificationsTabbed : public LLTransientDockableFloater +{ +public: + LOG_CLASS(LLFloaterNotificationsTabbed); + + LLFloaterNotificationsTabbed(const LLSD& key); + virtual ~LLFloaterNotificationsTabbed(); + BOOL postBuild(); + + // other interface functions + // check is window empty + bool isWindowEmpty(); + + // Operating with items + void removeItemByID(const LLUUID& id); + LLPanel * findItemByID(const LLUUID& id); + + // Operating with outfit + virtual void setVisible(BOOL visible); + void adjustWindowPosition();//not used - ? + + /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + // override LLFloater's minimization according to EXT-1216 + /*virtual*/ void setMinimized(BOOL minimize); + /*virtual*/ void handleReshape(const LLRect& rect, bool by_user); + + void onStartUpToastClick(S32 x, S32 y, MASK mask); + + void setSysWellChiclet(LLSysWellChiclet* chiclet); + + // size constants for the window and for its elements + static const S32 MAX_WINDOW_HEIGHT = 200; + static const S32 MIN_WINDOW_WIDTH = 318; + +protected: + // init Window's channel + virtual void initChannel(); + + const std::string NOTIFICATION_TABBED_ANCHOR_NAME; + const std::string IM_WELL_ANCHOR_NAME; + //virtual const std::string& getAnchorViewName() = 0; + + void reshapeWindow(); + + // pointer to a corresponding channel's instance + LLNotificationsUI::LLScreenChannel* mChannel; + LLFlatListView* mMessageList; + + /** + * Reference to an appropriate Well chiclet to release "new message" state. EXT-3147 + */ + LLSysWellChiclet* mSysWellChiclet; + + bool mIsReshapedByUser; + +public: + static LLFloaterNotificationsTabbed* getInstance(const LLSD& key = LLSD()); + + /*virtual*/ //BOOL postBuild(); + /*virtual*/ //void setVisible(BOOL visible); + /*virtual*/ void onAdd(LLNotificationPtr notify); + // Operating with items + void addItem(LLNotificationTabbedItem::Params p); + + // Closes all notifications and removes them from the Notification Well + void closeAll(); + +protected: + struct NotificationTabbedChannel : public LLNotificationChannel + { + NotificationTabbedChannel(LLFloaterNotificationsTabbed*); + void onDelete(LLNotificationPtr notify) + { + mNotificationsTabbedWindow->removeItemByID(notify->getID()); + } + + LLFloaterNotificationsTabbed* mNotificationsTabbedWindow; + }; + + LLNotificationChannelPtr mNotificationUpdates; + virtual const std::string& getAnchorViewName() { return NOTIFICATION_TABBED_ANCHOR_NAME; } + +private: + // init Window's channel + // void initChannel(); + void clearScreenChannels(); + + void onStoreToast(LLPanel* info_panel, LLUUID id); + + // Handlers + void onItemClick(LLNotificationTabbedItem* item); + void onItemClose(LLNotificationTabbedItem* item); + + // ID of a toast loaded by user (by clicking notification well item) + LLUUID mLoadedToastId; +}; + +#endif // LL_FLOATERNOTIFICATIONSTABBED_H + + + diff --git a/indra/newview/llsyswellitem.cpp b/indra/newview/llsyswellitem.cpp index 057d80457c6..bc8333d5fcd 100755 --- a/indra/newview/llsyswellitem.cpp +++ b/indra/newview/llsyswellitem.cpp @@ -31,6 +31,7 @@ #include "llwindow.h" #include "v4color.h" +#include "lltrans.h" #include "lluicolortable.h" //--------------------------------------------------------------------------------- @@ -90,4 +91,83 @@ void LLSysWellItem::onMouseLeave(S32 x, S32 y, MASK mask) //--------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------- +LLNotificationTabbedItem::LLNotificationTabbedItem(const Params& p) : LLPanel(p), + mTitle(NULL), + mSender(NULL), + mCloseBtn(NULL) +{ + buildFromFile( "panel_notification_tabbed_item.xml"); + + mTitle = getChild<LLTextBox>("GroupName_NoticeTitle"); + mSender = getChild<LLTextBox>("Sender_Resident"); + mTimeBox = getChild<LLTextBox>("Time_Box"); + mGroupIcon = getChild<LLIconCtrl>("group_icon_small"); + mCloseBtn = getChild<LLButton>("close_btn"); + + mTitle->setValue(p.title); + mSender->setValue("Sender: " + p.sender); + mTimeBox->setValue(buildNotificationDate(p.time_stamp)); + mGroupIcon->setValue(p.group_id); + + mCloseBtn->setClickedCallback(boost::bind(&LLNotificationTabbedItem::onClickCloseBtn,this)); + + mID = p.notification_id; +} + +//--------------------------------------------------------------------------------- +LLNotificationTabbedItem::~LLNotificationTabbedItem() +{ +} +//--------------------------------------------------------------------------------- +//static +std::string LLNotificationTabbedItem::buildNotificationDate(const LLDate& time_stamp) +{ + std::string timeStr = "[" + LLTrans::getString("LTimeMthNum") + "]/[" + +LLTrans::getString("LTimeDay")+"]/[" + +LLTrans::getString("LTimeYear")+"] [" + +LLTrans::getString("LTimeHour")+"]:[" + +LLTrans::getString("LTimeMin")+"]"; + + LLSD substitution; + substitution["datetime"] = time_stamp; + LLStringUtil::format(timeStr, substitution); + return timeStr; +} + +//--------------------------------------------------------------------------------- +void LLNotificationTabbedItem::setTitle( std::string title ) +{ + mTitle->setValue(title); +} + +//--------------------------------------------------------------------------------- +void LLNotificationTabbedItem::onClickCloseBtn() +{ + mOnItemClose(this); +} + +//--------------------------------------------------------------------------------- +BOOL LLNotificationTabbedItem::handleMouseDown(S32 x, S32 y, MASK mask) +{ + BOOL res = LLPanel::handleMouseDown(x, y, mask); + if(!mCloseBtn->getRect().pointInRect(x, y)) + //if(!mCloseBtn->getRect().pointInRect(x, y)) + //if(!mCloseBtn->getLocalRect().pointInRect(x, y)) + mOnItemClick(this); + + return res; +} + +//--------------------------------------------------------------------------------- +void LLNotificationTabbedItem::onMouseEnter(S32 x, S32 y, MASK mask) +{ + //setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemSelected" )); +} + +//--------------------------------------------------------------------------------- +void LLNotificationTabbedItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ + //setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" )); +} diff --git a/indra/newview/llsyswellitem.h b/indra/newview/llsyswellitem.h index d961708a01d..4379b8dc224 100755 --- a/indra/newview/llsyswellitem.h +++ b/indra/newview/llsyswellitem.h @@ -32,6 +32,8 @@ #include "llbutton.h" #include "lliconctrl.h" +#include "llgroupmgr.h" + #include <string> class LLSysWellItem : public LLPanel @@ -76,6 +78,58 @@ class LLSysWellItem : public LLPanel LLUUID mID; }; +class LLNotificationTabbedItem : public LLPanel +{ +public: + struct Params : public LLInitParam::Block<Params, LLPanel::Params> + { + LLUUID notification_id; + LLUUID group_id; + std::string title; + std::string sender; + LLDate time_stamp; + Params() {}; + }; + + + LLNotificationTabbedItem(const Params& p); + virtual ~LLNotificationTabbedItem(); + + // title + void setTitle( std::string title ); + void setGroupID(const LLUUID& group_id); + void setGroupIconID(const LLUUID& group_icon_id); + void setGroupName(const std::string& group_name); + + // get item's ID + LLUUID getID() { return mID; } + + // handlers + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual void onMouseEnter(S32 x, S32 y, MASK mask); + virtual void onMouseLeave(S32 x, S32 y, MASK mask); + + //callbacks + typedef boost::function<void (LLNotificationTabbedItem* item)> item_callback_t; + typedef boost::signals2::signal<void (LLNotificationTabbedItem* item)> item_signal_t; + item_signal_t mOnItemClose; + item_signal_t mOnItemClick; + boost::signals2::connection setOnItemCloseCallback(item_callback_t cb) { return mOnItemClose.connect(cb); } + boost::signals2::connection setOnItemClickCallback(item_callback_t cb) { return mOnItemClick.connect(cb); } + +private: + static std::string buildNotificationDate(const LLDate&); + void onClickCloseBtn(); + + LLTextBox* mTitle; + LLTextBox* mSender; + LLTextBox* mTimeBox; + LLIconCtrl* mGroupIcon; + LLButton* mCloseBtn; + LLUUID mID; + LLUUID mGroupID; +}; + #endif // LL_LLSYSWELLITEM_H diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index e19fe9ca754..d20b8e342a0 100755 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -85,6 +85,7 @@ #include "llfloatermodelpreview.h" #include "llfloaternamedesc.h" #include "llfloaternotificationsconsole.h" +#include "llfloaternotificationstabbed.h" #include "llfloaterobjectweights.h" #include "llfloateropenobject.h" #include "llfloateroutbox.h" @@ -255,7 +256,10 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>); LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>); - LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>); + + LLFloaterReg::add("notification_well_window", "floater_notifications_tabbed.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationsTabbed>); + //LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>); + //LLFloaterReg::add("notifications_tabbed", "floater_notifications_tabbed.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationsTabbed>); LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>); LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>); diff --git a/indra/newview/skins/default/textures/icons/Icon_Attachment_Large.png b/indra/newview/skins/default/textures/icons/Icon_Attachment_Large.png new file mode 100644 index 0000000000000000000000000000000000000000..0732a33d933b3ed6f8f7c62ea2a31f0656b3392f GIT binary patch literal 4182 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Icon_Attachment_Small.png b/indra/newview/skins/default/textures/icons/Icon_Attachment_Small.png new file mode 100644 index 0000000000000000000000000000000000000000..81245549022bde22e658b3efe4ecb26b7cffc2a7 GIT binary patch literal 3774 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Icon_Group_Large.png b/indra/newview/skins/default/textures/icons/Icon_Group_Large.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc0cbda0b062692d0defa18749563e9e505dadc GIT binary patch literal 12280 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 S?{4n^0000<MNUMnLSTZ3zw-qE literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Icon_Group_Small.png b/indra/newview/skins/default/textures/icons/Icon_Group_Small.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2b521a1f15a86454a7dffaf7770bfc35f37666 GIT binary patch literal 4473 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 LNkvXXu0mjfE!cXW literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Icon_Notification_Condense.png b/indra/newview/skins/default/textures/icons/Icon_Notification_Condense.png new file mode 100644 index 0000000000000000000000000000000000000000..4d245eb57abb42d8f5cca5fd779680ecc75971a7 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^{2<K11|+SoP4xm&k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XR(QHNhE&{2N=ZoI`1$|;e?x_{XB?z{oMuY>!}LgACF@y3 z=0E<UOB()fxvZnAn##RszHN2c43)D&LPFavFY|rfzKJ_-Peo(ifqFHQvk5v{T3O6j zEF3*NJh)pNb0$davQjJA&LDd8+#JhdB@baAo+E6XjZY?AHFA1fDXz1MPtInC^oi|< z#hiM2dfMN-eH)t?$a;BCvBXhh%~>~3UgF_#&1W-WaA;s;NPQg;KQ+a=2Iyu6Pgg&e IbxsLQ0Lc4c^Z)<= literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Icon_Notification_Expand.png b/indra/newview/skins/default/textures/icons/Icon_Notification_Expand.png new file mode 100644 index 0000000000000000000000000000000000000000..186822da431c71df9f504ea1b76a43ff50b2ce3b GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^{2<K11|+SoP4xm&k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XCVIL!hE&{2N=ZoINK_Es(9rS!|9^Srpff73{+?z^{loM~ zUM1^UL*_sJqe~k8U%9HIs+#)y@o|2^HSeB0sQCQm=H|l|ruy;w_DD%Il-)2fHZqc9 z3VLT?>yt6-|LxnicRPwEX0V)8T%CF-jd>TNhg2X#+gT620@lo?tdgV4+61Q@YN)$o mdF1iTn6qz|WU+A=Fnr1LnRx4;*ioS47(8A5T-G@yGywprieB3Q literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 1f10d966d5d..07449620642 100755 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -795,4 +795,11 @@ with the same filename but different name <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/> <texture name="NavBar Separator" file_name="navbar/separator.png"/> + <texture name="Notification_Condense" file_name="icons/Icon_Notification_Condense.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="Notification_Expand" file_name="icons/Icon_Notification_Expand.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="Icon_Group_Small" file_name="icons/Icon_Group_Small.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="Icon_Group_Large" file_name="icons/Icon_Group_Large.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" /> + </textures> diff --git a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml new file mode 100644 index 00000000000..b6277070560 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + legacy_header_height="18" + bevel_style="in" + layout="topleft" + name="floater_notifications_tabbed" + help_topic="notification_chiclet" + save_rect="true" + title="NOTIFICATIONS" + width="350" + min_width="320" + height="550" + can_minimize="false" + can_tear_off="false" + can_resize="true" + can_drag_on_left="false" + can_dock="true" + save_dock_state="true" + save_visibility="true" + single_instance="true" +> + <string + name="title_notification_tabbed_window"> + NOTIFICATIONS TABBED + </string> + <layout_stack width="336" height="550" enabled="true" orientation="vertical" name="TabButtonsStack" follows="left|top|right|bottom"> + <layout_panel width="336" height="550" enabled="true" name="TabButtonsLayoutPanel"> + <tab_container + follows="left|top|right|bottom" + halign="center" + layout="topleft" + tab_position="top" + left="7" + top="24" + width="336" + height="491" + mouse_opaque="true" + name="NotificationsTab"> + <panel + border="true" + bevel_style="none" + follows="left|top|right|bottom" + label="System (2)" + layout="topleft" + name="SystemNotificationsTab"> + </panel> + <panel + border="true" + bevel_style="none" + follows="left|top|right|bottom" + label="Transactions (15)" + layout="topleft" + name="TransactionNotificationsTab"> + </panel> + <panel + border="true" + bevel_style="none" + follows="left|top|right|bottom" + label="Invites (2)" + layout="topleft" + name="InviteNotificationsTab"> + <flat_list_view + color="FloaterDefaultBackgroundColor" + follows="all" + layout="topleft" + name="notification_list" + left="0" + top="5" + height="0" + width="330"/> + </panel> + </tab_container> + + <layout_stack width="336" height="26" enabled="true" orientation="horizontal" follows="left|right" name="ButtonsStack"> + <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="CondenseAllButtonPanel"> + <button width="93" height="21" left="2" label="Condense All" name="CondenseAllButton"> + </button> + </layout_panel> + <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="GapLayoutPanel"> + <panel width="90" height="21" left="2" label="Condense All" border="false" name="GapPanel"> + </panel> + </layout_panel> + <layout_panel width="336" height="30" enabled="true" orientation="horizontal" name="DeleteAllButtonPanel"> + <button width="93" height="21" left="2" label="Delete All" name="DeleteAllButton"> + </button> + </layout_panel> + </layout_stack> + </layout_panel> + </layout_stack> + </floater> + +<!-- +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + legacy_header_height="18" + bevel_style="in" + layout="topleft" + name="notifications_tabbed_window" + help_topic="notification_chiclet" + save_rect="true" + title="NOTIFICATIONS" + width="320" + min_width="320" + height="23" + can_minimize="false" + can_tear_off="false" + can_resize="true" + can_drag_on_left="false" + can_dock="true" + save_dock_state="true" + save_visibility="true" + single_instance="true" +> + <string + name="title_im_well_window"> + CONVERSATIONS + </string> + <string + name="title_notification_well_window"> + NOTIFICATIONS1 + </string> + + <flat_list_view + color="FloaterDefaultBackgroundColor" + follows="all" + layout="topleft" + name="notification_list" + left="1" + top="20" + height="0" + width="318"/> +</floater> +--> + diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml index 51779e4bfd2..3ad0f04469b 100755 --- a/indra/newview/skins/default/xui/en/language_settings.xml +++ b/indra/newview/skins/default/xui/en/language_settings.xml @@ -50,7 +50,7 @@ <string name="LTimeSec">second,datetime,local</string> <string name="LTimeHour">hour,datetime,local</string> <string name="LTimeMin">min,datetime,local</string> - <string name="LTimeYear">year,datetime,local</string> + <string name="LTimeYear">year,datetime,local</string> <string name="UTCTimeWeek">weekday,datetime,utc</string> <string name="UTCTimeDay">day,datetime,utc</string> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index e91eea04d13..0d9612990d6 100755 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -303,7 +303,7 @@ <menu_item_call label="Show Notifications Console" name="Show Notifications Console" - visible="false" + visible="true" shortcut="control|shift|5"> <on_click function="Floater.Toggle" diff --git a/indra/newview/skins/default/xui/en/panel_notification_tabbed_item.xml b/indra/newview/skins/default/xui/en/panel_notification_tabbed_item.xml new file mode 100644 index 00000000000..bc4f90858b6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_notification_tabbed_item.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- All our XML is utf-8 encoded. --> +<panel + translate="false" + name="sys_well_item" + title="sys_well_item" + visible="true" + top="0" + left="0" + width="331" + height="50" + can_resize="false" + layout="topleft" + follows="left|right" + background_opaque="false" + background_visible="true" + bg_alpha_color="SysWellItemUnselected" > + + <panel border="true" top="0" left="3" width="327" height="44" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="GroupNameNoticeTitlePanel"> + <layout_stack top="0" left="0" width="325" height="50" orientation="horizontal" follows="left|top|right|bottom" name="HorizontalStack"> + <layout_panel width="30" height="22" orientation="horizontal" follows="left|top|right|bottom" name="LayoutPanel"> + <group_icon left="5" top="6" width="25" height="25" mouse_opaque="true" name="group_icon_small" tool_tip="Group" default_icon_name="Generic_Group"/> + </layout_panel> + <layout_panel width="260" height="50" orientation="horizontal" follows="left|top|right|bottom" name="LayoutPanel"> + <panel border="false" top="0" width="260" height="38" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="MainInfoBlockPanel"> + <panel border="false" top="0" left="0" width="260" height="19" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="GroupNameNoticeTitlePanel"> + <text allow_scroll="false" font="SansSerifLarge" top="2" left="0" width="267" height="17" layout="topleft" follows="right|left" text_color="White" + use_ellipses="true" word_wrap="true" mouse_opaque="false" name="GroupName_NoticeTitle" > + Group Name:Notice Title + </text> + <icon top="0" right="-1" width="21" height="21" image_name="Icon_Attachment_Small" follows="right" mouse_opaque="true" name="icon_attachment_small" tool_tip="Attachment"/> + </panel> + <panel border="false" top="23" left="0" width="260" bevel_style="none" follows="left|top|right|bottom" layout="topleft" name="SenderAndTimePanel" height="15"> + <text allow_scroll="false" font="SansSerifSmall" top="0" left="0" width="250" height="13" layout="topleft" follows="right|left" + use_ellipses="true" word_wrap="true" mouse_opaque="false" name="Sender_Resident" > + Sender.Resident + </text> + <text allow_scroll="false" font="SansSerifSmall" top="0" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5" + name="Time_Box" right="-5" value="2014/12/24 23:30" /> + </panel> + </panel> + </layout_panel> + <layout_panel name="LayoutPanel3" width="18" height="39" orientation="horizontal" follows="left|top|right|bottom"> + <panel name="CloseExpandButtonsPanel" border="false" top="0" left="0" width="17" height="39" bevel_style="none" follows="left|top|right|bottom" layout="topleft"> + <button top="0" left="0" width="17" height="17" layout="topleft" follows="top" name="close_btn" mouse_opaque="true" + tab_stop="false" image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press" /> + <button top="22" left="0" width="17" height="17" layout="topleft" follows="top" name="expand_btn" mouse_opaque="true" + tab_stop="false" image_unselected="Notification_Expand" image_selected="Notification_Expand" /> + </panel> + </layout_panel> + </layout_stack> + </panel> +</panel> -- GitLab