summaryrefslogtreecommitdiff
path: root/indra/llui/llsliderctrl.h
blob: 4a1574d502110352a5fff000bd8f4d3425c48a86 (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
150
151
152
153
154
155
156
157
158
/** 
 * @file llsliderctrl.h
 * @brief Decorated wrapper for a LLSlider.
 *
 * $LicenseInfo:firstyear=2002&license=viewergpl$
 * 
 * Copyright (c) 2002-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_LLSLIDERCTRL_H
#define LL_LLSLIDERCTRL_H

#include "lluictrl.h"
#include "v4color.h"
#include "llslider.h"
#include "lltextbox.h"
#include "llrect.h"
#include "lllineeditor.h"


class LLSliderCtrl : public LLF32UICtrl
{
public:
	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
	{
		Optional<S32>			label_width;
		Optional<S32>			text_width;
		Optional<bool>			show_text;
		Optional<bool>			can_edit_text;
		Optional<bool>			is_volume_slider;
		Optional<S32>			decimal_digits;

		Optional<LLUIColor>		text_color,
								text_disabled_color;

		Optional<CommitCallbackParam>	mouse_down_callback,
										mouse_up_callback;

		Optional<LLSlider::Params>		slider_bar;
		Optional<LLLineEditor::Params>	value_editor;
		Optional<LLTextBox::Params>		value_text;
		Optional<LLTextBox::Params>		slider_label;

		Params()
		:	text_width("text_width"),
			label_width("label_width"),
			show_text("show_text"),
			can_edit_text("can_edit_text"),
			is_volume_slider("volume"),
			decimal_digits("decimal_digits", 3),
			text_color("text_color"),
			text_disabled_color("text_disabled_color"),
			slider_bar("slider_bar"),
			value_editor("value_editor"),
			value_text("value_text"),
			slider_label("slider_label"),
			mouse_down_callback("mouse_down_callback"),
			mouse_up_callback("mouse_up_callback")
		{}
	};
protected:
	LLSliderCtrl(const Params&);
	friend class LLUICtrlFactory;
public:
	virtual ~LLSliderCtrl() {} // Children all cleaned up by default view destructor.

	/*virtual*/ F32	getValueF32() const { return mSlider->getValueF32(); }
	void			setValue(F32 v, BOOL from_event = FALSE);

	/*virtual*/ void	setValue(const LLSD& value)	{ setValue((F32)value.asReal(), TRUE); }
	/*virtual*/ LLSD	getValue() const			{ return LLSD(getValueF32()); }
	/*virtual*/ BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text );

	BOOL			isMouseHeldDown() const { return mSlider->hasMouseCapture(); }

	virtual void	setPrecision(S32 precision);

	/*virtual*/ void    setEnabled( BOOL b );
	/*virtual*/ void	clear();

	/*virtual*/ void	setMinValue(const LLSD& min_value)  { setMinValue((F32)min_value.asReal()); }
	/*virtual*/ void	setMaxValue(const LLSD& max_value)  { setMaxValue((F32)max_value.asReal()); }
	/*virtual*/ void	setMinValue(F32 min_value)  { mSlider->setMinValue(min_value); updateText(); }
	/*virtual*/ void	setMaxValue(F32 max_value)  { mSlider->setMaxValue(max_value); updateText(); }
	/*virtual*/ void	setIncrement(F32 increment) { mSlider->setIncrement(increment);}

	F32				getMinValue() const { return mSlider->getMinValue(); }
	F32				getMaxValue() const { return mSlider->getMaxValue(); }

	void			setLabel(const LLStringExplicit& label)		{ if (mLabelBox) mLabelBox->setText(label); }
	void			setLabelColor(const LLColor4& c)			{ mTextEnabledColor = c; }
	void			setDisabledLabelColor(const LLColor4& c)	{ mTextDisabledColor = c; }

	boost::signals2::connection setSliderMouseDownCallback(	const commit_signal_t::slot_type& cb );
	boost::signals2::connection setSliderMouseUpCallback( const commit_signal_t::slot_type& cb );

	/*virtual*/ void	onTabInto();

	/*virtual*/ void	setTentative(BOOL b);			// marks value as tentative
	/*virtual*/ void	onCommit();						// mark not tentative, then commit

	/*virtual*/ void	setControlName(const std::string& control_name, LLView* context)
	{
		LLUICtrl::setControlName(control_name, context);
		mSlider->setControlName(control_name, context);
	}

	static void		onSliderCommit(LLUICtrl* caller, const LLSD& userdata);
	
	static void		onEditorCommit(LLUICtrl* ctrl, const LLSD& userdata);
	static void		onEditorGainFocus(LLFocusableElement* caller, void *userdata);
	static void		onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata);

private:
	void			updateText();
	void			reportInvalidData();

	const LLFontGL*	mFont;
	BOOL			mShowText;
	BOOL			mCanEditText;
	
	S32				mPrecision;
	LLTextBox*		mLabelBox;
	S32				mLabelWidth;
	
	F32				mValue;
	LLSlider*		mSlider;
	class LLLineEditor*	mEditor;
	LLTextBox*		mTextBox;

	LLUIColor	mTextEnabledColor;
	LLUIColor	mTextDisabledColor;
};

#endif  // LL_LLSLIDERCTRL_H