summaryrefslogtreecommitdiff
path: root/indra/llui/lltooltip.h
blob: 6715da161155637a19137fc4f688dcebf21a9a55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/** 
 * @file lltooltip.h
 * @brief LLToolTipMgr class definition and related classes
 *
 * $LicenseInfo:firstyear=2001&license=viewergpl$
 * 
 * Copyright (c) 2001-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_LLTOOLTIP_H
#define LL_LLTOOLTIP_H

// Library includes
#include "llsingleton.h"
#include "llinitparam.h"
#include "llpanel.h"

//
// Classes
//
class LLToolTipView : public LLView
{
public:
	struct Params : public LLInitParam::Block<Params, LLView::Params>
	{
		Params();
	};
	LLToolTipView(const LLToolTipView::Params&);
	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
	/*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
	/*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );

	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);

	void drawStickyRect();

	/*virtual*/ void draw();
};

class LLToolTip : public LLPanel
{
public:
	struct Params : public LLInitParam::Block<Params, LLPanel::Params> 
	{
		typedef boost::function<void(void)> click_callback_t;

		Mandatory<std::string>		message;

		Optional<LLCoordGL>			pos;
		Optional<F32>				delay_time,
									visible_time_over,  // time for which tooltip is visible while mouse on it
									visible_time_near,	// time for which tooltip is visible while mouse near it
									visible_time_far;	// time for which tooltip is visible while mouse moved away
		Optional<LLRect>			sticky_rect;
		Optional<const LLFontGL*>	font;

		Optional<click_callback_t>	click_callback;
		Optional<LLUIImage*>		image;
		Optional<S32>				max_width;
		Optional<S32>				padding;

		Params();
	};
	/*virtual*/ void draw();
	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);

	/*virtual*/ void setValue(const LLSD& value);
	/*virtual*/ void setVisible(BOOL visible);

	bool isFading();
	F32 getVisibleTime();
	bool hasClickCallback();

	LLToolTip(const Params& p);

private:
	class LLTextBox*	mTextBox;
	LLFrameTimer	mFadeTimer;
	LLFrameTimer	mVisibleTimer;
	S32				mMaxWidth;
	bool			mHasClickCallback;
	S32				mPadding;	// pixels
};


class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
{
	LOG_CLASS(LLToolTipMgr);
public:
	LLToolTipMgr();
	void show(const LLToolTip::Params& params);
	void show(const std::string& message);

	void unblockToolTips();
	void blockToolTips();

	void hideToolTips();
	bool toolTipVisible();
	LLRect getToolTipRect();
	LLRect getMouseNearRect();
	void updateToolTipVisibility();

private:
	void createToolTip(const LLToolTip::Params& params);

	bool				mToolTipsBlocked;
	class LLToolTip*	mToolTip;

	// tooltip creation is deferred until the UI is drawn every frame
	// so the last tooltip to be created in a given frame will win
	LLToolTip::Params	mLastToolTipParams;	// description of last tooltip we showed
	LLToolTip::Params	mNextToolTipParams; // description of next tooltip we want to show
	bool				mNeedsToolTip;		// do we want to show a tooltip

	LLRect				mMouseNearRect;
};

//
// Globals
//

extern LLToolTipView *gToolTipView;

#endif