123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- /**
- * @file llscrollingpanellist.cpp
- * @brief
- *
- * $LicenseInfo:firstyear=2006&license=viewergpl$
- *
- * Copyright (c) 2006-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 "linden_common.h"
- #include "llstl.h"
- #include "llscrollingpanellist.h"
- static const std::string LL_SCROLLING_PANEL_LIST_TAG = "scrolling_panel_list";
- static LLRegisterWidget<LLScrollingPanelList> r19(LL_SCROLLING_PANEL_LIST_TAG);
- /////////////////////////////////////////////////////////////////////
- // LLScrollingPanelList
- // This could probably be integrated with LLScrollContainer -SJB
- void LLScrollingPanelList::clearPanels()
- {
- deleteAllChildren();
- mPanelList.clear();
- reshape(1, 1, false);
- }
- void LLScrollingPanelList::addPanel(LLScrollingPanel* panel)
- {
- addChildAtEnd(panel);
- mPanelList.push_front(panel);
- constexpr S32 GAP_BETWEEN_PANELS = 6;
- // Resize this view
- S32 total_height = 0;
- S32 max_width = 0;
- S32 cur_gap = 0;
- for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin(),
- end = mPanelList.end();
- iter != end; ++iter)
- {
- LLScrollingPanel* childp = *iter;
- total_height += childp->getRect().getHeight() + cur_gap;
- max_width = llmax(max_width, childp->getRect().getWidth());
- cur_gap = GAP_BETWEEN_PANELS;
- }
- reshape(max_width, total_height, false);
- // Reposition each of the child views
- S32 cur_y = total_height;
- for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin(),
- end = mPanelList.end();
- iter != end; ++iter)
- {
- LLScrollingPanel* childp = *iter;
- cur_y -= childp->getRect().getHeight();
- childp->translate(-childp->getRect().mLeft,
- cur_y - childp->getRect().mBottom);
- cur_y -= GAP_BETWEEN_PANELS;
- }
- }
- void LLScrollingPanelList::updatePanels(bool allow_modify)
- {
- for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin(),
- end = mPanelList.end();
- iter != end; ++iter)
- {
- LLScrollingPanel* childp = *iter;
- childp->updatePanel(allow_modify);
- }
- }
- void LLScrollingPanelList::updatePanelVisiblilty()
- {
- // Determine visibility of children.
- S32 BORDER_WIDTH = 2; // HACK
- LLRect parent_local_rect = getParent()->getRect();
- parent_local_rect.stretch(-BORDER_WIDTH);
- LLRect parent_screen_rect;
- getParent()->localPointToScreen(BORDER_WIDTH, 0, &parent_screen_rect.mLeft,
- &parent_screen_rect.mBottom);
- getParent()->localPointToScreen(parent_local_rect.getWidth() - BORDER_WIDTH,
- parent_local_rect.getHeight() - BORDER_WIDTH,
- &parent_screen_rect.mRight,
- &parent_screen_rect.mTop);
- for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin(),
- end = mPanelList.end();
- iter != end; ++iter)
- {
- LLScrollingPanel* childp = *iter;
- const LLRect& local_rect = childp->getRect();
- LLRect screen_rect;
- childp->localPointToScreen(0, 0, &screen_rect.mLeft,
- &screen_rect.mBottom);
- childp->localPointToScreen(local_rect.getWidth(),
- local_rect.getHeight(),
- &screen_rect.mRight, &screen_rect.mTop);
- bool intersects = screen_rect.mRight > parent_screen_rect.mLeft &&
- screen_rect.mLeft < parent_screen_rect.mRight &&
- screen_rect.mTop > parent_screen_rect.mBottom &&
- screen_rect.mBottom < parent_screen_rect.mTop;
- childp->setVisible(intersects);
- }
- }
- void LLScrollingPanelList::draw()
- {
- updatePanelVisiblilty();
- LLUICtrl::draw();
- }
- //virtual
- const std::string& LLScrollingPanelList::getTag() const
- {
- return LL_SCROLLING_PANEL_LIST_TAG;
- }
- //virtual
- LLXMLNodePtr LLScrollingPanelList::getXML(bool save_children) const
- {
- LLXMLNodePtr node = LLUICtrl::getXML();
- node->setName(LL_SCROLLING_PANEL_LIST_TAG);
- return node;
- }
- //static
- LLView* LLScrollingPanelList::fromXML(LLXMLNodePtr node, LLView* parent,
- LLUICtrlFactory* factory)
- {
- std::string name = LL_SCROLLING_PANEL_LIST_TAG;
- node->getAttributeString("name", name);
- LLRect rect;
- createRect(node, rect, parent, LLRect());
- LLScrollingPanelList* scrolling_panel_list = new LLScrollingPanelList(name,
- rect);
- scrolling_panel_list->initFromXML(node, parent);
- return scrolling_panel_list;
- }
|