summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llhints.cpp250
-rw-r--r--indra/newview/llhints.h51
2 files changed, 301 insertions, 0 deletions
diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp
new file mode 100644
index 0000000000..a8c3183301
--- /dev/null
+++ b/indra/newview/llhints.cpp
@@ -0,0 +1,250 @@
+/**
+ * @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>();
+ }
+}
diff --git a/indra/newview/llhints.h b/indra/newview/llhints.h
new file mode 100644
index 0000000000..b5255db95b
--- /dev/null
+++ b/indra/newview/llhints.h
@@ -0,0 +1,51 @@
+/**
+ * @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