aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra')
-rw-r--r--linden/indra/llcommon/llversionviewer.h2
-rw-r--r--linden/indra/llmath/CMakeLists.txt4
-rw-r--r--linden/indra/llmath/llcalc.cpp155
-rw-r--r--linden/indra/llmath/llcalc.h85
-rw-r--r--linden/indra/llmath/llcalcparser.cpp45
-rw-r--r--linden/indra/llmath/llcalcparser.h155
-rw-r--r--linden/indra/llui/lllineeditor.cpp33
-rw-r--r--linden/indra/llui/lllineeditor.h4
-rw-r--r--linden/indra/llui/llspinctrl.cpp17
-rw-r--r--linden/indra/newview/app_settings/settings.xml13
-rw-r--r--linden/indra/newview/llappviewer.cpp3
-rw-r--r--linden/indra/newview/llpanelface.cpp31
-rw-r--r--linden/indra/newview/llpanelface.h1
-rw-r--r--linden/indra/newview/llpanelobject.cpp61
-rw-r--r--linden/indra/newview/llpanelobject.h1
-rw-r--r--linden/indra/newview/llvieweraudio.cpp84
-rw-r--r--linden/indra/newview/llvieweraudio.h2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/alerts.xml67
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_tools.xml48
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/strings.xml360
20 files changed, 917 insertions, 254 deletions
diff --git a/linden/indra/llcommon/llversionviewer.h b/linden/indra/llcommon/llversionviewer.h
index 4032c5b..4b99b71 100644
--- a/linden/indra/llcommon/llversionviewer.h
+++ b/linden/indra/llcommon/llversionviewer.h
@@ -45,6 +45,6 @@ const char * const IMP_VIEWER_NAME = "Imprudence";
45const S32 IMP_VERSION_MAJOR = 1; 45const S32 IMP_VERSION_MAJOR = 1;
46const S32 IMP_VERSION_MINOR = 1; 46const S32 IMP_VERSION_MINOR = 1;
47const S32 IMP_VERSION_PATCH = 0; 47const S32 IMP_VERSION_PATCH = 0;
48const char * const IMP_VERSION_TEST = "alpha"; 48const char * const IMP_VERSION_TEST = "RC1";
49 49
50#endif 50#endif
diff --git a/linden/indra/llmath/CMakeLists.txt b/linden/indra/llmath/CMakeLists.txt
index 6a329fa..e5ec3e1 100644
--- a/linden/indra/llmath/CMakeLists.txt
+++ b/linden/indra/llmath/CMakeLists.txt
@@ -11,6 +11,8 @@ include_directories(
11 11
12set(llmath_SOURCE_FILES 12set(llmath_SOURCE_FILES
13 llbboxlocal.cpp 13 llbboxlocal.cpp
14 llcalc.cpp
15 llcalcparser.cpp
14 llcamera.cpp 16 llcamera.cpp
15 llcoordframe.cpp 17 llcoordframe.cpp
16 llline.cpp 18 llline.cpp
@@ -40,6 +42,8 @@ set(llmath_HEADER_FILES
40 camera.h 42 camera.h
41 coordframe.h 43 coordframe.h
42 llbboxlocal.h 44 llbboxlocal.h
45 llcalc.h
46 llcalcparser.h
43 llcamera.h 47 llcamera.h
44 llcoord.h 48 llcoord.h
45 llcoordframe.h 49 llcoordframe.h
diff --git a/linden/indra/llmath/llcalc.cpp b/linden/indra/llmath/llcalc.cpp
new file mode 100644
index 0000000..ff3f91f
--- /dev/null
+++ b/linden/indra/llmath/llcalc.cpp
@@ -0,0 +1,155 @@
1/*
2 * LLCalc.cpp
3 * SecondLife
4 *
5 * Created by Aimee Walton on 28/09/2008.
6 * Copyright 2008 Aimee Walton.
7 *
8 */
9
10#include "linden_common.h"
11
12#include "llcalc.h"
13
14#include <boost/spirit/core.hpp>
15#include <boost/spirit/error_handling.hpp>
16
17#include "llcalcparser.h"
18#include "llmath.h"
19
20
21// Variable names for use in the build floater
22const char* LLCalc::X_POS = "XP";
23const char* LLCalc::Y_POS = "YP";
24const char* LLCalc::Z_POS = "ZP";
25const char* LLCalc::X_SCALE = "XS";
26const char* LLCalc::Y_SCALE = "YS";
27const char* LLCalc::Z_SCALE = "ZS";
28const char* LLCalc::X_ROT = "XR";
29const char* LLCalc::Y_ROT = "YR";
30const char* LLCalc::Z_ROT = "ZR";
31const char* LLCalc::HOLLOW = "HLW";
32const char* LLCalc::CUT_BEGIN = "CB";
33const char* LLCalc::CUT_END = "CE";
34const char* LLCalc::PATH_BEGIN = "PB";
35const char* LLCalc::PATH_END = "PE";
36const char* LLCalc::TWIST_BEGIN = "TB";
37const char* LLCalc::TWIST_END = "TE";
38const char* LLCalc::X_SHEAR = "XSH";
39const char* LLCalc::Y_SHEAR = "YSH";
40const char* LLCalc::X_TAPER = "XTP";
41const char* LLCalc::Y_TAPER = "YTP";
42const char* LLCalc::RADIUS_OFFSET = "ROF";
43const char* LLCalc::REVOLUTIONS = "REV";
44const char* LLCalc::SKEW = "SKW";
45const char* LLCalc::X_HOLE = "XHL";
46const char* LLCalc::Y_HOLE = "YHL";
47const char* LLCalc::TEX_U_SCALE = "TSU";
48const char* LLCalc::TEX_V_SCALE = "TSV";
49const char* LLCalc::TEX_U_OFFSET = "TOU";
50const char* LLCalc::TEX_V_OFFSET = "TOV";
51const char* LLCalc::TEX_ROTATION = "TROT";
52const char* LLCalc::TEX_TRANSPARENCY = "TRNS";
53const char* LLCalc::TEX_GLOW = "GLOW";
54
55
56LLCalc* LLCalc::sInstance = NULL;
57
58LLCalc::LLCalc() : mLastErrorPos(0)
59{
60// mUserVariables = new calc_map_t;
61 mVariables = new calc_map_t;
62 mConstants = new calc_map_t;
63
64 // Init table of constants
65 (*mConstants)["PI"] = F_PI;
66 (*mConstants)["TWO_PI"] = F_TWO_PI;
67 (*mConstants)["PI_BY_TWO"] = F_PI_BY_TWO;
68 (*mConstants)["SQRT2"] = F_SQRT2;
69 (*mConstants)["DEG_TO_RAD"] = DEG_TO_RAD;
70 (*mConstants)["RAD_TO_DEG"] = RAD_TO_DEG;
71 (*mConstants)["GRAVITY"] = GRAVITY;
72}
73
74LLCalc::~LLCalc()
75{
76 delete mConstants;
77 delete mVariables;
78// delete mUserVariables;
79}
80
81//static
82void LLCalc::cleanUp()
83{
84 delete sInstance;
85 sInstance = NULL;
86}
87
88//static
89LLCalc* LLCalc::getInstance()
90{
91 if (!sInstance) sInstance = new LLCalc();
92 return sInstance;
93}
94
95void LLCalc::setVar(const std::string& name, const F32& value)
96{
97 (*mVariables)[name] = value;
98}
99
100void LLCalc::clearVar(const std::string& name)
101{
102 mVariables->erase(name);
103}
104
105void LLCalc::clearAllVariables()
106{
107 mVariables->clear();
108}
109
110/*
111void LLCalc::updateVariables(LLSD& vars)
112{
113 LLSD::map_iterator cIt = vars.beginMap();
114 for(; cIt != vars.endMap(); cIt++)
115 {
116 setVar(cIt->first, (F32)(LLSD::Real)cIt->second);
117 }
118}
119*/
120
121bool LLCalc::evalString(const std::string& expression, F32& result)
122{
123 using namespace boost::spirit;
124
125 std::string expr_upper = expression;
126 LLStringUtil::toUpper(expr_upper);
127
128 LLCalcParser calc(result, mConstants, mVariables);
129
130 mLastErrorPos = 0;
131 std::string::iterator start = expr_upper.begin();
132 parse_info<std::string::iterator> info;
133
134 try
135 {
136 info = parse(start, expr_upper.end(), calc, space_p);
137 lldebugs << "Math expression: " << expression << " = " << result << llendl;
138 }
139 catch(parser_error<std::string, std::string::iterator> &e)
140 {
141 mLastErrorPos = e.where - expr_upper.begin();
142
143 llinfos << "Calc parser exception: " << e.descriptor << " at " << mLastErrorPos << " in expression: " << expression << llendl;
144 return false;
145 }
146
147 if (!info.full)
148 {
149 mLastErrorPos = info.stop - expr_upper.begin();
150 llinfos << "Unhandled syntax error at " << mLastErrorPos << " in expression: " << expression << llendl;
151 return false;
152 }
153
154 return true;
155}
diff --git a/linden/indra/llmath/llcalc.h b/linden/indra/llmath/llcalc.h
new file mode 100644
index 0000000..a376895
--- /dev/null
+++ b/linden/indra/llmath/llcalc.h
@@ -0,0 +1,85 @@
1/*
2 * LLCalc.h
3 * SecondLife
4 *
5 * Created by Aimee Walton on 28/09/2008.
6 * Copyright 2008 Aimee Walton.
7 *
8 */
9
10#ifndef LL_CALC_H
11#define LL_CALC_H
12
13#include <map>
14#include <string>
15
16//#include "llsd.h"
17
18class LLCalc
19{
20public:
21 LLCalc();
22 ~LLCalc();
23
24 // Variable name constants
25 static const char* X_POS;
26 static const char* Y_POS;
27 static const char* Z_POS;
28 static const char* X_SCALE;
29 static const char* Y_SCALE;
30 static const char* Z_SCALE;
31 static const char* X_ROT;
32 static const char* Y_ROT;
33 static const char* Z_ROT;
34 static const char* HOLLOW;
35 static const char* CUT_BEGIN;
36 static const char* CUT_END;
37 static const char* PATH_BEGIN;
38 static const char* PATH_END;
39 static const char* TWIST_BEGIN;
40 static const char* TWIST_END;
41 static const char* X_SHEAR;
42 static const char* Y_SHEAR;
43 static const char* X_TAPER;
44 static const char* Y_TAPER;
45 static const char* RADIUS_OFFSET;
46 static const char* REVOLUTIONS;
47 static const char* SKEW;
48 static const char* X_HOLE;
49 static const char* Y_HOLE;
50 static const char* TEX_U_SCALE;
51 static const char* TEX_V_SCALE;
52 static const char* TEX_U_OFFSET;
53 static const char* TEX_V_OFFSET;
54 static const char* TEX_ROTATION;
55 static const char* TEX_TRANSPARENCY;
56 static const char* TEX_GLOW;
57
58 void setVar(const std::string& name, const F32& value);
59 void clearVar(const std::string& name);
60 void clearAllVariables();
61// void updateVariables(LLSD& vars);
62
63 bool evalString(const std::string& expression, F32& result);
64 std::string::size_type getLastErrorPos() { return mLastErrorPos; }
65
66 static LLCalc* getInstance();
67 static void cleanUp();
68
69 typedef std::map<std::string, F32> calc_map_t;
70
71private:
72 std::string::size_type mLastErrorPos;
73
74 calc_map_t* mConstants;
75 calc_map_t* mVariables;
76
77 // *TODO: Add support for storing user defined variables, and stored functions.
78 // Will need UI work, and a means to save them between sessions.
79// calc_map_t* mUserVariables;
80
81 // "There shall be only one"
82 static LLCalc* sInstance;
83};
84
85#endif // LL_CALC_H
diff --git a/linden/indra/llmath/llcalcparser.cpp b/linden/indra/llmath/llcalcparser.cpp
new file mode 100644
index 0000000..1546c09
--- /dev/null
+++ b/linden/indra/llmath/llcalcparser.cpp
@@ -0,0 +1,45 @@
1/*
2 * LLCalcParser.cpp
3 * SecondLife
4 *
5 * Created by Aimee Walton on 28/09/2008.
6 * Copyright 2008 Aimee Walton.
7 *
8 */
9
10#include "linden_common.h"
11
12#include "llcalcparser.h"
13
14F32 LLCalcParser::lookup(const std::string::iterator& start, const std::string::iterator& end) const
15{
16 LLCalc::calc_map_t::iterator iter;
17
18 std::string name(start, end);
19
20 if (mConstants)
21 {
22 iter = mConstants->find(name);
23 if (iter != mConstants->end())
24 {
25 return (*iter).second;
26 }
27 }
28 else
29 {
30 // This should never happen!
31 boost::spirit::throw_(end, std::string("Missing constants table"));
32 }
33
34 if (mVariables)
35 {
36 iter = mVariables->find(name);
37 if (iter != mVariables->end())
38 {
39 return (*iter).second;
40 }
41 }
42
43 boost::spirit::throw_(end, std::string("Unknown symbol " + name));
44 return 0.f;
45}
diff --git a/linden/indra/llmath/llcalcparser.h b/linden/indra/llmath/llcalcparser.h
new file mode 100644
index 0000000..c405b62
--- /dev/null
+++ b/linden/indra/llmath/llcalcparser.h
@@ -0,0 +1,155 @@
1/*
2 * LLCalcParser.h
3 * SecondLife
4 *
5 * Created by Aimee Walton on 28/09/2008.
6 * Copyright 2008 Aimee Walton.
7 *
8 */
9
10#ifndef LL_CALCPARSER_H
11#define LL_CALCPARSER_H
12
13#include <boost/spirit/attribute.hpp>
14#include <boost/spirit/core.hpp>
15#include <boost/spirit/error_handling.hpp>
16#include <boost/spirit/iterator/position_iterator.hpp>
17#include <boost/spirit/phoenix/binders.hpp>
18//#include <boost/spirit/symbols/symbols.hpp>
19#include <map>
20#include <string>
21
22#include "llcalc.h"
23#include "llmath.h"
24
25struct LLCalcParser : boost::spirit::grammar<LLCalcParser>
26{
27 LLCalcParser(F32& result, LLCalc::calc_map_t* constants, LLCalc::calc_map_t* vars) :
28 mResult(result), mConstants(constants), mVariables(vars) {};
29
30 struct value_closure : boost::spirit::closure<value_closure, F32>
31 {
32 member1 value;
33 };
34
35 template <typename ScannerT>
36 struct definition
37 {
38 // Rule declarations
39 boost::spirit::rule<ScannerT> statement, identifier;
40 boost::spirit::rule<ScannerT, value_closure::context_t> expression, term,
41 power,
42 unary_expr,
43 factor,
44 /*unary_func,
45 /binary_func,*/
46 group;
47
48 // start() should return the starting symbol
49 boost::spirit::rule<ScannerT> const& start() const { return statement; }
50
51 definition(LLCalcParser const& self)
52 {
53 using namespace boost::spirit;
54 using namespace phoenix;
55
56 assertion<std::string> assert_domain("Domain error");
57// assertion<std::string> assert_symbol("Unknown symbol");
58 assertion<std::string> assert_syntax("Syntax error");
59
60 identifier =
61 lexeme_d[(alpha_p | '_') >> *(alnum_p | '_')]
62 ;
63
64 group =
65 '(' >> expression[group.value = arg1] >> assert_syntax(ch_p(')'))
66 ;
67
68 /*unary_func =
69 ((str_p("SIN") >> '(' >> expression[unary_func.value = bind(&sin)(DEG_TO_RAD * arg1)]) |
70 (str_p("COS") >> '(' >> expression[unary_func.value = bind(&cos)(DEG_TO_RAD * arg1)]) |
71 (str_p("TAN") >> '(' >> expression[unary_func.value = bind(&tan)(DEG_TO_RAD * arg1)]) |
72 (str_p("ASIN") >> '(' >> expression[unary_func.value = (bind(&asin)(arg1)) * RAD_TO_DEG]) |
73 (str_p("ACOS") >> '(' >> expression[unary_func.value = bind(&acos)(arg1) * RAD_TO_DEG]) |
74 (str_p("ATAN") >> '(' >> expression[unary_func.value = bind(&atan)(arg1) * RAD_TO_DEG]) |
75 (str_p("SQRT") >> '(' >> expression[unary_func.value = bind(&sqrt)(arg1)]) |
76 (str_p("LOG") >> '(' >> expression[unary_func.value = bind(&log)(arg1)]) |
77 (str_p("EXP") >> '(' >> expression[unary_func.value = bind(&exp)(arg1)]) |
78 (str_p("ABS") >> '(' >> expression[unary_func.value = bind(&fabs)(arg1)])
79 ) >> assert_syntax(ch_p(')'))
80 ;
81
82 binary_func =
83 ((str_p("ATAN2") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
84 expression[binary_func.value = bind(&atan2)(binary_func.value, arg1) * RAD_TO_DEG]) |
85 (str_p("MIN") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
86 expression[binary_func.value = bind(&LLCalcParser::min)(self, binary_func.value, arg1)]) |
87 (str_p("MAX") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
88 expression[binary_func.value = bind(&LLCalcParser::max)(self, binary_func.value, arg1)])
89 ) >> assert_syntax(ch_p(')'))
90 ;*/
91
92 // *TODO: Localisation of the decimal point?
93 // Problem, LLLineEditor::postvalidateFloat accepts a comma when appropriate
94 // for the current locale. However to do that here could clash with using
95 // the comma as a separator when passing arguments to functions.
96 factor =
97 (ureal_p[factor.value = arg1] |
98 group[factor.value = arg1] |
99 /*unary_func[factor.value = arg1] |
100 binary_func[factor.value = arg1] |*/
101 // Lookup throws an Unknown Symbol error if it is unknown, while this works fine,
102 // would be "neater" to handle symbol lookup from here with an assertive parser.
103// constants_p[factor.value = arg1]|
104 identifier[factor.value = bind(&LLCalcParser::lookup)(self, arg1, arg2)]
105 ) >>
106 // Detect and throw math errors.
107 assert_domain(eps_p(bind(&LLCalcParser::checkNaN)(self, factor.value)))
108 ;
109
110 unary_expr =
111 !ch_p('+') >> factor[unary_expr.value = arg1] |
112 '-' >> factor[unary_expr.value = -arg1]
113 ;
114
115 power =
116 unary_expr[power.value = arg1] >>
117 *('^' >> assert_syntax(unary_expr[power.value = bind(&powf)(power.value, arg1)]))
118 ;
119
120 term =
121 power[term.value = arg1] >>
122 *(('*' >> assert_syntax(power[term.value *= arg1])) |
123 ('/' >> assert_syntax(power[term.value /= arg1]))
124 )
125 ;
126
127 expression =
128 assert_syntax(term[expression.value = arg1]) >>
129 *(('+' >> assert_syntax(term[expression.value += arg1])) |
130 ('-' >> assert_syntax(term[expression.value -= arg1]))
131 )
132 ;
133
134 statement =
135 !ch_p('=') >> ( expression )[var(self.mResult) = arg1] >> (end_p)
136 ;
137 }
138 };
139
140private:
141 // Member functions for semantic actions
142 F32 lookup(const std::string::iterator&, const std::string::iterator&) const;
143 F32 min(const F32& a, const F32& b) const { return llmin(a, b); }
144 F32 max(const F32& a, const F32& b) const { return llmax(a, b); }
145
146 bool checkNaN(const F32& a) const { return !llisnan(a); }
147
148 LLCalc::calc_map_t* mConstants;
149 LLCalc::calc_map_t* mVariables;
150// LLCalc::calc_map_t* mUserVariables;
151
152 F32& mResult;
153};
154
155#endif // LL_CALCPARSER_H
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 12d1929..9c8ee94 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -41,6 +41,7 @@
41#include "llgl.h" 41#include "llgl.h"
42#include "lltimer.h" 42#include "lltimer.h"
43 43
44#include "llcalc.h"
44//#include "llclipboard.h" 45//#include "llclipboard.h"
45#include "llcontrol.h" 46#include "llcontrol.h"
46#include "llbutton.h" 47#include "llbutton.h"
@@ -129,6 +130,7 @@ LLLineEditor::LLLineEditor(const std::string& name, const LLRect& rect,
129 mDrawAsterixes( FALSE ), 130 mDrawAsterixes( FALSE ),
130 mHandleEditKeysDirectly( FALSE ), 131 mHandleEditKeysDirectly( FALSE ),
131 mSelectAllonFocusReceived( FALSE ), 132 mSelectAllonFocusReceived( FALSE ),
133 mSelectAllonCommit( TRUE ),
132 mPassDelete(FALSE), 134 mPassDelete(FALSE),
133 mReadOnly(FALSE), 135 mReadOnly(FALSE),
134 mImage( sImage ), 136 mImage( sImage ),
@@ -226,7 +228,10 @@ void LLLineEditor::onCommit()
226 updateHistory(); 228 updateHistory();
227 229
228 LLUICtrl::onCommit(); 230 LLUICtrl::onCommit();
229 selectAll(); 231
232 // Selection on commit needs to be turned off when evaluating maths
233 // expressions, to allow indication of the error position
234 if (mSelectAllonCommit) selectAll();
230} 235}
231 236
232 237
@@ -2082,6 +2087,32 @@ BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
2082 return rv; 2087 return rv;
2083} 2088}
2084 2089
2090BOOL LLLineEditor::evaluateFloat()
2091{
2092 bool success;
2093 F32 result = 0.f;
2094 std::string expr = getText();
2095
2096 success = LLCalc::getInstance()->evalString(expr, result);
2097
2098 if (!success)
2099 {
2100 // Move the cursor to near the error on failure
2101 setCursor(LLCalc::getInstance()->getLastErrorPos());
2102 // *TODO: Translated error message indicating the type of error? Select error text?
2103 }
2104 else
2105 {
2106 // Replace the expression with the result
2107 std::ostringstream result_str;
2108 result_str << result;
2109 setText(result_str.str());
2110 selectAll();
2111 }
2112
2113 return success;
2114}
2115
2085void LLLineEditor::onMouseCaptureLost() 2116void LLLineEditor::onMouseCaptureLost()
2086{ 2117{
2087 endSelection(); 2118 endSelection();
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index 09a240b..6738151 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -188,6 +188,7 @@ public:
188 188
189 void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; } 189 void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; }
190 void setSelectAllonFocusReceived(BOOL b); 190 void setSelectAllonFocusReceived(BOOL b);
191 void setSelectAllonCommit(BOOL b) { mSelectAllonCommit = b; }
191 192
192 void setKeystrokeCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)); 193 void setKeystrokeCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data));
193 194
@@ -208,6 +209,8 @@ public:
208 static BOOL prevalidateASCII(const LLWString &str); 209 static BOOL prevalidateASCII(const LLWString &str);
209 210
210 static BOOL postvalidateFloat(const std::string &str); 211 static BOOL postvalidateFloat(const std::string &str);
212
213 BOOL evaluateFloat();
211 214
212 // line history support: 215 // line history support:
213 void setEnableLineHistory( BOOL enabled ) { mHaveHistory = enabled; } // switches line history on or off 216 void setEnableLineHistory( BOOL enabled ) { mHaveHistory = enabled; } // switches line history on or off
@@ -297,6 +300,7 @@ protected:
297 300
298 BOOL mHandleEditKeysDirectly; // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system 301 BOOL mHandleEditKeysDirectly; // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system
299 BOOL mSelectAllonFocusReceived; 302 BOOL mSelectAllonFocusReceived;
303 BOOL mSelectAllonCommit;
300 BOOL mPassDelete; 304 BOOL mPassDelete;
301 305
302 BOOL mReadOnly; 306 BOOL mReadOnly;
diff --git a/linden/indra/llui/llspinctrl.cpp b/linden/indra/llui/llspinctrl.cpp
index a106af4..b12d095 100644
--- a/linden/indra/llui/llspinctrl.cpp
+++ b/linden/indra/llui/llspinctrl.cpp
@@ -49,7 +49,7 @@
49#include "llfocusmgr.h" 49#include "llfocusmgr.h"
50#include "llresmgr.h" 50#include "llresmgr.h"
51 51
52const U32 MAX_STRING_LENGTH = 32; 52const U32 MAX_STRING_LENGTH = 255;
53 53
54static LLRegisterWidget<LLSpinCtrl> r2("spinner"); 54static LLRegisterWidget<LLSpinCtrl> r2("spinner");
55 55
@@ -123,7 +123,7 @@ LLSpinCtrl::LLSpinCtrl( const std::string& name, const LLRect& rect, const std::
123 mEditor = new LLLineEditor( std::string("SpinCtrl Editor"), editor_rect, LLStringUtil::null, font, 123 mEditor = new LLLineEditor( std::string("SpinCtrl Editor"), editor_rect, LLStringUtil::null, font,
124 MAX_STRING_LENGTH, 124 MAX_STRING_LENGTH,
125 &LLSpinCtrl::onEditorCommit, NULL, NULL, this, 125 &LLSpinCtrl::onEditorCommit, NULL, NULL, this,
126 &LLLineEditor::prevalidateFloat ); 126 &LLLineEditor::prevalidateASCII );
127 mEditor->setFollowsLeft(); 127 mEditor->setFollowsLeft();
128 mEditor->setFollowsBottom(); 128 mEditor->setFollowsBottom();
129 mEditor->setFocusReceivedCallback( &LLSpinCtrl::onEditorGainFocus, this ); 129 mEditor->setFocusReceivedCallback( &LLSpinCtrl::onEditorGainFocus, this );
@@ -132,6 +132,7 @@ LLSpinCtrl::LLSpinCtrl( const std::string& name, const LLRect& rect, const std::
132 // it's easier to understand 132 // it's easier to understand
133 //mEditor->setSelectAllonFocusReceived(TRUE); 133 //mEditor->setSelectAllonFocusReceived(TRUE);
134 mEditor->setIgnoreTab(TRUE); 134 mEditor->setIgnoreTab(TRUE);
135 mEditor->setSelectAllonCommit(FALSE);
135 addChild(mEditor); 136 addChild(mEditor);
136 137
137 updateEditor(); 138 updateEditor();
@@ -292,9 +293,10 @@ void LLSpinCtrl::onEditorCommit( LLUICtrl* caller, void *userdata )
292 LLSpinCtrl* self = (LLSpinCtrl*) userdata; 293 LLSpinCtrl* self = (LLSpinCtrl*) userdata;
293 llassert( caller == self->mEditor ); 294 llassert( caller == self->mEditor );
294 295
295 std::string text = self->mEditor->getText(); 296 if( self->mEditor->evaluateFloat() )
296 if( LLLineEditor::postvalidateFloat( text ) )
297 { 297 {
298 std::string text = self->mEditor->getText();
299
298 LLLocale locale(LLLocale::USER_LOCALE); 300 LLLocale locale(LLLocale::USER_LOCALE);
299 F32 val = (F32) atof(text.c_str()); 301 F32 val = (F32) atof(text.c_str());
300 302
@@ -322,9 +324,12 @@ void LLSpinCtrl::onEditorCommit( LLUICtrl* caller, void *userdata )
322 success = TRUE; 324 success = TRUE;
323 } 325 }
324 } 326 }
325 self->updateEditor();
326 327
327 if( !success ) 328 if( success )
329 {
330 self->updateEditor();
331 }
332 else
328 { 333 {
329 self->reportInvalidData(); 334 self->reportInvalidData();
330 } 335 }
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index ca3dd81..7e591bf 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4820,7 +4820,7 @@
4820 <key>MuteAmbient</key> 4820 <key>MuteAmbient</key>
4821 <map> 4821 <map>
4822 <key>Comment</key> 4822 <key>Comment</key>
4823 <string>Ambient sound effects, such as wind noise, play at 0 volume</string> 4823 <string>Ambient sound effects, play at 0 volume</string>
4824 <key>Persist</key> 4824 <key>Persist</key>
4825 <integer>1</integer> 4825 <integer>1</integer>
4826 <key>Type</key> 4826 <key>Type</key>
@@ -4905,6 +4905,17 @@
4905 <key>Value</key> 4905 <key>Value</key>
4906 <integer>1</integer> 4906 <integer>1</integer>
4907 </map> 4907 </map>
4908 <key>MuteWind</key>
4909 <map>
4910 <key>Comment</key>
4911 <string>Mute inworld wind generation</string>
4912 <key>Persist</key>
4913 <integer>1</integer>
4914 <key>Type</key>
4915 <string>Boolean</string>
4916 <key>Value</key>
4917 <integer>1</integer>
4918 </map>
4908 <key>NewCacheLocation</key> 4919 <key>NewCacheLocation</key>
4909 <map> 4920 <map>
4910 <key>Comment</key> 4921 <key>Comment</key>
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index 2cf418e..64402e3 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -109,6 +109,7 @@
109#include "llpostprocess.h" 109#include "llpostprocess.h"
110#include "llwlparammanager.h" 110#include "llwlparammanager.h"
111#include "llwaterparammanager.h" 111#include "llwaterparammanager.h"
112#include "llcalc.h"
112 113
113#include "lldebugview.h" 114#include "lldebugview.h"
114#include "llconsole.h" 115#include "llconsole.h"
@@ -1176,6 +1177,8 @@ bool LLAppViewer::cleanup()
1176 LLNotifyBox::cleanup(); 1177 LLNotifyBox::cleanup();
1177 1178
1178 LLWorldMap::getInstance()->reset(); // release any images 1179 LLWorldMap::getInstance()->reset(); // release any images
1180
1181 LLCalc::cleanUp();
1179 1182
1180 llinfos << "Global stuff deleted" << llendflush; 1183 llinfos << "Global stuff deleted" << llendflush;
1181 1184
diff --git a/linden/indra/newview/llpanelface.cpp b/linden/indra/newview/llpanelface.cpp
index 4742627..d1c34f1 100644
--- a/linden/indra/newview/llpanelface.cpp
+++ b/linden/indra/newview/llpanelface.cpp
@@ -35,6 +35,7 @@
35#include "llpanelface.h" 35#include "llpanelface.h"
36 36
37// library includes 37// library includes
38#include "llcalc.h"
38#include "llerror.h" 39#include "llerror.h"
39#include "llfocusmgr.h" 40#include "llfocusmgr.h"
40#include "llrect.h" 41#include "llrect.h"
@@ -60,6 +61,7 @@
60#include "llviewermedia.h" 61#include "llviewermedia.h"
61#include "llviewerobject.h" 62#include "llviewerobject.h"
62#include "llviewerstats.h" 63#include "llviewerstats.h"
64#include "llviewerwindow.h"
63#include "lluictrlfactory.h" 65#include "lluictrlfactory.h"
64 66
65// 67//
@@ -179,6 +181,7 @@ BOOL LLPanelFace::postBuild()
179 childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureInfo, this); 181 childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureInfo, this);
180 childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this); 182 childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this);
181 childSetAction("button align",onClickAutoFix,this); 183 childSetAction("button align",onClickAutoFix,this);
184 childSetAction("texture_math_constants",onClickTextureConstants,this);
182 185
183 clearCtrls(); 186 clearCtrls();
184 187
@@ -381,6 +384,7 @@ void LLPanelFace::sendTextureInfo()
381void LLPanelFace::getState() 384void LLPanelFace::getState()
382{ 385{
383 LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); 386 LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
387 LLCalc* calcp = LLCalc::getInstance();
384 388
385 if( objectp 389 if( objectp
386 && objectp->getPCode() == LL_PCODE_VOLUME 390 && objectp->getPCode() == LL_PCODE_VOLUME
@@ -754,6 +758,16 @@ void LLPanelFace::getState()
754 childSetEnabled("button apply",enabled); 758 childSetEnabled("button apply",enabled);
755 } 759 }
756 } 760 }
761 childSetEnabled("texture_math_constants",true);
762
763 // Set variable values for numeric expressions
764 calcp->setVar(LLCalc::TEX_U_SCALE, childGetValue("TexScaleU").asReal());
765 calcp->setVar(LLCalc::TEX_V_SCALE, childGetValue("TexScaleV").asReal());
766 calcp->setVar(LLCalc::TEX_U_OFFSET, childGetValue("TexOffsetU").asReal());
767 calcp->setVar(LLCalc::TEX_V_OFFSET, childGetValue("TexOffsetV").asReal());
768 calcp->setVar(LLCalc::TEX_ROTATION, childGetValue("TexRot").asReal());
769 calcp->setVar(LLCalc::TEX_TRANSPARENCY, childGetValue("ColorTrans").asReal());
770 calcp->setVar(LLCalc::TEX_GLOW, childGetValue("glow").asReal());
757 } 771 }
758 else 772 else
759 { 773 {
@@ -787,6 +801,17 @@ void LLPanelFace::getState()
787 801
788 childSetEnabled("button align",FALSE); 802 childSetEnabled("button align",FALSE);
789 childSetEnabled("button apply",FALSE); 803 childSetEnabled("button apply",FALSE);
804
805 childSetEnabled("texture_math_constants",false);
806
807 // Set variable values for numeric expressions
808 calcp->clearVar(LLCalc::TEX_U_SCALE);
809 calcp->clearVar(LLCalc::TEX_V_SCALE);
810 calcp->clearVar(LLCalc::TEX_U_OFFSET);
811 calcp->clearVar(LLCalc::TEX_V_OFFSET);
812 calcp->clearVar(LLCalc::TEX_ROTATION);
813 calcp->clearVar(LLCalc::TEX_TRANSPARENCY);
814 calcp->clearVar(LLCalc::TEX_GLOW);
790 } 815 }
791} 816}
792 817
@@ -969,3 +994,9 @@ void LLPanelFace::onClickAutoFix(void* userdata)
969 LLPanelFaceSendFunctor sendfunc; 994 LLPanelFaceSendFunctor sendfunc;
970 LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc); 995 LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc);
971} 996}
997
998// static
999void LLPanelFace::onClickTextureConstants(void *)
1000{
1001 gViewerWindow->alertXml("ClickTextureConstants");
1002} \ No newline at end of file
diff --git a/linden/indra/newview/llpanelface.h b/linden/indra/newview/llpanelface.h
index 230772b..b977583 100644
--- a/linden/indra/newview/llpanelface.h
+++ b/linden/indra/newview/llpanelface.h
@@ -88,6 +88,7 @@ protected:
88 88
89 static void onClickApply(void*); 89 static void onClickApply(void*);
90 static void onClickAutoFix(void*); 90 static void onClickAutoFix(void*);
91 static void onClickTextureConstants(void *);
91 static F32 valueGlow(LLViewerObject* object, S32 face); 92 static F32 valueGlow(LLViewerObject* object, S32 face);
92}; 93};
93 94
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp
index cc9d969..5cd8690 100644
--- a/linden/indra/newview/llpanelobject.cpp
+++ b/linden/indra/newview/llpanelobject.cpp
@@ -46,6 +46,7 @@
46// project includes 46// project includes
47#include "llagent.h" 47#include "llagent.h"
48#include "llbutton.h" 48#include "llbutton.h"
49#include "llcalc.h"
49#include "llcheckboxctrl.h" 50#include "llcheckboxctrl.h"
50#include "llcolorswatch.h" 51#include "llcolorswatch.h"
51#include "llcombobox.h" 52#include "llcombobox.h"
@@ -109,6 +110,9 @@ BOOL LLPanelObject::postBuild()
109 // Top 110 // Top
110 //-------------------------------------------------------- 111 //--------------------------------------------------------
111 112
113 // Build constant tipsheet
114 childSetAction("build_math_constants",onClickBuildConstants,this);
115
112 // Lock checkbox 116 // Lock checkbox
113 mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked"); 117 mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked");
114 childSetCommitCallback("checkbox locked",onCommitLock,this); 118 childSetCommitCallback("checkbox locked",onCommitLock,this);
@@ -341,6 +345,8 @@ void LLPanelObject::getState( )
341 } 345 }
342 } 346 }
343 347
348 LLCalc* calcp = LLCalc::getInstance();
349
344 LLVOVolume *volobjp = NULL; 350 LLVOVolume *volobjp = NULL;
345 if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME)) 351 if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
346 { 352 {
@@ -357,6 +363,7 @@ void LLPanelObject::getState( )
357 363
358 // Disable all text input fields 364 // Disable all text input fields
359 clearCtrls(); 365 clearCtrls();
366 calcp->clearAllVariables();
360 return; 367 return;
361 } 368 }
362 369
@@ -365,6 +372,7 @@ void LLPanelObject::getState( )
365 BOOL enable_scale = objectp->permMove() && objectp->permModify(); 372 BOOL enable_scale = objectp->permMove() && objectp->permModify();
366 BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts")); 373 BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
367 374
375 childSetEnabled("build_math_constants",true);
368 LLVector3 vec; 376 LLVector3 vec;
369 if (enable_move) 377 if (enable_move)
370 { 378 {
@@ -372,12 +380,18 @@ void LLPanelObject::getState( )
372 mCtrlPosX->set( vec.mV[VX] ); 380 mCtrlPosX->set( vec.mV[VX] );
373 mCtrlPosY->set( vec.mV[VY] ); 381 mCtrlPosY->set( vec.mV[VY] );
374 mCtrlPosZ->set( vec.mV[VZ] ); 382 mCtrlPosZ->set( vec.mV[VZ] );
383 calcp->setVar(LLCalc::X_POS, vec.mV[VX]);
384 calcp->setVar(LLCalc::Y_POS, vec.mV[VY]);
385 calcp->setVar(LLCalc::Z_POS, vec.mV[VZ]);
375 } 386 }
376 else 387 else
377 { 388 {
378 mCtrlPosX->clear(); 389 mCtrlPosX->clear();
379 mCtrlPosY->clear(); 390 mCtrlPosY->clear();
380 mCtrlPosZ->clear(); 391 mCtrlPosZ->clear();
392 calcp->clearVar(LLCalc::X_POS);
393 calcp->clearVar(LLCalc::Y_POS);
394 calcp->clearVar(LLCalc::Z_POS);
381 } 395 }
382 396
383 397
@@ -392,12 +406,18 @@ void LLPanelObject::getState( )
392 mCtrlScaleX->set( vec.mV[VX] ); 406 mCtrlScaleX->set( vec.mV[VX] );
393 mCtrlScaleY->set( vec.mV[VY] ); 407 mCtrlScaleY->set( vec.mV[VY] );
394 mCtrlScaleZ->set( vec.mV[VZ] ); 408 mCtrlScaleZ->set( vec.mV[VZ] );
409 calcp->setVar(LLCalc::X_SCALE, vec.mV[VX]);
410 calcp->setVar(LLCalc::Y_SCALE, vec.mV[VY]);
411 calcp->setVar(LLCalc::Z_SCALE, vec.mV[VZ]);
395 } 412 }
396 else 413 else
397 { 414 {
398 mCtrlScaleX->clear(); 415 mCtrlScaleX->clear();
399 mCtrlScaleY->clear(); 416 mCtrlScaleY->clear();
400 mCtrlScaleZ->clear(); 417 mCtrlScaleZ->clear();
418 calcp->setVar(LLCalc::X_SCALE, 0.f);
419 calcp->setVar(LLCalc::Y_SCALE, 0.f);
420 calcp->setVar(LLCalc::Z_SCALE, 0.f);
401 } 421 }
402 422
403 mLabelSize->setEnabled( enable_scale ); 423 mLabelSize->setEnabled( enable_scale );
@@ -417,12 +437,18 @@ void LLPanelObject::getState( )
417 mCtrlRotX->set( mCurEulerDegrees.mV[VX] ); 437 mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
418 mCtrlRotY->set( mCurEulerDegrees.mV[VY] ); 438 mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
419 mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] ); 439 mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
440 calcp->setVar(LLCalc::X_ROT, mCurEulerDegrees.mV[VX]);
441 calcp->setVar(LLCalc::Y_ROT, mCurEulerDegrees.mV[VY]);
442 calcp->setVar(LLCalc::Z_ROT, mCurEulerDegrees.mV[VZ]);
420 } 443 }
421 else 444 else
422 { 445 {
423 mCtrlRotX->clear(); 446 mCtrlRotX->clear();
424 mCtrlRotY->clear(); 447 mCtrlRotY->clear();
425 mCtrlRotZ->clear(); 448 mCtrlRotZ->clear();
449 calcp->clearVar(LLCalc::X_ROT);
450 calcp->clearVar(LLCalc::Y_ROT);
451 calcp->clearVar(LLCalc::Z_ROT);
426 } 452 }
427 453
428 mLabelRotation->setEnabled( enable_rotate ); 454 mLabelRotation->setEnabled( enable_rotate );
@@ -678,8 +704,9 @@ void LLPanelObject::getState( )
678 F32 end_t = volume_params.getEndT(); 704 F32 end_t = volume_params.getEndT();
679 705
680 // Hollowness 706 // Hollowness
681 F32 hollow = volume_params.getHollow(); 707 F32 hollow = 100.f * volume_params.getHollow();
682 mSpinHollow->set( 100.f * hollow ); 708 mSpinHollow->set( hollow );
709 calcp->setVar(LLCalc::HOLLOW, hollow);
683 710
684 // All hollow objects allow a shape to be selected. 711 // All hollow objects allow a shape to be selected.
685 if (hollow > 0.f) 712 if (hollow > 0.f)
@@ -732,6 +759,10 @@ void LLPanelObject::getState( )
732 mSpinCutEnd ->set( cut_end ); 759 mSpinCutEnd ->set( cut_end );
733 mCtrlPathBegin ->set( adv_cut_begin ); 760 mCtrlPathBegin ->set( adv_cut_begin );
734 mCtrlPathEnd ->set( adv_cut_end ); 761 mCtrlPathEnd ->set( adv_cut_end );
762 calcp->setVar(LLCalc::CUT_BEGIN, cut_begin);
763 calcp->setVar(LLCalc::CUT_END, cut_end);
764 calcp->setVar(LLCalc::PATH_BEGIN, adv_cut_begin);
765 calcp->setVar(LLCalc::PATH_END, adv_cut_end);
735 766
736 // Twist 767 // Twist
737 F32 twist = volume_params.getTwist(); 768 F32 twist = volume_params.getTwist();
@@ -750,18 +781,24 @@ void LLPanelObject::getState( )
750 781
751 mSpinTwist ->set( twist ); 782 mSpinTwist ->set( twist );
752 mSpinTwistBegin ->set( twist_begin ); 783 mSpinTwistBegin ->set( twist_begin );
784 calcp->setVar(LLCalc::TWIST_END, twist);
785 calcp->setVar(LLCalc::TWIST_BEGIN, twist_begin);
753 786
754 // Shear 787 // Shear
755 F32 shear_x = volume_params.getShearX(); 788 F32 shear_x = volume_params.getShearX();
756 F32 shear_y = volume_params.getShearY(); 789 F32 shear_y = volume_params.getShearY();
757 mSpinShearX->set( shear_x ); 790 mSpinShearX->set( shear_x );
758 mSpinShearY->set( shear_y ); 791 mSpinShearY->set( shear_y );
792 calcp->setVar(LLCalc::X_SHEAR, shear_x);
793 calcp->setVar(LLCalc::Y_SHEAR, shear_y);
759 794
760 // Taper 795 // Taper
761 F32 taper_x = volume_params.getTaperX(); 796 F32 taper_x = volume_params.getTaperX();
762 F32 taper_y = volume_params.getTaperY(); 797 F32 taper_y = volume_params.getTaperY();
763 mSpinTaperX->set( taper_x ); 798 mSpinTaperX->set( taper_x );
764 mSpinTaperY->set( taper_y ); 799 mSpinTaperY->set( taper_y );
800 calcp->setVar(LLCalc::X_TAPER, taper_x);
801 calcp->setVar(LLCalc::Y_TAPER, taper_y);
765 802
766 // Radius offset. 803 // Radius offset.
767 F32 radius_offset = volume_params.getRadiusOffset(); 804 F32 radius_offset = volume_params.getRadiusOffset();
@@ -791,10 +828,12 @@ void LLPanelObject::getState( )
791 } 828 }
792 } 829 }
793 mSpinRadiusOffset->set( radius_offset); 830 mSpinRadiusOffset->set( radius_offset);
831 calcp->setVar(LLCalc::RADIUS_OFFSET, radius_offset);
794 832
795 // Revolutions 833 // Revolutions
796 F32 revolutions = volume_params.getRevolutions(); 834 F32 revolutions = volume_params.getRevolutions();
797 mSpinRevolutions->set( revolutions ); 835 mSpinRevolutions->set( revolutions );
836 calcp->setVar(LLCalc::REVOLUTIONS, revolutions);
798 837
799 // Skew 838 // Skew
800 F32 skew = volume_params.getSkew(); 839 F32 skew = volume_params.getSkew();
@@ -819,6 +858,7 @@ void LLPanelObject::getState( )
819 } 858 }
820 } 859 }
821 mSpinSkew->set( skew ); 860 mSpinSkew->set( skew );
861 calcp->setVar(LLCalc::SKEW, skew);
822 } 862 }
823 863
824 // Compute control visibility, label names, and twist range. 864 // Compute control visibility, label names, and twist range.
@@ -924,6 +964,8 @@ void LLPanelObject::getState( )
924 case MI_RING: 964 case MI_RING:
925 mSpinScaleX->set( scale_x ); 965 mSpinScaleX->set( scale_x );
926 mSpinScaleY->set( scale_y ); 966 mSpinScaleY->set( scale_y );
967 calcp->setVar(LLCalc::X_HOLE, scale_x);
968 calcp->setVar(LLCalc::Y_HOLE, scale_y);
927 mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE); 969 mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
928 mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X); 970 mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
929 mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE); 971 mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
@@ -934,6 +976,8 @@ void LLPanelObject::getState( )
934 { 976 {
935 mSpinScaleX->set( 1.f - scale_x ); 977 mSpinScaleX->set( 1.f - scale_x );
936 mSpinScaleY->set( 1.f - scale_y ); 978 mSpinScaleY->set( 1.f - scale_y );
979 calcp->setVar(LLCalc::X_HOLE, 1.f - scale_x);
980 calcp->setVar(LLCalc::Y_HOLE, 1.f - scale_y);
937 mSpinScaleX->setMinValue(-1.f); 981 mSpinScaleX->setMinValue(-1.f);
938 mSpinScaleX->setMaxValue(1.f); 982 mSpinScaleX->setMaxValue(1.f);
939 mSpinScaleY->setMinValue(-1.f); 983 mSpinScaleY->setMinValue(-1.f);
@@ -1148,7 +1192,7 @@ void LLPanelObject::getState( )
1148 mSculptTextureRevert = LLUUID::null; 1192 mSculptTextureRevert = LLUUID::null;
1149 } 1193 }
1150 1194
1151 1195
1152 //---------------------------------------------------------------------------- 1196 //----------------------------------------------------------------------------
1153 1197
1154 mObject = objectp; 1198 mObject = objectp;
@@ -1913,6 +1957,8 @@ void LLPanelObject::clearCtrls()
1913 childSetEnabled( "advanced_cut", FALSE ); 1957 childSetEnabled( "advanced_cut", FALSE );
1914 childSetEnabled( "advanced_dimple", FALSE ); 1958 childSetEnabled( "advanced_dimple", FALSE );
1915 childSetVisible("advanced_slice", FALSE); 1959 childSetVisible("advanced_slice", FALSE);
1960
1961 childSetEnabled("build_math_constants",false);
1916} 1962}
1917 1963
1918// 1964//
@@ -1954,6 +2000,9 @@ void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata )
1954 LLPanelObject* self = (LLPanelObject*) userdata; 2000 LLPanelObject* self = (LLPanelObject*) userdata;
1955 BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; 2001 BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
1956 self->sendRotation(btn_down); 2002 self->sendRotation(btn_down);
2003
2004 // Needed to ensure all rotations are shown consistently in range
2005 self->refresh();
1957} 2006}
1958 2007
1959// static 2008// static
@@ -2048,3 +2097,9 @@ void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
2048 2097
2049 self->sendSculpt(); 2098 self->sendSculpt();
2050} 2099}
2100
2101// static
2102void LLPanelObject::onClickBuildConstants(void *)
2103{
2104 gViewerWindow->alertXml("ClickBuildConstants");
2105}
diff --git a/linden/indra/newview/llpanelobject.h b/linden/indra/newview/llpanelobject.h
index afdfd30..b72289c 100644
--- a/linden/indra/newview/llpanelobject.h
+++ b/linden/indra/newview/llpanelobject.h
@@ -83,6 +83,7 @@ public:
83 static BOOL onDropSculpt( LLUICtrl* ctrl, LLInventoryItem* item, void* ud); 83 static BOOL onDropSculpt( LLUICtrl* ctrl, LLInventoryItem* item, void* ud);
84 static void onCommitSculptType( LLUICtrl *ctrl, void* userdata); 84 static void onCommitSculptType( LLUICtrl *ctrl, void* userdata);
85 85
86 static void onClickBuildConstants(void *);
86 87
87protected: 88protected:
88 void getState(); 89 void getState();
diff --git a/linden/indra/newview/llvieweraudio.cpp b/linden/indra/newview/llvieweraudio.cpp
index 122a0bc..bc25649 100644
--- a/linden/indra/newview/llvieweraudio.cpp
+++ b/linden/indra/newview/llvieweraudio.cpp
@@ -62,7 +62,7 @@ void init_audio()
62 62
63// load up our initial set of sounds we'll want so they're in memory and ready to be played 63// load up our initial set of sounds we'll want so they're in memory and ready to be played
64 64
65 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); 65 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
66 66
67 if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload")) 67 if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))
68 { 68 {
@@ -114,7 +114,9 @@ void init_audio()
114void audio_update_volume(bool force_update) 114void audio_update_volume(bool force_update)
115{ 115{
116 F32 master_volume = gSavedSettings.getF32("AudioLevelMaster"); 116 F32 master_volume = gSavedSettings.getF32("AudioLevelMaster");
117 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); 117 bool wind_muted = gSavedSettings.getBOOL("MuteWind");
118 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
119
118 if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) 120 if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
119 { 121 {
120 mute_audio = TRUE; 122 mute_audio = TRUE;
@@ -129,9 +131,9 @@ void audio_update_volume(bool force_update)
129 gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); 131 gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));
130 gAudiop->setDistanceFactor(gSavedSettings.getF32("AudioLevelDistance")); 132 gAudiop->setDistanceFactor(gSavedSettings.getF32("AudioLevelDistance"));
131 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); 133 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
132#ifdef kAUDIO_ENABLE_WIND 134
135 if(wind_muted == false)
133 gAudiop->enableWind(!mute_audio); 136 gAudiop->enableWind(!mute_audio);
134#endif
135 137
136 gAudiop->setMuted(mute_audio); 138 gAudiop->setMuted(mute_audio);
137 139
@@ -197,46 +199,50 @@ void audio_update_listener()
197 199
198void audio_update_wind(bool force_update) 200void audio_update_wind(bool force_update)
199{ 201{
200#ifdef kAUDIO_ENABLE_WIND 202 bool wind_muted = gSavedSettings.getBOOL("MuteWind");
201 // 203 bool mute_audio = gSavedSettings.getBOOL("MuteAudio");
202 // Extract height above water to modulate filter by whether above/below water 204
203 // 205 if(!mute_audio && !wind_muted)
204 LLViewerRegion* region = gAgent.getRegion();
205 if (region)
206 { 206 {
207 static F32 last_camera_water_height = -1000.f;
208 LLVector3 camera_pos = gAgent.getCameraPositionAgent();
209 F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight();
210
211 // 207 //
212 // Don't update rolloff factor unless water surface has been crossed 208 // Extract height above water to modulate filter by whether above/below water
213 // 209 //
214 if (force_update || (last_camera_water_height * camera_water_height) < 0.f) 210 LLViewerRegion* region = gAgent.getRegion();
211 if (region)
215 { 212 {
216 if (camera_water_height < 0.f) 213 static F32 last_camera_water_height = -1000.f;
217 { 214 LLVector3 camera_pos = gAgent.getCameraPositionAgent();
218 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER); 215 F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight();
219 } 216
220 else 217 //
218 // Don't update rolloff factor unless water surface has been crossed
219 //
220 if (force_update || (last_camera_water_height * camera_water_height) < 0.f)
221 { 221 {
222 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); 222 if (camera_water_height < 0.f)
223 {
224 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER);
225 }
226 else
227 {
228 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
229 }
223 } 230 }
231 // this line rotates the wind vector to be listener (agent) relative
232 // unfortunately we have to pre-translate to undo the translation that
233 // occurs in the transform call
234 gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity());
235
236 // don't use the setter setMaxWindGain() because we don't
237 // want to screw up the fade-in on startup by setting actual source gain
238 // outside the fade-in.
239 F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient");
240 gAudiop->mMaxWindGain = gSavedSettings.getBOOL("MuteAmbient")
241 ? 0.f
242 : ambient_volume * ambient_volume;
243
244 last_camera_water_height = camera_water_height;
245 gAudiop->updateWind(gRelativeWindVec, camera_water_height);
224 } 246 }
225 // this line rotates the wind vector to be listener (agent) relative
226 // unfortunately we have to pre-translate to undo the translation that
227 // occurs in the transform call
228 gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity());
229
230 // don't use the setter setMaxWindGain() because we don't
231 // want to screw up the fade-in on startup by setting actual source gain
232 // outside the fade-in.
233 F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient");
234 gAudiop->mMaxWindGain = gSavedSettings.getBOOL("MuteAmbient")
235 ? 0.f
236 : ambient_volume * ambient_volume;
237
238 last_camera_water_height = camera_water_height;
239 gAudiop->updateWind(gRelativeWindVec, camera_water_height);
240 } 247 }
241#endif
242} 248}
diff --git a/linden/indra/newview/llvieweraudio.h b/linden/indra/newview/llvieweraudio.h
index 6ab7c7f..b4a299c 100644
--- a/linden/indra/newview/llvieweraudio.h
+++ b/linden/indra/newview/llvieweraudio.h
@@ -32,8 +32,6 @@
32#ifndef LL_VIEWERAUDIO_H 32#ifndef LL_VIEWERAUDIO_H
33#define LL_VIEWERAUDIO_H 33#define LL_VIEWERAUDIO_H
34 34
35// comment out to turn off wind
36#define kAUDIO_ENABLE_WIND
37//#define kAUDIO_ENABLE_WATER 1 // comment out to turn off water 35//#define kAUDIO_ENABLE_WATER 1 // comment out to turn off water
38#define kAUDIO_NUM_BUFFERS 30 36#define kAUDIO_NUM_BUFFERS 30
39#define kAUDIO_NUM_SOURCES 30 37#define kAUDIO_NUM_SOURCES 30
diff --git a/linden/indra/newview/skins/default/xui/en-us/alerts.xml b/linden/indra/newview/skins/default/xui/en-us/alerts.xml
index c2d4301..dc9b5ea 100644
--- a/linden/indra/newview/skins/default/xui/en-us/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/alerts.xml
@@ -385,6 +385,73 @@ Go to the Second Life web site for more information on partnering?
385 Cancel 385 Cancel
386 </option> 386 </option>
387 </alert> 387 </alert>
388 <alert modal="true" name="ClickBuildConstants">
389 <message name="message">
390 The following constants are accepted in this tab:
391
392 XP -- X-axis position
393 YP -- Y-axis position
394 ZP -- Z-axis position
395 XS -- X-axis size
396 YS -- Y-axis size
397 ZS -- Z-axis size
398 XR -- X-axis rotation
399 YR -- Y-axis rotation
400 ZR -- Z-axis rotation
401 CB -- Path cut begin
402 CE -- Path cut end
403 HLW -- Hollow size
404 SKW -- Skew
405 PB -- Slice/Dimple/Profile cut begin
406 PE -- Slice/Dimple/Profile cut end
407 XSH -- X-axis top shear
408 YSH -- Y-axis top shear
409 XHL -- X-axis hole size
410 YHL -- Y-axis hole size
411 XTP -- X-axis taper
412 YTP -- Y-axis taper
413 ROF -- Radius offset
414 REV -- Revolutions
415
416 * -- Multiplication
417 \ -- Division
418 + -- Addition
419 - -- Subtraction
420
421 Examples:
422
423 * Enter &apos;ZP + 20&apos; in the Z-axis position field
424 to move an object up 20 meters.
425 * Enter &apos;XS - YS&apos; in the X-axis size field
426 to subtract the Y size from the X size.
427 </message>
428 </alert>
429 <alert modal="true" name="ClickTextureConstants">
430 <message name="message">
431 The following constants are accepted in this tab:
432
433 TSU -- Repeats per face (horizontal)
434 TSV -- Repeats per face (vertical)
435 TOU -- Offsets per face (horizontal)
436 TOV -- Offsets per face (vertical)
437 TRNS -- Transparency
438 TROT -- Texture rotation
439 GLOW -- Glow
440
441 * -- Multiplication
442 \ -- Division
443 + -- Addition
444 - -- Subtraction
445
446 Examples:
447
448 * Enter &apos;TSU * 4&apos; in horizantal repeats field
449 to increase the amount of repeats by 4x.
450 * Enter &apos;TSV&apos; in the horizontal repeats field
451 to make the horizontal and vertical
452 repeats match.
453 </message>
454 </alert>
388 <alert modal="true" name="ClickWebProfileHelpAvatar"> 455 <alert modal="true" name="ClickWebProfileHelpAvatar">
389 <message name="message"> 456 <message name="message">
390 If this Resident has set a web profile URL then you can: 457 If this Resident has set a web profile URL then you can:
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index 742da45..eb9b1c6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -587,7 +587,10 @@
587 mouse_opaque="true" name="edit_object" v_pad="0" width="252"> 587 mouse_opaque="true" name="edit_object" v_pad="0" width="252">
588 Edit object parameters: 588 Edit object parameters:
589 </text> 589 </text>
590 <check_box bottom_delta="-26" follows="left|top" font="SansSerifSmall" height="16" 590 <button bottom_delta="-10" follows="left|top" font="SansSerif" halign="center"
591 height="22" label="?" label_selected="?" right="-8" tool_tip="Object math constants"
592 mouse_opaque="true" name="build_math_constants" scale_image="true" width="22" />
593 <check_box bottom_delta="-16" follows="left|top" font="SansSerifSmall" height="16"
591 initial_value="false" label="Locked" left="8" mouse_opaque="true" 594 initial_value="false" label="Locked" left="8" mouse_opaque="true"
592 name="checkbox locked" 595 name="checkbox locked"
593 tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits." 596 tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."
@@ -614,15 +617,15 @@
614 <spinner bottom_delta="-20" decimal_digits="3" follows="left|top" height="16" 617 <spinner bottom_delta="-20" decimal_digits="3" follows="left|top" height="16"
615 increment="0.01" initial_val="0" label="X" label_width="10" left="10" 618 increment="0.01" initial_val="0" label="X" label_width="10" left="10"
616 max_val="512" min_val="-256" mouse_opaque="true" name="Pos X" 619 max_val="512" min_val="-256" mouse_opaque="true" name="Pos X"
617 text_enabled_color="110, 15, 15, 255" width="87" /> 620 text_enabled_color="110, 15, 15, 255" width="96" />
618 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 621 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
619 increment="0.01" initial_val="0" label="Y" label_width="10" left="10" 622 increment="0.01" initial_val="0" label="Y" label_width="10" left="10"
620 max_val="512" min_val="-256" mouse_opaque="true" name="Pos Y" 623 max_val="512" min_val="-256" mouse_opaque="true" name="Pos Y"
621 text_enabled_color="0, 100, 40, 255" width="87" /> 624 text_enabled_color="0, 100, 40, 255" width="96" />
622 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 625 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
623 increment="0.01" initial_val="0" label="Z" label_width="10" left="10" 626 increment="0.01" initial_val="0" label="Z" label_width="10" left="10"
624 max_val="4096" min_val="0" mouse_opaque="true" name="Pos Z" 627 max_val="4096" min_val="0" mouse_opaque="true" name="Pos Z"
625 text_enabled_color="0, 67, 132, 255" width="87" /> 628 text_enabled_color="0, 67, 132, 255" width="96" />
626 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 629 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
627 bottom_delta="-16" drop_shadow_visible="true" follows="left|top" 630 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
628 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10" 631 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
@@ -632,15 +635,15 @@
632 <spinner bottom_delta="-20" decimal_digits="3" follows="left|top" height="16" 635 <spinner bottom_delta="-20" decimal_digits="3" follows="left|top" height="16"
633 increment="0.01" initial_val="0" label="X" label_width="10" left="10" 636 increment="0.01" initial_val="0" label="X" label_width="10" left="10"
634 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale X" 637 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale X"
635 text_enabled_color="1, 1, 1, 1" width="87" /> 638 text_enabled_color="1, 1, 1, 1" width="96" />
636 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 639 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
637 increment="0.01" initial_val="0" label="Y" label_width="10" left="10" 640 increment="0.01" initial_val="0" label="Y" label_width="10" left="10"
638 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale Y" 641 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale Y"
639 text_enabled_color="1, 1, 1, 1" width="87" /> 642 text_enabled_color="1, 1, 1, 1" width="96" />
640 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 643 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
641 increment="0.01" initial_val="0" label="Z" label_width="10" left="10" 644 increment="0.01" initial_val="0" label="Z" label_width="10" left="10"
642 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale Z" 645 max_val="10" min_val="0.01" mouse_opaque="true" name="Scale Z"
643 text_enabled_color="1, 1, 1, 1" width="87" /> 646 text_enabled_color="1, 1, 1, 1" width="96" />
644 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 647 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
645 bottom_delta="-16" drop_shadow_visible="true" follows="left|top" 648 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
646 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10" 649 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
@@ -650,15 +653,15 @@
650 <spinner bottom_delta="-22" decimal_digits="2" follows="left|top" height="16" 653 <spinner bottom_delta="-22" decimal_digits="2" follows="left|top" height="16"
651 increment="1" initial_val="0" label="X" label_width="10" left="10" 654 increment="1" initial_val="0" label="X" label_width="10" left="10"
652 max_val="9999" min_val="-9999" mouse_opaque="true" name="Rot X" 655 max_val="9999" min_val="-9999" mouse_opaque="true" name="Rot X"
653 text_enabled_color="1, 1, 1, 1" width="87" /> 656 text_enabled_color="1, 1, 1, 1" width="96" />
654 <spinner bottom_delta="-18" decimal_digits="2" follows="left|top" height="16" 657 <spinner bottom_delta="-18" decimal_digits="2" follows="left|top" height="16"
655 increment="1" initial_val="0" label="Y" label_width="10" left="10" 658 increment="1" initial_val="0" label="Y" label_width="10" left="10"
656 max_val="9999" min_val="-9999" mouse_opaque="true" name="Rot Y" 659 max_val="9999" min_val="-9999" mouse_opaque="true" name="Rot Y"
657 text_enabled_color="1, 1, 1, 1" width="87" /> 660 text_enabled_color="1, 1, 1, 1" width="96" />
658 <spinner bottom_delta="-18" decimal_digits="2" follows="left|top" height="16" 661 <spinner bottom_delta="-18" decimal_digits="2" follows="left|top" height="16"
659 increment="1" initial_val="0" label="Z" label_width="10" left="10" 662 increment="1" initial_val="0" label="Z" label_width="10" left="10"
660 max_val="9999" min_val="-9999" mouse_opaque="true" name="Rot Z" 663 max_val="9999" min_val="-9999" mouse_opaque="true" name="Rot Z"
661 text_enabled_color="1, 1, 1, 1" width="87" /> 664 text_enabled_color="1, 1, 1, 1" width="96" />
662 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 665 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
663 bottom_delta="-16" drop_shadow_visible="true" follows="left|top" 666 bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
664 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10" 667 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
@@ -748,12 +751,12 @@
748 Skew 751 Skew
749 </text> 752 </text>
750 <spinner bottom_delta="-20" decimal_digits="1" follows="left|top" height="16" 753 <spinner bottom_delta="-20" decimal_digits="1" follows="left|top" height="16"
751 increment="5" initial_val="0" left="121" max_val="95" min_val="0" 754 increment="5" initial_val="0" left="121" max_val="95" min_val="0"
752 mouse_opaque="true" name="Scale 1" width="68" /> 755 mouse_opaque="true" name="Scale 1" width="68" label=" " label_width="10"/>
753 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16" 756 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16"
754 increment="0.05" initial_val="0" left_delta="73" max_val="0.95" 757 increment="0.05" initial_val="0" left_delta="73" max_val="0.95" label_width="10"
755 min_val="-0.95" mouse_opaque="true" name="Skew" width="68" /> 758 min_val="-0.95" mouse_opaque="true" name="Skew" width="68" label=" " />
756 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 759 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
757 bottom_delta="-15" drop_shadow_visible="true" follows="left|top" 760 bottom_delta="-15" drop_shadow_visible="true" follows="left|top"
758 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="121" 761 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="121"
759 mouse_opaque="true" name="Hollow Shape" v_pad="0" width="141"> 762 mouse_opaque="true" name="Hollow Shape" v_pad="0" width="141">
@@ -872,10 +875,10 @@
872 </text> 875 </text>
873 <spinner bottom_delta="-19" decimal_digits="3" follows="left|top" height="16" 876 <spinner bottom_delta="-19" decimal_digits="3" follows="left|top" height="16"
874 increment="0.05" initial_val="0" left="121" max_val="1" min_val="-1" 877 increment="0.05" initial_val="0" left="121" max_val="1" min_val="-1"
875 mouse_opaque="true" name="Radius Offset" width="68" /> 878 mouse_opaque="true" name="Radius Offset" width="68" label=" " label_width="10" />
876 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16" 879 <spinner bottom_delta="0" decimal_digits="2" follows="left|top" height="16"
877 increment="0.1" initial_val="1" left_delta="73" max_val="4" min_val="1" 880 increment="0.1" initial_val="1" left_delta="73" max_val="4" min_val="1"
878 mouse_opaque="true" name="Revolutions" width="68" /> 881 mouse_opaque="true" name="Revolutions" width="68" label=" " label_width="10" />
879 <texture_picker allow_no_texture="false" bottom="-211" can_apply_immediately="true" 882 <texture_picker allow_no_texture="false" bottom="-211" can_apply_immediately="true"
880 default_image_name="Default" follows="left|top" height="141" 883 default_image_name="Default" follows="left|top" height="141"
881 label="Sculpt Texture" left="121" mouse_opaque="true" 884 label="Sculpt Texture" left="121" mouse_opaque="true"
@@ -1018,7 +1021,7 @@
1018 </text> 1021 </text>
1019 <spinner bottom_delta="-20" decimal_digits="0" follows="left|top" height="16" 1022 <spinner bottom_delta="-20" decimal_digits="0" follows="left|top" height="16"
1020 increment="2" initial_val="0" left="180" max_val="100" min_val="0" 1023 increment="2" initial_val="0" left="180" max_val="100" min_val="0"
1021 mouse_opaque="true" name="ColorTrans" width="80" /> 1024 mouse_opaque="true" name="ColorTrans" width="58" />
1022 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 1025 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
1023 bottom_delta="-12" drop_shadow_visible="true" follows="left|top" 1026 bottom_delta="-12" drop_shadow_visible="true" follows="left|top"
1024 font="SansSerifSmall" h_pad="0" halign="left" height="10" 1027 font="SansSerifSmall" h_pad="0" halign="left" height="10"
@@ -1027,7 +1030,7 @@
1027 </text> 1030 </text>
1028 <spinner bottom_delta="-20" decimal_digits="2" follows="left|top" height="16" 1031 <spinner bottom_delta="-20" decimal_digits="2" follows="left|top" height="16"
1029 increment="0.1" initial_val="0" left="180" max_val="1" 1032 increment="0.1" initial_val="0" left="180" max_val="1"
1030 min_val="0" mouse_opaque="true" name="glow" width="80" /> 1033 min_val="0" mouse_opaque="true" name="glow" width="58" />
1031 <check_box bottom_delta="-23" follows="left|top" font="SansSerifSmall" height="16" 1034 <check_box bottom_delta="-23" follows="left|top" font="SansSerifSmall" height="16"
1032 initial_value="false" label="Full Bright" left="180" mouse_opaque="true" 1035 initial_value="false" label="Full Bright" left="180" mouse_opaque="true"
1033 name="checkbox fullbright" width="81" /> 1036 name="checkbox fullbright" width="81" />
@@ -1201,6 +1204,9 @@
1201 <button bottom="-360" follows="left|top" font="SansSerifSmall" halign="center" 1204 <button bottom="-360" follows="left|top" font="SansSerifSmall" halign="center"
1202 height="16" label="Align" label_selected="Align" left="112" 1205 height="16" label="Align" label_selected="Align" left="112"
1203 mouse_opaque="true" name="button align" scale_image="TRUE" width="68" /> 1206 mouse_opaque="true" name="button align" scale_image="TRUE" width="68" />
1207 <button bottom="-162" follows="left|top" font="SansSerif" halign="center"
1208 height="22" label="?" label_selected="?" right="-8" tool_tip="Texture math constants"
1209 mouse_opaque="true" name="texture_math_constants" scale_image="true" width="24" />
1204 </panel> 1210 </panel>
1205 <panel border="true" bottom="-383" follows="left|top|right|bottom" height="367" 1211 <panel border="true" bottom="-383" follows="left|top|right|bottom" height="367"
1206 label="Content" left="1" mouse_opaque="false" name="Contents" width="270"> 1212 label="Content" left="1" mouse_opaque="false" name="Contents" width="270">
diff --git a/linden/indra/newview/skins/default/xui/en-us/strings.xml b/linden/indra/newview/skins/default/xui/en-us/strings.xml
index e8c341e..dd73f20 100644
--- a/linden/indra/newview/skins/default/xui/en-us/strings.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/strings.xml
@@ -1,180 +1,180 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<!-- This file contains strings that used to be hardcoded in the source. 2<!-- This file contains strings that used to be hardcoded in the source.
3 It is only for those strings which don't belong in a floater. 3 It is only for those strings which don't belong in a floater.
4 For example, the strings used in avatar chat bubbles, and strings 4 For example, the strings used in avatar chat bubbles, and strings
5 that are returned from one component and may appear in many places--> 5 that are returned from one component and may appear in many places-->
6<strings> 6<strings>
7 7
8 <!-- Login --> 8 <!-- Login -->
9 <string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string> 9 <string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string>
10 <string name="LoginAuthenticating">Authenticating</string> 10 <string name="LoginAuthenticating">Authenticating</string>
11 <string name="LoginMaintenance">Performing account maintenance...</string> 11 <string name="LoginMaintenance">Performing account maintenance...</string>
12 <string name="LoginAttempt">Previous login attempt failed. Logging in, attempt [NUMBER]</string> 12 <string name="LoginAttempt">Previous login attempt failed. Logging in, attempt [NUMBER]</string>
13 <string name="LoginPrecaching">Loading world...</string> 13 <string name="LoginPrecaching">Loading world...</string>
14 <string name="LoginInitializingBrowser">Initializing embedded web browser...</string> 14 <string name="LoginInitializingBrowser">Initializing embedded web browser...</string>
15 <string name="LoginInitializingMultimedia">Initializing multimedia...</string> 15 <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
16 <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string> 16 <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
17 <string name="LoginProcessingResponse">Processing Response...</string> 17 <string name="LoginProcessingResponse">Processing Response...</string>
18 <string name="LoginInitializingWorld">Initializing World...</string> 18 <string name="LoginInitializingWorld">Initializing World...</string>
19 <string name="LoginDecodingImages">Decoding images...</string> 19 <string name="LoginDecodingImages">Decoding images...</string>
20 <string name="LoginInitializingQuicktime">Initializing QuickTime...</string> 20 <string name="LoginInitializingQuicktime">Initializing QuickTime...</string>
21 <string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string> 21 <string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string>
22 <string name="LoginQuicktimeOK">QuickTime initialized successfully.</string> 22 <string name="LoginQuicktimeOK">QuickTime initialized successfully.</string>
23 <string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string> 23 <string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
24 <string name="LoginConnectingToRegion">Connecting to region...</string> 24 <string name="LoginConnectingToRegion">Connecting to region...</string>
25 <string name="LoginDownloadingClothing">Downloading clothing...</string> 25 <string name="LoginDownloadingClothing">Downloading clothing...</string>
26 <string name="LoginFailedNoNetwork">Network Error: Could not establish connection, please check your network connection.</string> 26 <string name="LoginFailedNoNetwork">Network Error: Could not establish connection, please check your network connection.</string>
27 27
28 28
29 <!-- Disconnection --> 29 <!-- Disconnection -->
30 <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string> 30 <string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
31 31
32 32
33 <!-- Tooltip, llhoverview.cpp --> 33 <!-- Tooltip, llhoverview.cpp -->
34 <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar --> 34 <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
35 <string name="TooltipNoName">(no name)</string> <!-- No name on an object --> 35 <string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
36 <string name="TooltipOwner">Owner:</string> <!-- Owner name follows --> 36 <string name="TooltipOwner">Owner:</string> <!-- Owner name follows -->
37 <string name="TooltipPublic">Public</string> <!-- Public permissions on an object --> 37 <string name="TooltipPublic">Public</string> <!-- Public permissions on an object -->
38 <string name="TooltipIsGroup">(Group)</string> <!-- The name before this text is that of a group --> 38 <string name="TooltipIsGroup">(Group)</string> <!-- The name before this text is that of a group -->
39 <string name="TooltipFlagScript">Script</string> 39 <string name="TooltipFlagScript">Script</string>
40 <string name="TooltipFlagPhysics">Physics</string> 40 <string name="TooltipFlagPhysics">Physics</string>
41 <string name="TooltipFlagTouch">Touch</string> 41 <string name="TooltipFlagTouch">Touch</string>
42 <string name="TooltipFlagL$">L$</string> 42 <string name="TooltipFlagL$">L$</string>
43 <string name="TooltipFlagDropInventory">Drop Inventory</string> 43 <string name="TooltipFlagDropInventory">Drop Inventory</string>
44 <string name="TooltipFlagPhantom">Phantom</string> 44 <string name="TooltipFlagPhantom">Phantom</string>
45 <string name="TooltipFlagTemporary">Temporary</string> 45 <string name="TooltipFlagTemporary">Temporary</string>
46 <string name="TooltipFlagRightClickMenu">(Right-click for menu)</string> 46 <string name="TooltipFlagRightClickMenu">(Right-click for menu)</string>
47 <string name="TooltipFreeToCopy">Free to copy</string> 47 <string name="TooltipFreeToCopy">Free to copy</string>
48 <string name="TooltipForSaleL$">For Sale: L$[AMOUNT]</string> <!-- L$ version --> 48 <string name="TooltipForSaleL$">For Sale: L$[AMOUNT]</string> <!-- L$ version -->
49 <string name="TooltipForSaleMsg">For Sale: [MESSAGE]</string> <!-- Message (RetrievingData) --> 49 <string name="TooltipForSaleMsg">For Sale: [MESSAGE]</string> <!-- Message (RetrievingData) -->
50 <string name="TooltipFlagGroupBuild">Group Build</string> 50 <string name="TooltipFlagGroupBuild">Group Build</string>
51 <string name="TooltipFlagNoBuild">No Build</string> 51 <string name="TooltipFlagNoBuild">No Build</string>
52 <string name="TooltipFlagNoEdit">Group Build</string> 52 <string name="TooltipFlagNoEdit">Group Build</string>
53 <string name="TooltipFlagNotSafe">Not Safe</string><!-- damage area --> 53 <string name="TooltipFlagNotSafe">Not Safe</string><!-- damage area -->
54 <string name="TooltipFlagNoFly">No Fly</string> 54 <string name="TooltipFlagNoFly">No Fly</string>
55 <string name="TooltipFlagGroupScripts">Group Scripts</string> 55 <string name="TooltipFlagGroupScripts">Group Scripts</string>
56 <string name="TooltipFlagNoScripts">No Scripts</string> 56 <string name="TooltipFlagNoScripts">No Scripts</string>
57 <string name="TooltipLand">Land:</string> 57 <string name="TooltipLand">Land:</string>
58 <string name="TooltipMustSingleDrop">Only a single item can be dragged here</string> 58 <string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
59 59
60 60
61 <!-- Indicates that an avatar's name or other similar datum is being retrieved. General usage. --> 61 <!-- Indicates that an avatar's name or other similar datum is being retrieved. General usage. -->
62 <string name="RetrievingData">Retrieving...</string> 62 <string name="RetrievingData">Retrieving...</string>
63 63
64 <string name="ReleaseNotes">Release Notes</string> 64 <string name="ReleaseNotes">Release Notes</string>
65 65
66 <!-- Indicates something is being loaded. Maybe should be merged with RetrievingData --> 66 <!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
67 <string name="LoadingData">Loading...</string> 67 <string name="LoadingData">Loading...</string>
68 68
69 69
70 <!-- namecache --> 70 <!-- namecache -->
71 <!-- Avatar name: text shown for LLUUID::null --> 71 <!-- Avatar name: text shown for LLUUID::null -->
72 <string name="AvatarNameNobody">(nobody)</string> 72 <string name="AvatarNameNobody">(nobody)</string>
73 73
74 <!-- Avatar name: text shown while fetching name --> 74 <!-- Avatar name: text shown while fetching name -->
75 <string name="AvatarNameWaiting">(waiting)</string> 75 <string name="AvatarNameWaiting">(waiting)</string>
76 76
77 <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. --> 77 <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. -->
78 <string name="AvatarNameHippos">(hippos)</string> 78 <string name="AvatarNameHippos">(hippos)</string>
79 79
80 <!-- Group name: text shown for LLUUID::null --> 80 <!-- Group name: text shown for LLUUID::null -->
81 <string name="GroupNameNone">(none)</string> 81 <string name="GroupNameNone">(none)</string>
82 82
83 <!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. --> 83 <!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
84 <string name="AssetErrorNone">No error</string> 84 <string name="AssetErrorNone">No error</string>
85 <string name="AssetErrorRequestFailed">Asset request: failed</string> 85 <string name="AssetErrorRequestFailed">Asset request: failed</string>
86 <string name="AssetErrorNonexistentFile">Asset request: non-existent file</string> 86 <string name="AssetErrorNonexistentFile">Asset request: non-existent file</string>
87 <string name="AssetErrorNotInDatabase">Asset request: asset not found in database</string> 87 <string name="AssetErrorNotInDatabase">Asset request: asset not found in database</string>
88 <string name="AssetErrorEOF">End of file</string> 88 <string name="AssetErrorEOF">End of file</string>
89 <string name="AssetErrorCannotOpenFile">Cannot open file</string> 89 <string name="AssetErrorCannotOpenFile">Cannot open file</string>
90 <string name="AssetErrorFileNotFound">File not found</string> 90 <string name="AssetErrorFileNotFound">File not found</string>
91 <string name="AssetErrorTCPTimeout">File transfer timeout</string> 91 <string name="AssetErrorTCPTimeout">File transfer timeout</string>
92 <string name="AssetErrorCircuitGone">Circuit gone</string> 92 <string name="AssetErrorCircuitGone">Circuit gone</string>
93 <string name="AssetErrorUnknownStatus">Unknown status</string> 93 <string name="AssetErrorUnknownStatus">Unknown status</string>
94 94
95 <!-- llvoavatar. Displayed in the avatar's chat bubble --> 95 <!-- llvoavatar. Displayed in the avatar's chat bubble -->
96 <string name="AvatarEditingApparance">(Editing Appearance)</string> 96 <string name="AvatarEditingApparance">(Editing Appearance)</string>
97 <string name="AvatarAway">Away</string> 97 <string name="AvatarAway">Away</string>
98 <string name="AvatarBusy">Busy</string> 98 <string name="AvatarBusy">Busy</string>
99 <string name="AvatarMuted">Muted</string> 99 <string name="AvatarMuted">Muted</string>
100 100
101 <!-- animations --> 101 <!-- animations -->
102 <string name="anim_express_afraid">Afraid</string> 102 <string name="anim_express_afraid">Afraid</string>
103 <string name="anim_express_anger">Angry</string> 103 <string name="anim_express_anger">Angry</string>
104 <string name="anim_away">Away</string> 104 <string name="anim_away">Away</string>
105 <string name="anim_backflip">Backflip</string> 105 <string name="anim_backflip">Backflip</string>
106 <string name="anim_express_laugh">Belly Laugh</string> 106 <string name="anim_express_laugh">Belly Laugh</string>
107 <string name="anim_express_toothsmile">BigSmile</string> 107 <string name="anim_express_toothsmile">BigSmile</string>
108 <string name="anim_blowkiss">Blow Kiss</string> 108 <string name="anim_blowkiss">Blow Kiss</string>
109 <string name="anim_express_bored">Bored</string> 109 <string name="anim_express_bored">Bored</string>
110 <string name="anim_bow">Bow</string> 110 <string name="anim_bow">Bow</string>
111 <string name="anim_clap">Clap</string> 111 <string name="anim_clap">Clap</string>
112 <string name="anim_courtbow">Court Bow</string> 112 <string name="anim_courtbow">Court Bow</string>
113 <string name="anim_express_cry">Cry</string> 113 <string name="anim_express_cry">Cry</string>
114 <string name="anim_dance1">Dance 1</string> 114 <string name="anim_dance1">Dance 1</string>
115 <string name="anim_dance2">Dance 2</string> 115 <string name="anim_dance2">Dance 2</string>
116 <string name="anim_dance3">Dance 3</string> 116 <string name="anim_dance3">Dance 3</string>
117 <string name="anim_dance4">Dance 4</string> 117 <string name="anim_dance4">Dance 4</string>
118 <string name="anim_dance5">Dance 5</string> 118 <string name="anim_dance5">Dance 5</string>
119 <string name="anim_dance6">Dance 6</string> 119 <string name="anim_dance6">Dance 6</string>
120 <string name="anim_dance7">Dance 7</string> 120 <string name="anim_dance7">Dance 7</string>
121 <string name="anim_dance8">Dance 8</string> 121 <string name="anim_dance8">Dance 8</string>
122 <string name="anim_express_disdain">Disdain</string> 122 <string name="anim_express_disdain">Disdain</string>
123 <string name="anim_drink">Drink</string> 123 <string name="anim_drink">Drink</string>
124 <string name="anim_express_embarrased">Embarrassed</string> 124 <string name="anim_express_embarrased">Embarrassed</string>
125 <string name="anim_angry_fingerwag">Finger Wag</string> 125 <string name="anim_angry_fingerwag">Finger Wag</string>
126 <string name="anim_fist_pump">Fist Pump</string> 126 <string name="anim_fist_pump">Fist Pump</string>
127 <string name="anim_yoga_float">Floating Yoga</string> 127 <string name="anim_yoga_float">Floating Yoga</string>
128 <string name="anim_express_frown">Frown</string> 128 <string name="anim_express_frown">Frown</string>
129 <string name="anim_impatient">Impatient</string> 129 <string name="anim_impatient">Impatient</string>
130 <string name="anim_jumpforjoy">Jump For Joy</string> 130 <string name="anim_jumpforjoy">Jump For Joy</string>
131 <string name="anim_kissmybutt">Kiss My Butt</string> 131 <string name="anim_kissmybutt">Kiss My Butt</string>
132 <string name="anim_express_kiss">Kiss</string> 132 <string name="anim_express_kiss">Kiss</string>
133 <string name="anim_laugh_short">Laugh</string> 133 <string name="anim_laugh_short">Laugh</string>
134 <string name="anim_musclebeach">Muscle Beach</string> 134 <string name="anim_musclebeach">Muscle Beach</string>
135 <string name="anim_no_unhappy">No (Unhappy)</string> 135 <string name="anim_no_unhappy">No (Unhappy)</string>
136 <string name="anim_no_head">No</string> 136 <string name="anim_no_head">No</string>
137 <string name="anim_nyanya">Nya-nya-nya</string> 137 <string name="anim_nyanya">Nya-nya-nya</string>
138 <string name="anim_punch_onetwo">One-Two Punch</string> 138 <string name="anim_punch_onetwo">One-Two Punch</string>
139 <string name="anim_express_open_mouth">Open Mouth</string> 139 <string name="anim_express_open_mouth">Open Mouth</string>
140 <string name="anim_peace">Peace</string> 140 <string name="anim_peace">Peace</string>
141 <string name="anim_point_you">Point at Other</string> 141 <string name="anim_point_you">Point at Other</string>
142 <string name="anim_point_me">Point at Self</string> 142 <string name="anim_point_me">Point at Self</string>
143 <string name="anim_punch_l">Punch Left</string> 143 <string name="anim_punch_l">Punch Left</string>
144 <string name="anim_punch_r">Punch Right</string> 144 <string name="anim_punch_r">Punch Right</string>
145 <string name="anim_rps_countdown">RPS count</string> 145 <string name="anim_rps_countdown">RPS count</string>
146 <string name="anim_rps_paper">RPS paper</string> 146 <string name="anim_rps_paper">RPS paper</string>
147 <string name="anim_rps_rock">RPS rock</string> 147 <string name="anim_rps_rock">RPS rock</string>
148 <string name="anim_rps_scissors">RPS scissors</string> 148 <string name="anim_rps_scissors">RPS scissors</string>
149 <string name="anim_express_repulsed">Repulsed</string> 149 <string name="anim_express_repulsed">Repulsed</string>
150 <string name="anim_kick_roundhouse_r">Roundhouse Kick</string> 150 <string name="anim_kick_roundhouse_r">Roundhouse Kick</string>
151 <string name="anim_express_sad">Sad</string> 151 <string name="anim_express_sad">Sad</string>
152 <string name="anim_salute">Salute</string> 152 <string name="anim_salute">Salute</string>
153 <string name="anim_shout">Shout</string> 153 <string name="anim_shout">Shout</string>
154 <string name="anim_express_shrug">Shrug</string> 154 <string name="anim_express_shrug">Shrug</string>
155 <string name="anim_express_smile">Smile</string> 155 <string name="anim_express_smile">Smile</string>
156 <string name="anim_smoke_idle">Smoke Idle</string> 156 <string name="anim_smoke_idle">Smoke Idle</string>
157 <string name="anim_smoke_inhale">Smoke Inhale</string> 157 <string name="anim_smoke_inhale">Smoke Inhale</string>
158 <string name="anim_smoke_throw_down">Smoke Throw Down</string> 158 <string name="anim_smoke_throw_down">Smoke Throw Down</string>
159 <string name="anim_express_surprise">Surprise</string> 159 <string name="anim_express_surprise">Surprise</string>
160 <string name="anim_sword_strike_r">Sword Strike</string> 160 <string name="anim_sword_strike_r">Sword Strike</string>
161 <string name="anim_angry_tantrum">Tantrum</string> 161 <string name="anim_angry_tantrum">Tantrum</string>
162 <string name="anim_express_tongue_out">TongueOut</string> 162 <string name="anim_express_tongue_out">TongueOut</string>
163 <string name="anim_hello">Wave</string> 163 <string name="anim_hello">Wave</string>
164 <string name="anim_whisper">Whisper</string> 164 <string name="anim_whisper">Whisper</string>
165 <string name="anim_whistle">Whistle</string> 165 <string name="anim_whistle">Whistle</string>
166 <string name="anim_express_wink">Wink</string> 166 <string name="anim_express_wink">Wink</string>
167 <string name="anim_wink_hollywood">Wink (Hollywood)</string> 167 <string name="anim_wink_hollywood">Wink (Hollywood)</string>
168 <string name="anim_express_worry">Worry</string> 168 <string name="anim_express_worry">Worry</string>
169 <string name="anim_yes_happy">Yes (Happy)</string> 169 <string name="anim_yes_happy">Yes (Happy)</string>
170 <string name="anim_yes_head">Yes</string> 170 <string name="anim_yes_head">Yes</string>
171 171
172 <string name="texture_loading">Loading...</string> 172 <string name="texture_loading">Loading...</string>
173 <string name="worldmap_offline">Offline</string> 173 <string name="worldmap_offline">Offline</string>
174 174
175 <!-- Chat --> 175 <!-- Chat -->
176 <string name="whisper">whispers:</string> 176 <string name="whisper">whispers:</string>
177 <string name="shout">shouts:</string> 177 <string name="shout">shouts:</string>
178 178
179</strings> 179</strings>
180 180