Skip to content
Snippets Groups Projects
Commit e16c1f6f authored by Richard Nelson's avatar Richard Nelson
Browse files

forgot some files

parent be50a053
No related branches found
No related tags found
No related merge requests found
/**
* @file llhints.cpp
* @brief Hint popups for displaying context sensitive help in a UI overlay
*
* $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 "llhints.h"
#include "llbutton.h"
#include "lltextbox.h"
#include "llviewerwindow.h"
#include "llsdparam.h"
class LLHintPopup : public LLPanel
{
public:
typedef enum e_popup_direction
{
LEFT,
TOP,
RIGHT,
BOTTOM
} EPopupDirection;
struct PopupDirections : public LLInitParam::TypeValuesHelper<LLHintPopup::EPopupDirection, PopupDirections>
{
static void declareValues()
{
declare("left", LLHintPopup::LEFT);
declare("right", LLHintPopup::RIGHT);
declare("top", LLHintPopup::TOP);
declare("bottom", LLHintPopup::BOTTOM);
}
};
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
Mandatory<LLNotificationPtr> notification;
Optional<std::string> target;
Optional<EPopupDirection, PopupDirections> direction;
Optional<S32> distance;
Optional<LLUIImage*> left_arrow,
up_arrow,
right_arrow,
down_arrow;
Params()
: direction("direction", TOP),
distance("distance", 24),
target("target"),
left_arrow("left_arrow", LLUI::getUIImage("hint_arrow_left")),
up_arrow("up_arrow", LLUI::getUIImage("hint_arrow_up")),
right_arrow("right_arrow", LLUI::getUIImage("hint_arrow_right")),
down_arrow("down_arrow", LLUI::getUIImage("hint_arrow_down"))
{}
};
LLHintPopup(const Params&);
void setHintTarget(LLHandle<LLView> target) { mTarget = target; }
/*virtual*/ BOOL postBuild();
void onClickClose() { hide(); }
void draw();
void hide() { die(); }
private:
LLNotificationPtr mNotification;
LLHandle<LLView> mTarget;
EPopupDirection mDirection;
S32 mDistance;
LLUIImagePtr mArrowLeft,
mArrowUp,
mArrowRight,
mArrowDown;
};
LLHintPopup::LLHintPopup(const LLHintPopup::Params& p)
: mNotification(p.notification),
mDirection(p.direction),
mDistance(p.distance),
mTarget(LLHints::getHintTarget(p.target)),
mArrowLeft(p.left_arrow),
mArrowUp(p.up_arrow),
mArrowRight(p.right_arrow),
mArrowDown(p.down_arrow),
LLPanel(p)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_hint.xml");
}
BOOL LLHintPopup::postBuild()
{
LLTextBox& hint_text = getChildRef<LLTextBox>("hint_text");
hint_text.setText(mNotification->getMessage());
getChild<LLButton>("close")->setClickedCallback(boost::bind(&LLHintPopup::onClickClose, this));
getChild<LLTextBox>("hint_title")->setText(mNotification->getLabel());
LLRect text_bounds = hint_text.getTextBoundingRect();
S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight();
reshape(getRect().getWidth(), getRect().getHeight() + delta_height);
return TRUE;
}
void LLHintPopup::draw()
{
LLView* targetp = mTarget.get();
if (!targetp || !targetp->isInVisibleChain())
{
hide();
}
else
{
LLRect target_rect;
targetp->localRectToOtherView(targetp->getLocalRect(), &target_rect, getParent());
LLRect my_local_rect = getLocalRect();
LLRect my_rect = getRect();
LLRect arrow_rect;
LLUIImagePtr arrow_imagep;
const S32 OVERLAP = 5;
switch(mDirection)
{
case LEFT:
my_rect.setCenterAndSize( target_rect.mLeft - (my_rect.getWidth() / 2 + mDistance),
target_rect.getCenterY(),
my_rect.getWidth(),
my_rect.getHeight());
arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 - OVERLAP,
my_local_rect.getCenterY(),
mArrowRight->getWidth(),
mArrowRight->getHeight());
arrow_imagep = mArrowRight;
break;
case TOP:
my_rect.setCenterAndSize( target_rect.getCenterX(),
target_rect.mTop + (my_rect.getHeight() / 2 + mDistance),
my_rect.getWidth(),
my_rect.getHeight());
arrow_rect.setCenterAndSize(my_local_rect.getCenterX(),
my_local_rect.mBottom - mArrowDown->getHeight() / 2 + OVERLAP,
mArrowDown->getWidth(),
mArrowDown->getHeight());
arrow_imagep = mArrowDown;
break;
case RIGHT:
my_rect.setCenterAndSize( target_rect.getCenterX(),
target_rect.mTop - (my_rect.getHeight() / 2 + mDistance),
my_rect.getWidth(),
my_rect.getHeight());
arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + OVERLAP,
my_local_rect.getCenterY(),
mArrowLeft->getWidth(),
mArrowLeft->getHeight());
arrow_imagep = mArrowLeft;
break;
case BOTTOM:
my_rect.setCenterAndSize( target_rect.mLeft + (my_rect.getWidth() / 2 + mDistance),
target_rect.getCenterY(),
my_rect.getWidth(),
my_rect.getHeight());
arrow_rect.setCenterAndSize(my_local_rect.getCenterX(),
my_local_rect.mTop + mArrowUp->getHeight() / 2 - OVERLAP,
mArrowUp->getWidth(),
mArrowUp->getHeight());
arrow_imagep = mArrowUp;
break;
}
setShape(my_rect);
LLPanel::draw();
arrow_imagep->draw(arrow_rect);
}
}
LLRegistry<std::string, LLHandle<LLView> > LLHints::sTargetRegistry;
//static
void LLHints::show(LLNotificationPtr hint)
{
LLHintPopup::Params p;
LLParamSDParser::instance().readSD(hint->getPayload(), p);
p.notification = hint;
LLHintPopup* popup = new LLHintPopup(p);
LLView* hint_holder = gViewerWindow->getHintHolder();
if (hint_holder)
{
hint_holder->addChild(popup);
popup->centerWithin(hint_holder->getLocalRect());
}
}
//static
void LLHints::registerHintTarget(const std::string& name, LLHandle<LLView> target)
{
sTargetRegistry.defaultRegistrar().add(name, target);
}
//static
LLHandle<LLView> LLHints::getHintTarget(const std::string& name)
{
LLHandle<LLView>* handlep = sTargetRegistry.getValue(name);
if (handlep)
{
return *handlep;
}
else
{
return LLHandle<LLView>();
}
}
/**
* @file llhints.h
* @brief Hint popups for displaying context sensitive help in a UI overlay
*
* $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$
*/
#ifndef LL_LLHINTS_H
#define LL_LLHINTS_H
#include "llpanel.h"
#include "llnotifications.h"
class LLHints
{
public:
static void show(LLNotificationPtr hint);
static void registerHintTarget(const std::string& name, LLHandle<LLView> target);
static LLHandle<LLView> getHintTarget(const std::string& name);
private:
static LLRegistry<std::string, LLHandle<LLView> > sTargetRegistry;
};
#endif
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment