diff options
Diffstat (limited to 'indra/newview/llscreenchannel.cpp')
-rw-r--r-- | indra/newview/llscreenchannel.cpp | 103 |
1 files changed, 74 insertions, 29 deletions
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index de1da248c1..5c923a0409 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -2,31 +2,25 @@ * @file llscreenchannel.cpp * @brief Class implements a channel on a screen in which appropriate toasts may appear. * - * $LicenseInfo:firstyear=2000&license=viewergpl$ - * - * Copyright (c) 2000-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * 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 + * Copyright (C) 2010, Linden Research, Inc. * - * 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 + * 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. * - * 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. + * 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. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * 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$ */ @@ -47,6 +41,7 @@ #include "llsyswellwindow.h" #include "llimfloater.h" #include "llscriptfloater.h" +#include "llsidetray.h" #include <algorithm> @@ -58,6 +53,7 @@ bool LLScreenChannel::mWasStartUpToastShown = false; ////////////////////// // LLScreenChannelBase ////////////////////// + LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) : mToastAlignment(NA_BOTTOM) ,mCanStoreToasts(true) @@ -68,6 +64,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) : { mID = id; mWorldViewRectConnection = gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLScreenChannelBase::updatePositionAndSize, this, _1, _2)); + setMouseOpaque( false ); setVisible(FALSE); } @@ -86,11 +83,30 @@ bool LLScreenChannelBase::isHovering() return mHoveredToast->isHovered(); } +bool LLScreenChannelBase::resetPositionAndSize(const LLSD& newvalue) +{ + LLRect rc = gViewerWindow->getWorldViewRectScaled(); + updatePositionAndSize(rc, rc); + return true; +} + void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) { - S32 top_delta = old_world_rect.mTop - new_world_rect.mTop; - S32 right_delta = old_world_rect.mRight - new_world_rect.mRight; + /* + take sidetray into account - screenchannel should not overlap sidetray + */ + S32 world_rect_padding = 0; + if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE + && LLSideTray::instanceCreated ()) + { + LLSideTray* side_bar = LLSideTray::getInstance(); + + if (side_bar->getVisible() && !side_bar->getCollapsed()) + world_rect_padding += side_bar->getRect().getWidth(); + } + + S32 top_delta = old_world_rect.mTop - new_world_rect.mTop; LLRect this_rect = getRect(); this_rect.mTop -= top_delta; @@ -99,11 +115,13 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne case CA_LEFT : break; case CA_CENTRE : - this_rect.setCenterAndSize(new_world_rect.getWidth() / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight()); + this_rect.setCenterAndSize( (new_world_rect.getWidth() - world_rect_padding) / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight()); break; case CA_RIGHT : - this_rect.mLeft -= right_delta; - this_rect.mRight -= right_delta; + this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(), + this_rect.mTop, + this_rect.getWidth(), + this_rect.getHeight()); } setRect(this_rect); redrawToasts(); @@ -112,6 +130,12 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne void LLScreenChannelBase::init(S32 channel_left, S32 channel_right) { + if(LLSideTray::instanceCreated()) + { + LLSideTray* side_bar = LLSideTray::getInstance(); + side_bar->getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this, _2)); + } + S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight(); S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); @@ -173,7 +197,20 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher) //-------------------------------------------------------------------------- void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect) { - S32 right_delta = old_world_rect.mRight - new_world_rect.mRight; + /* + take sidetray into account - screenchannel should not overlap sidetray + */ + S32 world_rect_padding = 0; + if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE + && LLSideTray::instanceCreated ()) + { + LLSideTray* side_bar = LLSideTray::getInstance(); + + if (side_bar->getVisible() && !side_bar->getCollapsed()) + world_rect_padding += side_bar->getRect().getWidth(); + } + + LLRect this_rect = getRect(); switch(mChannelAlignment) @@ -186,8 +223,10 @@ void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_wo return; case CA_RIGHT : this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio()); - this_rect.mLeft -= right_delta; - this_rect.mRight -= right_delta; + this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(), + this_rect.mTop, + this_rect.getWidth(), + this_rect.getHeight()); } setRect(this_rect); redrawToasts(); @@ -252,6 +291,12 @@ void LLScreenChannel::onToastDestroyed(LLToast* toast) { mStoredToastList.erase(it); } + + // if destroyed toast is hovered - reset hovered + if (mHoveredToast == toast) + { + mHoveredToast = NULL; + } } |