diff options
Diffstat (limited to 'indra/newview/llsyswellwindow.cpp')
-rw-r--r-- | indra/newview/llsyswellwindow.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp new file mode 100644 index 0000000000..c8eea5e7b4 --- /dev/null +++ b/indra/newview/llsyswellwindow.cpp @@ -0,0 +1,210 @@ +/** + * @file llsyswellwindow.cpp + * @brief // TODO + * $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 "llsyswellwindow.h" + +#include "llbottomtray.h" +#include "llviewercontrol.h" + + +//--------------------------------------------------------------------------------- +LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLFloater(LLSD()), + mChannel(NULL), + mScrollContainer(NULL), + mNotificationList(NULL) +{ + // Ho to use: + // LLFloaterReg::showInstance("syswell_window"); + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_sys_well.xml", NULL); +} + +//--------------------------------------------------------------------------------- +BOOL LLSysWellWindow::postBuild() +{ + mCloseBtn = getChild<LLButton>("close_btn"); + mScrollContainer = getChild<LLScrollContainer>("notification_list_container"); + mNotificationList = getChild<LLScrollingPanelList>("notification_list"); + + mCloseBtn->setClickedCallback(boost::bind(&LLSysWellWindow::onClickCloseBtn,this)); + + return TRUE; +} + +//--------------------------------------------------------------------------------- +LLSysWellWindow::~LLSysWellWindow() +{ +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::addItem(LLSysWellItem::Params p) +{ + // do not add clones + if( findItemByID(p.notification_id) >= 0 ) + return; + + LLSysWellItem* new_item = new LLSysWellItem(p); + mNotificationList->addPanel(dynamic_cast<LLScrollingPanel*>(new_item)); + reshapeWindow(); + adjustWindowPosition(); + + new_item->setOnItemCloseCallback(boost::bind(&LLSysWellWindow::onItemClose, this, _1)); + new_item->setOnItemClickCallback(boost::bind(&LLSysWellWindow::onItemClick, this, _1)); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::clear() +{ + // *TODO: fill later +} + +//--------------------------------------------------------------------------------- +S32 LLSysWellWindow::findItemByID(const LLUUID& id) +{ + const LLScrollingPanelList::panel_list_t list = mNotificationList->getPanelList(); + if(list.size() == 0) + return -1; + + LLScrollingPanelList::panel_list_t::const_iterator it = list.begin(); + S32 index = 0; + while(it != list.end()) + { + if( dynamic_cast<LLSysWellItem*>(*it)->getID() == id ) + break; + ++it; + ++index; + } + + if(it == list.end()) + return -1; + else + return index; + +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::removeItemByID(const LLUUID& id) +{ + S32 index = findItemByID(id); + + if(index >= 0) + mNotificationList->removePanel(index); + else + return; + + reshapeWindow(); + adjustWindowPosition(); + // hide chiclet window if there are no items left + S32 items_left = mNotificationList->getPanelList().size(); + if(items_left == 0) + setVisible(FALSE); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::onItemClick(LLSysWellItem* item) +{ + LLUUID id = item->getID(); + mChannel->loadStoredToastByIDToChannel(id); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::onItemClose(LLSysWellItem* item) +{ + LLUUID id = item->getID(); + removeItemByID(id); + mChannel->killToastByNotificationID(id); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::onClickCloseBtn() +{ + setVisible(false); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::setVisible(BOOL visible) +{ + // on Show adjust position of SysWell chiclet's window + if(visible) + { + mChannel->removeAndStoreAllVisibleToasts(); + adjustWindowPosition(); + } + + LLFloater::setVisible(visible); +} + +//--------------------------------------------------------------------------------- +void LLSysWellWindow::adjustWindowPosition() +{ + const S32 WINDOW_MARGIN = 5; + + LLRect btm_rect = LLBottomTray::getInstance()->getRect(); + LLRect this_rect = getRect(); + setOrigin(btm_rect.mRight - this_rect.getWidth() - WINDOW_MARGIN, WINDOW_MARGIN); +} +//--------------------------------------------------------------------------------- +void LLSysWellWindow::reshapeWindow() +{ + // Get scrollbar size + const LLUICachedControl<S32> SCROLLBAR_SIZE("UIScrollbarSize", 0); + + // Get item list + const LLScrollingPanelList::panel_list_t list = mNotificationList->getPanelList(); + + // window's size constants + const S32 WINDOW_HEADER_HEIGHT = 30; + const S32 MAX_WINDOW_HEIGHT = 200; + const S32 MIN_WINDOW_WIDTH = 320; + + // Get height and border's width for a scrolling panel list + S32 list_height = mNotificationList->getRect().getHeight(); + S32 list_border_width = mScrollContainer->getBorderWidth() * 2; + + // Check that the floater doesn't exceed its parent view limits after reshape + S32 new_height = list_height + WINDOW_HEADER_HEIGHT + list_border_width; + + if(new_height > MAX_WINDOW_HEIGHT) + { + reshape(MIN_WINDOW_WIDTH + SCROLLBAR_SIZE, MAX_WINDOW_HEIGHT, FALSE); + } + else + { + reshape(MIN_WINDOW_WIDTH, new_height, FALSE); + } +} + +//--------------------------------------------------------------------------------- + + + |