summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llcursortypes.cpp6
-rw-r--r--indra/llcommon/llcursortypes.h6
-rw-r--r--indra/llcommon/llfasttimer.h14
-rw-r--r--indra/llrender/llfontgl.cpp6
-rw-r--r--indra/llui/lldockablefloater.cpp10
-rw-r--r--indra/llui/lldockablefloater.h3
-rw-r--r--indra/llui/lldockcontrol.cpp22
-rw-r--r--indra/llui/llfloater.cpp3
-rw-r--r--indra/llui/llfloater.h13
-rw-r--r--indra/llui/llmenubutton.cpp6
-rw-r--r--indra/llui/llmenubutton.h1
-rw-r--r--indra/llui/llpanel.cpp2
-rw-r--r--indra/llui/llscrolllistctrl.cpp2
-rw-r--r--indra/llui/lltextbase.cpp320
-rw-r--r--indra/llui/lltextbase.h4
-rw-r--r--indra/llui/lltextbox.cpp75
-rw-r--r--indra/llui/lltextbox.h1
-rw-r--r--indra/llui/lltooltip.cpp12
-rw-r--r--indra/llui/lluictrlfactory.h2
-rw-r--r--indra/llwindow/llwindowmacosx.cpp12
-rw-r--r--indra/llwindow/llwindowsdl.cpp4
-rw-r--r--indra/llwindow/llwindowwin32.cpp4
-rw-r--r--indra/newview/CMakeLists.txt8
-rw-r--r--indra/newview/app_settings/settings.xml12
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tifbin14776 -> 0 bytes
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tifbin15144 -> 0 bytes
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tifbin15176 -> 0 bytes
-rw-r--r--indra/newview/llavataractions.cpp4
-rw-r--r--indra/newview/llexpandabletextbox.cpp339
-rw-r--r--indra/newview/llexpandabletextbox.h45
-rw-r--r--indra/newview/llfloateravatarpicker.cpp60
-rw-r--r--indra/newview/llfloateravatarpicker.h6
-rw-r--r--indra/newview/llfloaterbuy.cpp5
-rw-r--r--indra/newview/llfloaterbuy.h2
-rw-r--r--indra/newview/llfloaterhelpbrowser.cpp7
-rw-r--r--indra/newview/llfloaterhelpbrowser.h2
-rw-r--r--indra/newview/llfloatermediabrowser.cpp2
-rw-r--r--indra/newview/llfloatermediasettings.cpp29
-rw-r--r--indra/newview/llfloatermediasettings.h14
-rw-r--r--indra/newview/llfloateropenobject.h1
-rw-r--r--indra/newview/llfloaterpay.cpp573
-rw-r--r--indra/newview/llfloaterpay.h61
-rw-r--r--indra/newview/llfloaterpreference.cpp5
-rw-r--r--indra/newview/llfloaterpreference.h10
-rw-r--r--indra/newview/llfloatersellland.cpp5
-rw-r--r--indra/newview/llfloatertools.cpp378
-rw-r--r--indra/newview/llfloatertools.h5
-rw-r--r--indra/newview/llfloateruipreview.cpp6
-rw-r--r--indra/newview/llfloateruipreview.h7
-rw-r--r--indra/newview/llfloatervoicedevicesettings.cpp7
-rw-r--r--indra/newview/llfloatervoicedevicesettings.h7
-rw-r--r--indra/newview/llfloaterworldmap.cpp5
-rw-r--r--indra/newview/llfloaterworldmap.h5
-rw-r--r--indra/newview/llimfloater.cpp5
-rw-r--r--indra/newview/llimfloater.h5
-rw-r--r--indra/newview/llimpanel.cpp5
-rw-r--r--indra/newview/llimpanel.h2
-rw-r--r--indra/newview/llinspectavatar.cpp10
-rw-r--r--indra/newview/llinspectobject.cpp10
-rw-r--r--indra/newview/llmediactrl.cpp4
-rw-r--r--indra/newview/llnearbychat.h6
-rw-r--r--indra/newview/llpanelavatar.h4
-rw-r--r--indra/newview/llpanelface.cpp4
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp106
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.h12
-rw-r--r--indra/newview/llpanelmediasettingspermissions.cpp45
-rw-r--r--indra/newview/llpanelmediasettingspermissions.h4
-rw-r--r--indra/newview/llpanelmediasettingssecurity.cpp30
-rw-r--r--indra/newview/llpanelmediasettingssecurity.h4
-rw-r--r--indra/newview/llpanelpicks.cpp3
-rw-r--r--indra/newview/llpanelpicks.h2
-rw-r--r--indra/newview/llpanelplaceinfo.cpp199
-rw-r--r--indra/newview/llpanelplaceinfo.h15
-rw-r--r--indra/newview/llpanelplaces.cpp437
-rw-r--r--indra/newview/llpanelplaces.h25
-rw-r--r--indra/newview/llpanelprofile.cpp2
-rw-r--r--indra/newview/llpreviewanim.cpp5
-rw-r--r--indra/newview/llpreviewanim.h2
-rw-r--r--indra/newview/llpreviewgesture.cpp8
-rw-r--r--indra/newview/llpreviewgesture.h4
-rw-r--r--indra/newview/llselectmgr.h52
-rw-r--r--indra/newview/llsyswellwindow.cpp4
-rw-r--r--indra/newview/llsyswellwindow.h2
-rw-r--r--indra/newview/lltexturectrl.cpp14
-rw-r--r--indra/newview/lltoastalertpanel.cpp1
-rw-r--r--indra/newview/lltoolpie.cpp26
-rw-r--r--indra/newview/llviewerfloaterreg.cpp5
-rw-r--r--indra/newview/llviewermedia.cpp3
-rw-r--r--indra/newview/llviewermenu.cpp21
-rw-r--r--indra/newview/llviewermessage.cpp17
-rw-r--r--indra/newview/res/toolbuy.curbin2238 -> 0 bytes
-rw-r--r--indra/newview/res/toolopen.curbin2238 -> 0 bytes
-rw-r--r--indra/newview/res/toolsit.curbin2238 -> 0 bytes
-rw-r--r--indra/newview/res/viewerRes.rc4
-rw-r--r--indra/newview/skins/default/textures/textures.xml17
-rw-r--r--indra/newview/skins/default/xui/da/floater_camera.xml18
-rw-r--r--indra/newview/skins/default/xui/da/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_camera.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml33
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_widgets.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_whitelist_entry.xml48
-rw-r--r--indra/newview/skins/default/xui/en/inspect_avatar.xml159
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml89
-rw-r--r--indra/newview/skins/default/xui/en/language_settings.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml54
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml97
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml156
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml52
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml823
-rw-r--r--indra/newview/skins/default/xui/en/widgets/combo_box.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/expandable_text.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_list.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml20
-rw-r--r--indra/newview/skins/default/xui/es/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_camera.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_camera.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml18
-rw-r--r--indra/newview/skins/default/xui/nl/floater_camera.xml18
-rw-r--r--indra/newview/skins/default/xui/nl/floater_color_picker.xml2
-rwxr-xr-xindra/newview/skins/default/xui/pl/floater_camera.xml18
-rwxr-xr-xindra/newview/skins/default/xui/pl/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_camera.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/floater_color_picker.xml2
-rwxr-xr-xindra/newview/viewer_manifest.py16
132 files changed, 3214 insertions, 1805 deletions
diff --git a/indra/llcommon/llcursortypes.cpp b/indra/llcommon/llcursortypes.cpp
index 7444115aa1..23ede97af3 100644
--- a/indra/llcommon/llcursortypes.cpp
+++ b/indra/llcommon/llcursortypes.cpp
@@ -30,6 +30,8 @@
* $/LicenseInfo$
*/
+#include "linden_common.h"
+
#include "llcursortypes.h"
ECursorType getCursorFromString(const std::string& cursor_string)
@@ -66,10 +68,6 @@ ECursorType getCursorFromString(const std::string& cursor_string)
cursor_string_table["UI_CURSOR_TOOLPAN"] = UI_CURSOR_TOOLPAN;
cursor_string_table["UI_CURSOR_TOOLZOOMIN"] = UI_CURSOR_TOOLZOOMIN;
cursor_string_table["UI_CURSOR_TOOLPICKOBJECT3"] = UI_CURSOR_TOOLPICKOBJECT3;
- cursor_string_table["UI_CURSOR_TOOLSIT"] = UI_CURSOR_TOOLSIT;
- cursor_string_table["UI_CURSOR_TOOLBUY"] = UI_CURSOR_TOOLBUY;
- cursor_string_table["UI_CURSOR_TOOLPAY"] = UI_CURSOR_TOOLPAY;
- cursor_string_table["UI_CURSOR_TOOLOPEN"] = UI_CURSOR_TOOLOPEN;
cursor_string_table["UI_CURSOR_TOOLPLAY"] = UI_CURSOR_TOOLPLAY;
cursor_string_table["UI_CURSOR_TOOLPAUSE"] = UI_CURSOR_TOOLPAUSE;
cursor_string_table["UI_CURSOR_TOOLMEDIAOPEN"] = UI_CURSOR_TOOLMEDIAOPEN;
diff --git a/indra/llcommon/llcursortypes.h b/indra/llcommon/llcursortypes.h
index bea70351b7..35dbeaf16e 100644
--- a/indra/llcommon/llcursortypes.h
+++ b/indra/llcommon/llcursortypes.h
@@ -33,8 +33,6 @@
#ifndef LL_LLCURSORTYPES_H
#define LL_LLCURSORTYPES_H
-#include "linden_common.h"
-
// If you add types here, add them in LLCursor::getCursorFromString
enum ECursorType {
UI_CURSOR_ARROW,
@@ -66,10 +64,6 @@ enum ECursorType {
UI_CURSOR_TOOLPAN,
UI_CURSOR_TOOLZOOMIN,
UI_CURSOR_TOOLPICKOBJECT3,
- UI_CURSOR_TOOLSIT,
- UI_CURSOR_TOOLBUY,
- UI_CURSOR_TOOLPAY,
- UI_CURSOR_TOOLOPEN,
UI_CURSOR_TOOLPLAY,
UI_CURSOR_TOOLPAUSE,
UI_CURSOR_TOOLMEDIAOPEN,
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 0d89353dee..c2f23f6ff6 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -114,8 +114,9 @@ public:
// recursive call to gather total time from children
static void accumulateTimings();
- // called once per frame by LLFastTimer
- static void processFrame();
+ // updates cumulative times and hierarchy,
+ // can be called multiple times in a frame, at any point
+ static void processTimes();
static void buildHierarchy();
static void resetFrame();
@@ -178,8 +179,9 @@ public:
{
#if FAST_TIMER_ON
NamedTimer::FrameState* frame_state = mFrameState;
- frame_state->mLastStartTime = get_cpu_clock_count();
- mStartSelfTime = frame_state->mLastStartTime;
+ U64 cur_time = get_cpu_clock_count();
+ frame_state->mLastStartTime = cur_time;
+ mStartSelfTime = cur_time;
frame_state->mActiveCount++;
frame_state->mCalls++;
@@ -215,6 +217,10 @@ public:
// call this once a frame to reset timers
static void nextFrame();
+ // dumps current cumulative frame stats to log
+ // call nextFrame() to reset timers
+ static void dumpCurTimes();
+
// call this to reset timer hierarchy, averages, etc.
static void reset();
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 8f943182b8..f7bab3de67 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -208,10 +208,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
case LEFT:
break;
case RIGHT:
- cur_x -= llmin(scaled_max_pixels, llround(getWidthF32(wstr.c_str(), 0, length) * sScaleX));
+ cur_x -= llmin(scaled_max_pixels, llround(getWidthF32(wstr.c_str(), begin_offset, length) * sScaleX));
break;
case HCENTER:
- cur_x -= llmin(scaled_max_pixels, llround(getWidthF32(wstr.c_str(), 0, length) * sScaleX)) / 2;
+ cur_x -= llmin(scaled_max_pixels, llround(getWidthF32(wstr.c_str(), begin_offset, length) * sScaleX)) / 2;
break;
default:
break;
@@ -234,7 +234,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
if (use_ellipses)
{
// check for too long of a string
- if (getWidthF32(wstr.c_str(), 0, max_chars) * sScaleX > scaled_max_pixels)
+ if (getWidthF32(wstr.c_str(), begin_offset, max_chars) * sScaleX > scaled_max_pixels)
{
// use four dots for ellipsis width to generate padding
const LLWString dots(utf8str_to_wstring(std::string("....")));
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 4525f0a45b..c512ef25be 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -91,6 +91,16 @@ void LLDockableFloater::setVisible(BOOL visible)
LLFloater::setVisible(visible);
}
+void LLDockableFloater::onDockHidden()
+{
+ setCanDock(FALSE);
+}
+
+void LLDockableFloater::onDockShown()
+{
+ setCanDock(TRUE);
+}
+
void LLDockableFloater::setDocked(bool docked, bool pop_on_undock)
{
if (mDockControl.get() != NULL && mDockControl.get()->isDockVisible())
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index ed90567ad3..7d91d007ee 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -68,6 +68,9 @@ public:
*/
/*virtual*/ void setVisible(BOOL visible);
+ virtual void onDockHidden();
+ virtual void onDockShown();
+
private:
/**
* Provides unique of dockable floater.
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index 146c7a969a..cdcd823b1c 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -33,6 +33,7 @@
#include "linden_common.h"
#include "lldockcontrol.h"
+#include "lldockablefloater.h"
LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) :
@@ -91,8 +92,8 @@ void LLDockControl::repositionDockable()
// recalculate dockable position if dock position changed, dock visibility changed,
// root view rect changed or recalculation is forced
- if (mEnabled && (mPrevDockRect != dockRect || prev_visibility != mDockWidget->getVisible()
- || mRootRect != rootRect || mRecalculateDocablePosition))
+ if (mPrevDockRect != dockRect || prev_visibility != mDockWidget->getVisible()
+ || mRootRect != rootRect || mRecalculateDocablePosition)
{
// undock dockable and off() if dock not visible
if (!isDockVisible())
@@ -100,10 +101,25 @@ void LLDockControl::repositionDockable()
mDockableFloater->setDocked(false);
// force off() since dockable may not have dockControll at this time
off();
+ LLDockableFloater* dockable_floater =
+ dynamic_cast<LLDockableFloater*> (mDockableFloater);
+ if(dockable_floater != NULL)
+ {
+ dockable_floater->onDockHidden();
+ }
}
else
{
- moveDockable();
+ if(mEnabled)
+ {
+ moveDockable();
+ }
+ LLDockableFloater* dockable_floater =
+ dynamic_cast<LLDockableFloater*> (mDockableFloater);
+ if(dockable_floater != NULL)
+ {
+ dockable_floater->onDockShown();
+ }
}
mPrevDockRect = dockRect;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 564e4d748f..b7a15a2b33 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -664,7 +664,8 @@ void LLFloater::closeFloater(bool app_quitting)
dirtyRect();
- // Close callback
+ // Close callbacks
+ onClose(app_quitting);
mCloseSignal(this, LLSD(app_quitting));
// Hide or Destroy
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 1dc5177f81..17ffc94014 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -208,8 +208,8 @@ public:
virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
virtual void draw();
- // *TODO: Eliminate this in favor of mOpenSignal
virtual void onOpen(const LLSD& key) {}
+ virtual void onClose(bool app_quitting) {}
// This cannot be "const" until all derived floater canClose()
// methods are const as well. JC
@@ -293,11 +293,18 @@ private:
void addResizeCtrls();
void addDragHandle();
+public:
+ // Called when floater is opened, passes mKey
+ // Public so external views or floaters can watch for this floater opening
+ commit_signal_t mOpenSignal;
+
+ // Called when floater is closed, passes app_qitting as LLSD()
+ // Public so external views or floaters can watch for this floater closing
+ commit_signal_t mCloseSignal;
+
protected:
std::string mRectControl;
std::string mVisibilityControl;
- commit_signal_t mOpenSignal; // Called when floater is opened, passes mKey
- commit_signal_t mCloseSignal; // Called when floater is closed, passes app_qitting as LLSD()
LLSD mKey; // Key used for retrieving instances; set (for now) by LLFLoaterReg
LLDragHandle* mDragHandle;
diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp
index 2bb6749c83..8dbcd6e229 100644
--- a/indra/llui/llmenubutton.cpp
+++ b/indra/llui/llmenubutton.cpp
@@ -83,6 +83,12 @@ void LLMenuButton::toggleMenu()
}
+void LLMenuButton::hideMenu()
+{
+ mMenu->setVisible(FALSE);
+}
+
+
BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )
{
if( KEY_RETURN == key && mask == MASK_NONE && !gKeyboard->getKeyRepeated(key))
diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h
index 94b0e4355d..02eb9d3806 100644
--- a/indra/llui/llmenubutton.h
+++ b/indra/llui/llmenubutton.h
@@ -54,6 +54,7 @@ public:
/*virtual*/ void draw();
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
+ void hideMenu();
protected:
friend class LLUICtrlFactory;
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 1695aee2b8..69ff3dddc3 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -522,7 +522,7 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
// be built/added. JC
if (parent)
{
- S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : -1;
+ S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : parent->getLastTabGroup();
parent->addChild(this, tab_group);
}
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index af05686c70..7b74b1f93b 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -1566,7 +1566,7 @@ BOOL LLScrollListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(hit_cell->getValue().asString())
.font(LLFontGL::getFontSansSerifSmall())
- .pos(LLCoordGL(sticky_rect.mLeft - 5, sticky_rect.mTop + 4))
+ .pos(LLCoordGL(sticky_rect.mLeft - 5, sticky_rect.mTop + 6))
.delay_time(0.2f)
.sticky_rect(sticky_rect));
}
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 6c048aa908..3dacf979c7 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -209,7 +209,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mWordWrap(p.wrap),
mUseEllipses( p.use_ellipses ),
mParseHTML(p.allow_html),
- mParseHighlights(p.parse_highlights)
+ mParseHighlights(p.parse_highlights),
+ mHideScrollbar(p.hide_scrollbar)
{
LLScrollContainer::Params scroll_params;
scroll_params.name = "text scroller";
@@ -278,7 +279,9 @@ bool LLTextBase::truncate()
// Truncate safely in UTF-8
std::string temp_utf8_text = wstring_to_utf8str(text);
temp_utf8_text = utf8str_truncate( temp_utf8_text, mMaxTextByteLength );
- getViewModel()->setDisplay(utf8str_to_wstring( temp_utf8_text ));
+ LLWString text = utf8str_to_wstring( temp_utf8_text );
+ // remove extra bit of current string, to preserve formatting, etc.
+ removeStringNoUndo(text.size(), getWText().size() - text.size());
did_truncate = TRUE;
}
}
@@ -755,47 +758,63 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert)
// split old at start point for new segment
cur_segmentp->setEnd(segment_to_insert->getStart());
// advance to next segment
- ++cur_seg_iter;
// insert remainder of old segment
LLTextSegmentPtr remainder_segment = new LLNormalTextSegment( cur_segmentp->getStyle(), segment_to_insert->getStart(), old_segment_end, *this);
- cur_seg_iter = mSegments.insert(cur_seg_iter, remainder_segment);
+ mSegments.insert(cur_seg_iter, remainder_segment);
remainder_segment->linkToDocument(this);
// insert new segment before remainder of old segment
- cur_seg_iter = mSegments.insert(cur_seg_iter, segment_to_insert);
+ mSegments.insert(cur_seg_iter, segment_to_insert);
segment_to_insert->linkToDocument(this);
- // move to "remanider" segment and start truncation there
- ++cur_seg_iter;
+ // at this point, there will be two overlapping segments owning the text
+ // associated with the incoming segment
}
else
{
- cur_seg_iter = mSegments.insert(cur_seg_iter, segment_to_insert);
- ++cur_seg_iter;
+ mSegments.insert(cur_seg_iter, segment_to_insert);
segment_to_insert->linkToDocument(this);
}
// now delete/truncate remaining segments as necessary
+ // cur_seg_iter points to segment before incoming segment
while(cur_seg_iter != mSegments.end())
{
cur_segmentp = *cur_seg_iter;
- if (cur_segmentp->getEnd() <= segment_to_insert->getEnd())
+ if (cur_segmentp == segment_to_insert)
{
- cur_segmentp->unlinkFromDocument(this);
- segment_set_t::iterator seg_to_erase(cur_seg_iter++);
- mSegments.erase(seg_to_erase);
+ ++cur_seg_iter;
+ continue;
}
- else
+
+ if (cur_segmentp->getStart() >= segment_to_insert->getStart())
{
- cur_segmentp->setStart(segment_to_insert->getEnd());
- break;
+ if(cur_segmentp->getEnd() <= segment_to_insert->getEnd())
+ {
+ cur_segmentp->unlinkFromDocument(this);
+ // grab copy of iterator to erase, and bump it
+ segment_set_t::iterator seg_to_erase(cur_seg_iter++);
+ mSegments.erase(seg_to_erase);
+ continue;
+ }
+ else
+ {
+ // last overlapping segment, clip to end of incoming segment
+ // and stop traversal
+ cur_segmentp->setStart(segment_to_insert->getEnd());
+ break;
+ }
}
+ ++cur_seg_iter;
}
}
+
+ // layout potentially changed
+ needsReflow();
}
BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleMouseDown(x, y, mask))
{
return TRUE;
@@ -806,7 +825,7 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleMouseUp(x, y, mask))
{
// Did we just click on a link?
@@ -824,7 +843,7 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleMiddleMouseDown(x, y, mask))
{
return TRUE;
@@ -835,7 +854,7 @@ BOOL LLTextBase::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleMiddleMouseUp(x, y, mask))
{
return TRUE;
@@ -846,7 +865,7 @@ BOOL LLTextBase::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleRightMouseDown(x, y, mask))
{
return TRUE;
@@ -857,7 +876,7 @@ BOOL LLTextBase::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleRightMouseUp(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleRightMouseUp(x, y, mask))
{
return TRUE;
@@ -868,7 +887,7 @@ BOOL LLTextBase::handleRightMouseUp(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleDoubleClick(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleDoubleClick(x, y, mask))
{
return TRUE;
@@ -879,7 +898,7 @@ BOOL LLTextBase::handleDoubleClick(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleHover(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleHover(x, y, mask))
{
return TRUE;
@@ -890,7 +909,7 @@ BOOL LLTextBase::handleHover(S32 x, S32 y, MASK mask)
BOOL LLTextBase::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleScrollWheel(x, y, clicks))
{
return TRUE;
@@ -901,7 +920,7 @@ BOOL LLTextBase::handleScrollWheel(S32 x, S32 y, S32 clicks)
BOOL LLTextBase::handleToolTip(S32 x, S32 y, MASK mask)
{
- LLTextSegment* cur_segment = getSegmentAtLocalPos(x, y);
+ LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y);
if (cur_segment && cur_segment->handleToolTip(x, y, mask))
{
return TRUE;
@@ -1040,109 +1059,106 @@ void LLTextBase::reflow(S32 start_index)
S32 cur_top = 0;
- if (getLength())
+ segment_set_t::iterator seg_iter = mSegments.begin();
+ S32 seg_offset = 0;
+ S32 line_start_index = 0;
+ const S32 text_width = mTextRect.getWidth(); // optionally reserve room for margin
+ S32 remaining_pixels = text_width;
+ LLWString text(getWText());
+ S32 line_count = 0;
+
+ // find and erase line info structs starting at start_index and going to end of document
+ if (!mLineInfoList.empty())
{
- segment_set_t::iterator seg_iter = mSegments.begin();
- S32 seg_offset = 0;
- S32 line_start_index = 0;
- const S32 text_width = mTextRect.getWidth(); // optionally reserve room for margin
- S32 remaining_pixels = text_width;
- LLWString text(getWText());
- S32 line_count = 0;
-
- // find and erase line info structs starting at start_index and going to end of document
- if (!mLineInfoList.empty())
- {
- // find first element whose end comes after start_index
- line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());
- line_start_index = iter->mDocIndexStart;
- line_count = iter->mLineNum;
- getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);
- mLineInfoList.erase(iter, mLineInfoList.end());
- }
+ // find first element whose end comes after start_index
+ line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());
+ line_start_index = iter->mDocIndexStart;
+ line_count = iter->mLineNum;
+ getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);
+ mLineInfoList.erase(iter, mLineInfoList.end());
+ }
- S32 line_height = 0;
+ S32 line_height = 0;
- while(seg_iter != mSegments.end())
+ while(seg_iter != mSegments.end())
+ {
+ LLTextSegmentPtr segment = *seg_iter;
+
+ // track maximum height of any segment on this line
+ line_height = llmax(line_height, segment->getMaxHeight());
+ S32 cur_index = segment->getStart() + seg_offset;
+ // find run of text from this segment that we can display on one line
+ S32 end_index = cur_index;
+ while(end_index < segment->getEnd() && text[end_index] != '\n')
{
- LLTextSegmentPtr segment = *seg_iter;
-
- // track maximum height of any segment on this line
- line_height = llmax(line_height, segment->getMaxHeight());
- S32 cur_index = segment->getStart() + seg_offset;
- // find run of text from this segment that we can display on one line
- S32 end_index = cur_index;
- while(end_index < segment->getEnd() && text[end_index] != '\n')
- {
- ++end_index;
- }
-
- // ask segment how many character fit in remaining space
- S32 max_characters = end_index - cur_index;
- S32 character_count = segment->getNumChars(getWordWrap() ? llmax(0, remaining_pixels) : S32_MAX,
- seg_offset,
- cur_index - line_start_index,
- max_characters);
-
+ ++end_index;
+ }
- S32 segment_width = segment->getWidth(seg_offset, character_count);
- remaining_pixels -= segment_width;
- S32 text_left = getLeftOffset(text_width - remaining_pixels);
+ // ask segment how many character fit in remaining space
+ S32 max_characters = end_index - cur_index;
+ S32 character_count = segment->getNumChars(getWordWrap() ? llmax(0, remaining_pixels) : S32_MAX,
+ seg_offset,
+ cur_index - line_start_index,
+ max_characters);
+
- seg_offset += character_count;
+ S32 segment_width = segment->getWidth(seg_offset, character_count);
+ remaining_pixels -= segment_width;
+ S32 text_left = getLeftOffset(text_width - remaining_pixels);
- S32 last_segment_char_on_line = segment->getStart() + seg_offset;
+ seg_offset += character_count;
- // if we didn't finish the current segment...
- if (last_segment_char_on_line < segment->getEnd())
- {
- // set up index for next line
- // ...skip newline, we don't want to draw
- S32 next_line_count = line_count;
- if (text[last_segment_char_on_line] == '\n')
- {
- seg_offset++;
- last_segment_char_on_line++;
- next_line_count++;
- }
+ S32 last_segment_char_on_line = segment->getStart() + seg_offset;
- // add line info and keep going
- mLineInfoList.push_back(line_info(
- line_start_index,
- last_segment_char_on_line,
- LLRect(text_left,
- cur_top,
- text_left + (text_width - remaining_pixels),
- cur_top - line_height),
- line_count));
-
- line_start_index = segment->getStart() + seg_offset;
- cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
- remaining_pixels = text_width;
- line_height = 0;
- line_count = next_line_count;
- }
- // ...just consumed last segment..
- else if (++segment_set_t::iterator(seg_iter) == mSegments.end())
- {
- mLineInfoList.push_back(line_info(
- line_start_index,
- last_segment_char_on_line,
- LLRect(text_left,
- cur_top,
- text_left + (text_width - remaining_pixels),
- cur_top - line_height),
- line_count));
- cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
- break;
- }
- // finished a segment and there are segments remaining on this line
- else
+ // if we didn't finish the current segment...
+ if (last_segment_char_on_line < segment->getEnd())
+ {
+ // set up index for next line
+ // ...skip newline, we don't want to draw
+ S32 next_line_count = line_count;
+ if (text[last_segment_char_on_line] == '\n')
{
- // subtract pixels used and increment segment
- ++seg_iter;
- seg_offset = 0;
+ seg_offset++;
+ last_segment_char_on_line++;
+ next_line_count++;
}
+
+ // add line info and keep going
+ mLineInfoList.push_back(line_info(
+ line_start_index,
+ last_segment_char_on_line,
+ LLRect(text_left,
+ cur_top,
+ text_left + (text_width - remaining_pixels),
+ cur_top - line_height),
+ line_count));
+
+ line_start_index = segment->getStart() + seg_offset;
+ cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
+ remaining_pixels = text_width;
+ line_height = 0;
+ line_count = next_line_count;
+ }
+ // ...just consumed last segment..
+ else if (++segment_set_t::iterator(seg_iter) == mSegments.end())
+ {
+ mLineInfoList.push_back(line_info(
+ line_start_index,
+ last_segment_char_on_line,
+ LLRect(text_left,
+ cur_top,
+ text_left + (text_width - remaining_pixels),
+ cur_top - line_height),
+ line_count));
+ cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels;
+ break;
+ }
+ // finished a segment and there are segments remaining on this line
+ else
+ {
+ // subtract pixels used and increment segment
+ ++seg_iter;
+ seg_offset = 0;
}
}
@@ -1256,6 +1272,19 @@ S32 LLTextBase::getLineStart( S32 line ) const
return mLineInfoList[line].mDocIndexStart;
}
+S32 LLTextBase::getLineEnd( S32 line ) const
+{
+ S32 num_lines = getLineCount();
+ if (num_lines == 0)
+ {
+ return 0;
+ }
+
+ line = llclamp(line, 0, num_lines-1);
+ return mLineInfoList[line].mDocIndexEnd;
+}
+
+
S32 LLTextBase::getLineNumFromDocIndex( S32 doc_index, bool include_wordwrap) const
{
@@ -1308,14 +1337,27 @@ S32 LLTextBase::getFirstVisibleLine() const
return iter - mLineInfoList.begin();
}
-std::pair<S32, S32> LLTextBase::getVisibleLines() const
+std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
{
LLRect visible_region = mScroller->getVisibleContentRect();
+ line_list_t::const_iterator first_iter;
+ line_list_t::const_iterator last_iter;
- // binary search for line that starts before top of visible buffer and starts before end of visible buffer
- line_list_t::const_iterator first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
- line_list_t::const_iterator last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top());
+ // make sure we have an up-to-date mLineInfoList
+ reflow();
+ if (fully_visible)
+ {
+ // binary search for line that starts before top of visible buffer and starts before end of visible buffer
+ first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top());
+ last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
+ }
+ else
+ {
+ // binary search for line that starts before top of visible buffer and starts before end of visible buffer
+ first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
+ last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top());
+ }
return std::pair<S32, S32>(first_iter - mLineInfoList.begin(), last_iter - mLineInfoList.begin());
}
@@ -2147,7 +2189,15 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 start = seg_start;
S32 end = llmin( selection_start, seg_end );
S32 length = end - start;
- font->render(text, start, rect.mLeft, rect.mTop, color, LLFontGL::LEFT, LLFontGL::TOP, 0, mStyle->getShadowType(), length, rect.getWidth(), &right_x, mEditor.getUseEllipses());
+ font->render(text, start,
+ rect.mLeft, rect.mTop,
+ color,
+ LLFontGL::LEFT, LLFontGL::TOP,
+ 0,
+ mStyle->getShadowType(),
+ length, rect.getWidth(),
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
@@ -2158,9 +2208,15 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 end = llmin( selection_end, seg_end );
S32 length = end - start;
- font->render(text, start, rect.mLeft, rect.mTop,
- LLColor4( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], 1.f ),
- LLFontGL::LEFT, LLFontGL::TOP, 0, LLFontGL::NO_SHADOW, length, rect.mRight, &right_x, mEditor.getUseEllipses());
+ font->render(text, start,
+ rect.mLeft, rect.mTop,
+ LLColor4( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], 1.f ),
+ LLFontGL::LEFT, LLFontGL::TOP,
+ 0,
+ LLFontGL::NO_SHADOW,
+ length, rect.mRight,
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
if( selection_end < seg_end )
@@ -2169,7 +2225,15 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 start = llmax( selection_end, seg_start );
S32 end = seg_end;
S32 length = end - start;
- font->render(text, start, rect.mLeft, rect.mTop, color, LLFontGL::LEFT, LLFontGL::TOP, 0, mStyle->getShadowType(), length, rect.mRight, &right_x, mEditor.getUseEllipses());
+ font->render(text, start,
+ rect.mLeft, rect.mTop,
+ color,
+ LLFontGL::LEFT, LLFontGL::TOP,
+ 0,
+ mStyle->getShadowType(),
+ length, rect.mRight,
+ &right_x,
+ mEditor.getUseEllipses());
}
return right_x;
}
@@ -2263,7 +2327,7 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
S32 num_chars = mStyle->getFont()->maxDrawableChars(text.c_str() + segment_offset + mStart,
(F32)num_pixels,
max_chars,
- mEditor.getWordWrap());
+ TRUE);
if (num_chars == 0
&& line_offset == 0
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index d0287a99ca..f20134fd6d 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -277,10 +277,11 @@ protected:
// manage lines
S32 getLineStart( S32 line ) const;
+ S32 getLineEnd( S32 line ) const;
S32 getLineNumFromDocIndex( S32 doc_index, bool include_wordwrap = true) const;
S32 getLineOffsetFromDocIndex( S32 doc_index, bool include_wordwrap = true) const;
S32 getFirstVisibleLine() const;
- std::pair<S32, S32> getVisibleLines() const;
+ std::pair<S32, S32> getVisibleLines(bool fully_visible = false);
S32 getLeftOffset(S32 width);
void reflow(S32 start_index = 0);
@@ -344,6 +345,7 @@ protected:
bool mTrackEnd; // if true, keeps scroll position at end of document during resize
bool mReadOnly;
bool mClip;
+ bool mHideScrollbar;
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
// support widgets
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 3feca136be..20bceb4675 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -47,26 +47,19 @@ LLTextBox::LLTextBox(const LLTextBox::Params& p)
BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask)
{
- BOOL handled = FALSE;
+ BOOL handled = LLTextBase::handleMouseDown(x, y, mask);
- // HACK: Only do this if there actually is something to click, so that
- // overly large text boxes in the older UI won't start eating clicks.
- if (isClickable())
+ if (getSoundFlags() & MOUSE_DOWN)
{
- handled = TRUE;
+ make_ui_sound("UISndClick");
+ }
+ if (!handled && mClickedCallback)
+ {
// Route future Mouse messages here preemptively. (Release on mouse up.)
gFocusMgr.setMouseCapture( this );
-
- if (getSoundFlags() & MOUSE_DOWN)
- {
- make_ui_sound("UISndClick");
- }
- }
- if (!handled)
- {
- handled = LLTextBase::handleMouseDown(x, y, mask);
+ handled = TRUE;
}
return handled;
@@ -76,33 +69,30 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
- // We only handle the click if the click both started and ended within us
-
- // HACK: Only do this if there actually is something to click, so that
- // overly large text boxes in the older UI won't start eating clicks.
- if (isClickable() && hasMouseCapture())
+ if (getSoundFlags() & MOUSE_UP)
{
- handled = TRUE;
+ make_ui_sound("UISndClickRelease");
+ }
+ // We only handle the click if the click both started and ended within us
+ if (hasMouseCapture())
+ {
// Release the mouse
gFocusMgr.setMouseCapture( NULL );
- if (getSoundFlags() & MOUSE_UP)
- {
- make_ui_sound("UISndClickRelease");
- }
-
- // handle clicks on Urls in the textbox first
- handled = LLTextBase::handleMouseUp(x, y, mask);
-
- // DO THIS AT THE VERY END to allow the button to be destroyed
+ // DO THIS AT THE VERY END to allow the button to be destroyed
// as a result of being clicked. If mouseup in the widget,
// it's been clicked
if (mClickedCallback && !handled)
{
mClickedCallback();
+ handled = TRUE;
}
}
+ else
+ {
+ handled = LLTextBase::handleMouseUp(x, y, mask);
+ }
return handled;
}
@@ -149,30 +139,3 @@ void LLTextBox::onUrlLabelUpdated(const std::string &url, const std::string &lab
needsReflow();
}
-bool LLTextBox::isClickable() const
-{
- // return true if we have been given a click callback
- if (mClickedCallback)
- {
- return true;
- }
-
- // also return true if we have a clickable Url in the text
- segment_set_t::const_iterator it;
- for (it = mSegments.begin(); it != mSegments.end(); ++it)
- {
- LLTextSegmentPtr segmentp = *it;
- if (segmentp)
- {
- const LLStyleSP style = segmentp->getStyle();
- if (style && style->isLink())
- {
- return true;
- }
- }
- }
-
- // otherwise there is nothing clickable here
- return false;
-}
-
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index f8c4447b62..da0bcbe972 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -79,7 +79,6 @@ public:
protected:
void onUrlLabelUpdated(const std::string &url, const std::string &label);
- bool isClickable() const;
LLUIString mText;
callback_t mClickedCallback;
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index d742281f30..c55273cacf 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -38,6 +38,7 @@
// Library includes
#include "lltextbox.h"
#include "lliconctrl.h"
+#include "llmenugl.h" // hideMenus()
#include "llui.h" // positionViewNearMouse()
#include "llwindow.h"
@@ -94,7 +95,16 @@ BOOL LLToolTipView::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolTipView::handleMouseDown(S32 x, S32 y, MASK mask)
{
LLToolTipMgr::instance().blockToolTips();
- return LLView::handleMouseDown(x, y, mask);
+
+ if (LLView::handleMouseDown(x, y, mask))
+ {
+ // If we are handling the mouse event menu holder
+ // won't get a chance to close menus so do this here
+ LLMenuGL::sMenuContainer->hideMenus();
+ return TRUE;
+ }
+
+ return FALSE;
}
BOOL LLToolTipView::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index e47010c316..3c77c655b8 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -321,7 +321,7 @@ fail:
static void loadWidgetTemplate(const std::string& widget_tag, LLInitParam::BaseBlock& block);
private:
- //static void setCtrlValue(LLView* view, LLXMLNodePtr node);
+ // this exists to get around dependency on llview
static void setCtrlParent(LLView* view, LLView* parent, S32 tab_group);
// Avoid directly using LLUI and LLDir in the template code
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index d2760e3d59..7137c93476 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -2763,10 +2763,6 @@ const char* cursorIDToName(int id)
case UI_CURSOR_TOOLPAN: return "UI_CURSOR_TOOLPAN";
case UI_CURSOR_TOOLZOOMIN: return "UI_CURSOR_TOOLZOOMIN";
case UI_CURSOR_TOOLPICKOBJECT3: return "UI_CURSOR_TOOLPICKOBJECT3";
- case UI_CURSOR_TOOLSIT: return "UI_CURSOR_TOOLSIT";
- case UI_CURSOR_TOOLBUY: return "UI_CURSOR_TOOLBUY";
- case UI_CURSOR_TOOLPAY: return "UI_CURSOR_TOOLPAY";
- case UI_CURSOR_TOOLOPEN: return "UI_CURSOR_TOOLOPEN";
case UI_CURSOR_TOOLPLAY: return "UI_CURSOR_TOOLPLAY";
case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE";
case UI_CURSOR_TOOLMEDIAOPEN: return "UI_CURSOR_TOOLMEDIAOPEN";
@@ -2862,10 +2858,6 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
case UI_CURSOR_TOOLPAN:
case UI_CURSOR_TOOLZOOMIN:
case UI_CURSOR_TOOLPICKOBJECT3:
- case UI_CURSOR_TOOLSIT:
- case UI_CURSOR_TOOLBUY:
- case UI_CURSOR_TOOLPAY:
- case UI_CURSOR_TOOLOPEN:
case UI_CURSOR_TOOLPLAY:
case UI_CURSOR_TOOLPAUSE:
case UI_CURSOR_TOOLMEDIAOPEN:
@@ -2907,10 +2899,6 @@ void LLWindowMacOSX::initCursors()
initPixmapCursor(UI_CURSOR_TOOLPAN, 7, 6);
initPixmapCursor(UI_CURSOR_TOOLZOOMIN, 7, 6);
initPixmapCursor(UI_CURSOR_TOOLPICKOBJECT3, 1, 1);
- initPixmapCursor(UI_CURSOR_TOOLSIT, 1, 1);
- initPixmapCursor(UI_CURSOR_TOOLBUY, 1, 1);
- initPixmapCursor(UI_CURSOR_TOOLPAY, 1, 1);
- initPixmapCursor(UI_CURSOR_TOOLOPEN, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLPLAY, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLPAUSE, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLMEDIAOPEN, 1, 1);
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index ecda880c1f..00a8d429ba 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -1981,10 +1981,6 @@ void LLWindowSDL::initCursors()
mSDLCursors[UI_CURSOR_TOOLPAN] = makeSDLCursorFromBMP("lltoolpan.BMP",7,5);
mSDLCursors[UI_CURSOR_TOOLZOOMIN] = makeSDLCursorFromBMP("lltoolzoomin.BMP",7,5);
mSDLCursors[UI_CURSOR_TOOLPICKOBJECT3] = makeSDLCursorFromBMP("toolpickobject3.BMP",0,0);
- mSDLCursors[UI_CURSOR_TOOLSIT] = makeSDLCursorFromBMP("toolsit.BMP",0,0);
- mSDLCursors[UI_CURSOR_TOOLBUY] = makeSDLCursorFromBMP("toolbuy.BMP",0,0);
- mSDLCursors[UI_CURSOR_TOOLPAY] = makeSDLCursorFromBMP("toolpay.BMP",0,0);
- mSDLCursors[UI_CURSOR_TOOLOPEN] = makeSDLCursorFromBMP("toolopen.BMP",0,0);
mSDLCursors[UI_CURSOR_TOOLPLAY] = makeSDLCursorFromBMP("toolplay.BMP",0,0);
mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0);
mSDLCursors[UI_CURSOR_TOOLMEDIAOPEN] = makeSDLCursorFromBMP("toolmediaopen.BMP",0,0);
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 0faa3e93ff..c608c21d05 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -1527,10 +1527,6 @@ void LLWindowWin32::initCursors()
mCursor[ UI_CURSOR_PIPETTE ] = LoadCursor(module, TEXT("TOOLPIPETTE"));
// Color cursors
- mCursor[UI_CURSOR_TOOLSIT] = loadColorCursor(TEXT("TOOLSIT"));
- mCursor[UI_CURSOR_TOOLBUY] = loadColorCursor(TEXT("TOOLBUY"));
- mCursor[UI_CURSOR_TOOLPAY] = loadColorCursor(TEXT("TOOLPAY"));
- mCursor[UI_CURSOR_TOOLOPEN] = loadColorCursor(TEXT("TOOLOPEN"));
mCursor[UI_CURSOR_TOOLPLAY] = loadColorCursor(TEXT("TOOLPLAY"));
mCursor[UI_CURSOR_TOOLPAUSE] = loadColorCursor(TEXT("TOOLPAUSE"));
mCursor[UI_CURSOR_TOOLMEDIAOPEN] = loadColorCursor(TEXT("TOOLMEDIAOPEN"));
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 50be55e9d0..9f0a0111f5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -187,6 +187,7 @@ set(viewer_SOURCE_FILES
llfloaternotificationsconsole.cpp
llfloateropenobject.cpp
llfloaterparcel.cpp
+ llfloaterpay.cpp
llfloaterperms.cpp
llfloaterpostcard.cpp
llfloaterpostprocess.cpp
@@ -218,7 +219,6 @@ set(viewer_SOURCE_FILES
llfollowcam.cpp
llfriendcard.cpp
llgesturemgr.cpp
- llgivemoney.cpp
llglsandbox.cpp
llgroupactions.cpp
llgrouplist.cpp
@@ -658,6 +658,7 @@ set(viewer_HEADER_FILES
llfloaternotificationsconsole.h
llfloateropenobject.h
llfloaterparcel.h
+ llfloaterpay.h
llfloaterpostcard.h
llfloaterpostprocess.h
llfloaterpreference.h
@@ -690,7 +691,6 @@ set(viewer_HEADER_FILES
llfollowcam.h
llfriendcard.h
llgesturemgr.h
- llgivemoney.h
llgroupactions.h
llgrouplist.h
llgroupmgr.h
@@ -1103,14 +1103,10 @@ if (WINDOWS)
res/ll_icon.BMP
res/ll_icon.ico
res/resource.h
- res/toolbuy.cur
- res/toolopen.cur
- res/toolpay.cur
res/toolpickobject.cur
res/toolpickobject2.cur
res/toolpickobject3.cur
res/toolpipette.cur
- res/toolsit.cur
)
set_source_files_properties(${viewer_RESOURCE_FILES}
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7f96e0761e..806f96a654 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6117,6 +6117,18 @@
<real>1.0</real>
</map>
+ <key>RenderHighlightEnable</key>
+ <map>
+ <key>Comment</key>
+ <string>Show glow effect when hovering on interactive objects.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
<key>RenderHighlightFadeTime</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif
deleted file mode 100644
index 39d89987aa..0000000000
--- a/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif
+++ /dev/null
Binary files differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif
deleted file mode 100644
index 864c8dee7a..0000000000
--- a/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif
+++ /dev/null
Binary files differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif
deleted file mode 100644
index d6d835a90b..0000000000
--- a/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif
+++ /dev/null
Binary files differ
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 92b2768f39..2b5e2369bb 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -48,7 +48,7 @@
#include "llfloatergroupinvite.h"
#include "llfloatergroups.h"
#include "llfloaterreg.h"
-#include "llgivemoney.h"
+#include "llfloaterpay.h"
#include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType
#include "llimview.h" // for gIMMgr
#include "llmutelist.h"
@@ -306,7 +306,7 @@ bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response,
gAgent.clearBusy();
}
- LLFloaterPay::payDirectly(&give_money, avatar_id, /*is_group=*/FALSE);
+ LLFloaterPayUtil::payDirectly(&give_money, avatar_id, /*is_group=*/false);
return false;
}
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index f8f5db9d7e..2467356018 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -34,253 +34,135 @@
#include "llexpandabletextbox.h"
#include "llscrollcontainer.h"
+#include "llwindow.h"
static LLDefaultChildRegistry::Register<LLExpandableTextBox> t1("expandable_text");
-LLExpandableTextBox::LLTextBoxEx::Params::Params()
-: expand_textbox("expand_textbox")
+class LLExpanderSegment : public LLTextSegment
{
-}
+public:
+ LLExpanderSegment(const LLStyleSP& style, S32 start, S32 end, const std::string& more_text, LLTextBase& editor )
+ : LLTextSegment(start, end),
+ mEditor(editor),
+ mStyle(style),
+ mExpanderLabel(more_text)
+ {}
+
+ /*virtual*/ S32 getWidth(S32 first_char, S32 num_chars) const
+ {
+ // more label always spans width of text box
+ return mEditor.getTextRect().getWidth();
+ }
+ /*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const
+ {
+ return start_offset;
+ }
+ /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const { return getEnd() - getStart(); }
+ /*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
+ {
+ F32 right_x;
+ mStyle->getFont()->renderUTF8(mExpanderLabel, start,
+ draw_rect.mRight, draw_rect.mTop,
+ mStyle->getColor(),
+ LLFontGL::RIGHT, LLFontGL::TOP,
+ 0,
+ mStyle->getShadowType(),
+ end - start, draw_rect.getWidth(),
+ &right_x,
+ mEditor.getUseEllipses());
+ return right_x;
+ }
+ /*virtual*/ S32 getMaxHeight() const { return llceil(mStyle->getFont()->getLineHeight()); }
+ /*virtual*/ bool canEdit() const { return false; }
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask) { mEditor.onCommit(); return TRUE; }
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask)
+ {
+ LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
+ return TRUE;
+ }
+private:
+ LLTextBase& mEditor;
+ LLStyleSP mStyle;
+ std::string mExpanderLabel;
+};
+
+LLExpandableTextBox::LLTextBoxEx::Params::Params()
+: more_label("more_label")
+{}
LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
-: LLTextBox(p)
+: LLTextBox(p),
+ mExpanderLabel(p.more_label),
+ mExpanderVisible(false)
{
setIsChrome(TRUE);
- LLTextBox::Params params = p.expand_textbox;
- mExpandTextBox = LLUICtrlFactory::create<LLTextBox>(params);
- addChild(mExpandTextBox);
-
- LLRect rc = getLocalRect();
- rc.mRight -= getHPad();
- rc.mLeft = rc.mRight - mExpandTextBox->getTextPixelWidth();
- rc.mTop = mExpandTextBox->getTextPixelHeight();
- mExpandTextBox->setRect(rc);
}
-BOOL LLExpandableTextBox::LLTextBoxEx::handleMouseUp(S32 x, S32 y, MASK mask)
+void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- BOOL ret = LLTextBox::handleMouseUp(x, y, mask);
+ LLTextBox::reshape(width, height, called_from_parent);
- if(mExpandTextBox->getRect().pointInRect(x, y))
+ if (getTextPixelHeight() > getRect().getHeight())
{
- onCommit();
+ showExpandText();
+ }
+ else
+ {
+ hideExpandText();
}
-
- return ret;
}
-void LLExpandableTextBox::LLTextBoxEx::draw()
+void LLExpandableTextBox::LLTextBoxEx::setValue(const LLSD& value)
{
- // draw text box
- LLTextBox::draw();
- // force text box to draw children
- LLUICtrl::draw();
-}
-
-/* LLTextBox has been rewritten, the variables referenced in this code
-no longer exist.
+ LLTextBox::setValue(value);
-void LLExpandableTextBox::LLTextBoxEx::drawText( S32 x, S32 y, const LLWString &text, const LLColor4& color )
-{
- // *NOTE:dzaporozhan:
- // Copy/paste from LLTextBox::drawText in order to modify last
- // line width if needed and who "More" link
- F32 alpha = getDrawContext().mAlpha;
- if (mSegments.size() > 1)
+ // text contents have changed, segments are cleared out
+ // so hide the expander and determine if we need it
+ //mExpanderVisible = false;
+ if (getTextPixelHeight() > getRect().getHeight())
{
- // we have Urls (or other multi-styled segments)
- drawTextSegments(x, y, text);
- }
- else if( mLineLengthList.empty() )
- {
- // simple case of 1 line of text in one style
- mDefaultFont->render(text, 0, (F32)x, (F32)y, color % alpha,
- mHAlign, mVAlign,
- 0,
- mShadowType,
- S32_MAX, getRect().getWidth(), NULL, mUseEllipses);
-
- mExpandTextBox->setVisible(FALSE);
+ showExpandText();
}
else
{
- // simple case of multiple lines of text, all in the same style
- S32 cur_pos = 0;
- for (std::vector<S32>::iterator iter = mLineLengthList.begin();
- iter != mLineLengthList.end(); ++iter)
- {
- S32 line_length = *iter;
- S32 line_height = llfloor(mDefaultFont->getLineHeight()) + mLineSpacing;
- S32 max_pixels = getRect().getWidth();
-
- if(iter + 1 != mLineLengthList.end()
- && y - line_height < line_height)
- {
- max_pixels = getCropTextWidth();
- }
-
- mDefaultFont->render(text, cur_pos, (F32)x, (F32)y, color % alpha,
- mHAlign, mVAlign,
- 0,
- mShadowType,
- line_length, max_pixels, NULL, mUseEllipses );
-
- cur_pos += line_length + 1;
-
- y -= line_height;
- if(y < line_height)
- {
- if( mLineLengthList.end() != iter + 1 )
- {
- showExpandText(y);
- }
- else
- {
- hideExpandText();
- }
- break;
- }
- }
+ hideExpandText();
}
}
-*/
-void LLExpandableTextBox::LLTextBoxEx::showExpandText(S32 y)
-{
- LLRect rc = mExpandTextBox->getRect();
- rc.mTop = y + mExpandTextBox->getTextPixelHeight();
- rc.mBottom = y;
- mExpandTextBox->setRect(rc);
- mExpandTextBox->setVisible(TRUE);
-}
-void LLExpandableTextBox::LLTextBoxEx::hideExpandText()
-{
- mExpandTextBox->setVisible(FALSE);
-}
-
-S32 LLExpandableTextBox::LLTextBoxEx::getCropTextWidth()
-{
- return mExpandTextBox->getRect().mLeft - getHPad() * 2;
-}
-
-/*
-// *NOTE:James:
-// LLTextBox::drawText() has been completely rewritten, as it now handles
-// arbitrarily styled segments of text. This needs to be rebuilt.
-
-void LLExpandableTextBox::LLTextBoxEx::drawTextSegments(S32 init_x, S32 init_y, const LLWString &text)
+void LLExpandableTextBox::LLTextBoxEx::showExpandText()
{
-
- // *NOTE:dzaporozhan:
- // Copy/paste from LLTextBox::drawTextSegments in order to modify last
- // line width if needed and who "More" link
- F32 alpha = getDrawContext().mAlpha;
-
- const S32 text_len = text.length();
- if (text_len <= 0)
+ if (!mExpanderVisible)
{
- return;
+ // get fully visible lines
+ std::pair<S32, S32> visible_lines = getVisibleLines(true);
+ S32 last_line = visible_lines.second - 1;
+
+ LLStyle::Params expander_style = getDefaultStyle();
+ expander_style.font.name.setIfNotProvided(LLFontGL::nameFromFont(expander_style.font));
+ expander_style.font.style = "UNDERLINE";
+ expander_style.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ LLExpanderSegment* expanderp = new LLExpanderSegment(new LLStyle(expander_style), getLineStart(last_line), getLength() + 1, mExpanderLabel, *this);
+ insertSegment(expanderp);
+ mExpanderVisible = true;
}
- S32 cur_line = 0;
- S32 num_lines = getLineCount();
- S32 line_start = getLineStart(cur_line);
- S32 line_height = llround( mDefaultFont->getLineHeight() ) + mLineSpacing;
- F32 text_y = (F32) init_y;
- segment_set_t::iterator cur_seg = mSegments.begin();
+}
- // render a line of text at a time
- const LLRect textRect = getLocalRect();
- while((textRect.mBottom <= text_y) && (cur_line < num_lines))
+//NOTE: obliterates existing styles (including hyperlinks)
+void LLExpandableTextBox::LLTextBoxEx::hideExpandText()
+{
+ if (mExpanderVisible)
{
- S32 next_start = -1;
- S32 line_end = text_len;
-
- if ((cur_line + 1) < num_lines)
- {
- next_start = getLineStart(cur_line + 1);
- line_end = next_start;
- }
- if ( text[line_end-1] == '\n' )
- {
- --line_end;
- }
-
- // render all segments on this line
- F32 text_x = init_x;
- S32 seg_start = line_start;
- while (seg_start < line_end && cur_seg != mSegments.end())
- {
- // move to the next segment (or continue the previous one)
- LLTextSegment *cur_segment = *cur_seg;
- while (cur_segment->getEnd() <= seg_start)
- {
- if (++cur_seg == mSegments.end())
- {
- return;
- }
- cur_segment = *cur_seg;
- }
-
- // Draw a segment within the line
- S32 clipped_end = llmin( line_end, cur_segment->getEnd() );
- S32 clipped_len = clipped_end - seg_start;
- if( clipped_len > 0 )
- {
- LLStyleSP style = cur_segment->getStyle();
- if (style && style->isVisible())
- {
- // work out the color for the segment
- LLColor4 color ;
- if (getEnabled())
- {
- color = style->isLink() ? mLinkColor.get() : mTextColor.get();
- }
- else
- {
- color = mDisabledColor.get();
- }
- color = color % alpha;
-
- S32 max_pixels = textRect.getWidth();
-
- if(cur_line + 1 < num_lines
- && text_y - line_height < line_height)
- {
- max_pixels = getCropTextWidth();
- }
-
- // render a single line worth for this segment
- mDefaultFont->render(text, seg_start, text_x, text_y, color,
- mHAlign, mVAlign, 0, mShadowType, clipped_len,
- max_pixels, &text_x, mUseEllipses);
- }
-
- seg_start += clipped_len;
- }
- }
-
- // move down one line
- text_y -= (F32)line_height;
- line_start = next_start;
- cur_line++;
- if(text_y < line_height)
- {
- if( cur_line < num_lines )
- {
- showExpandText((S32)text_y);
- }
- else
- {
- hideExpandText();
- }
- break;
- }
+ // this will overwrite the expander segment and all text styling with a single style
+ LLNormalTextSegment* segmentp = new LLNormalTextSegment(
+ new LLStyle(getDefaultStyle()), 0, getLength() + 1, *this);
+ insertSegment(segmentp);
+
+ mExpanderVisible = false;
}
}
-*/
S32 LLExpandableTextBox::LLTextBoxEx::getVerticalTextDelta()
{
@@ -295,24 +177,24 @@ S32 LLExpandableTextBox::LLTextBoxEx::getVerticalTextDelta()
//////////////////////////////////////////////////////////////////////////
LLExpandableTextBox::Params::Params()
-: textbox("textbox")
-, scroll("scroll")
-, max_height("max_height", 0)
-, bg_visible("bg_visible", false)
-, expanded_bg_visible("expanded_bg_visible", true)
-, bg_color("bg_color", LLColor4::black)
-, expanded_bg_color("expanded_bg_color", LLColor4::black)
+: textbox("textbox"),
+ scroll("scroll"),
+ max_height("max_height", 0),
+ bg_visible("bg_visible", false),
+ expanded_bg_visible("expanded_bg_visible", true),
+ bg_color("bg_color", LLColor4::black),
+ expanded_bg_color("expanded_bg_color", LLColor4::black)
{
}
LLExpandableTextBox::LLExpandableTextBox(const Params& p)
-: LLUICtrl(p)
-, mMaxHeight(p.max_height)
-, mBGVisible(p.bg_visible)
-, mExpandedBGVisible(p.expanded_bg_visible)
-, mBGColor(p.bg_color)
-, mExpandedBGColor(p.expanded_bg_color)
-, mExpanded(false)
+: LLUICtrl(p),
+ mMaxHeight(p.max_height),
+ mBGVisible(p.bg_visible),
+ mExpandedBGVisible(p.expanded_bg_visible),
+ mBGColor(p.bg_color),
+ mExpandedBGColor(p.expanded_bg_color),
+ mExpanded(false)
{
LLRect rc = getLocalRect();
@@ -407,6 +289,9 @@ S32 LLExpandableTextBox::recalculateTextDelta(S32 text_delta)
void LLExpandableTextBox::expandTextBox()
{
+ // hide "more" link, and show full text contents
+ mTextBox->hideExpandText();
+
S32 text_delta = mTextBox->getVerticalTextDelta();
text_delta += mTextBox->getVPad() * 2 + mScroll->getBorderWidth() * 2;
// no need to expand
@@ -474,8 +359,6 @@ void LLExpandableTextBox::collapseTextBox()
updateTextBoxRect();
- // Should be handled automatically in reshape above. JC
- //mTextBox->setWrappedText(mText);
if(gFocusMgr.getTopCtrl() == this)
{
gFocusMgr.setTopCtrl(NULL);
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 0b9c3f7258..d6401e224f 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -54,27 +54,13 @@ protected:
public:
struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
{
- Optional<LLTextBox::Params> expand_textbox;
-
+ Mandatory<std::string> more_label;
Params();
};
- /**
- * Draw text box and "More" link
- */
- /*virtual*/ void draw();
-
-// /**
-// * Draws simple text(no urls) line by line, will show or hide "More" link
-// * if needed.
-// */
-// /*virtual*/ void drawText( S32 x, S32 y, const LLWString &text, const LLColor4& color );
-//
-// /**
-// * Draws segmented text(with urls) line by line. Will show or hide "More" link
-// * if needed
-// */
-// void drawTextSegments(S32 x, S32 y, const LLWString &text);
+ // adds or removes "More" link as needed
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ /*virtual*/ void setValue(const LLSD& value);
/**
* Returns difference between text box height and text height.
@@ -93,33 +79,24 @@ protected:
virtual S32 getHPad() { return mHPad; }
/**
- * Broadcasts "commit" signal if user clicked "More" link
- */
- /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
-
- protected:
-
- LLTextBoxEx(const Params& p);
- friend class LLUICtrlFactory;
-
- /**
* Shows "More" link
*/
- void showExpandText(S32 y);
+ void showExpandText();
/**
* Hides "More" link
*/
void hideExpandText();
- /**
- * Returns cropped line width
- */
- S32 getCropTextWidth();
+ protected:
+
+ LLTextBoxEx(const Params& p);
+ friend class LLUICtrlFactory;
private:
+ std::string mExpanderLabel;
- LLTextBox* mExpandTextBox;
+ bool mExpanderVisible;
};
public:
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 91b9bcfe72..890d863db7 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -37,20 +37,15 @@
#include "llagent.h"
#include "llfocusmgr.h"
#include "llfloaterreg.h"
-#include "llfloaterinventory.h"
-#include "llfoldervieweventlistener.h"
-#include "llinventorymodel.h"
#include "llviewercontrol.h"
#include "llworld.h"
// Linden libraries
-#include "llbutton.h"
#include "lllineeditor.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llscrolllistcell.h"
#include "lltabcontainer.h"
-#include "lltextbox.h"
#include "lluictrlfactory.h"
#include "message.h"
@@ -117,13 +112,6 @@ BOOL LLFloaterAvatarPicker::postBuild()
getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("no_results"));
- LLInventoryPanel* inventory_panel = getChild<LLInventoryPanel>("InventoryPanel");
- inventory_panel->setFilterTypes(0x1 << LLInventoryType::IT_CALLINGCARD);
- inventory_panel->setFollowsAll();
- inventory_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- inventory_panel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD);
- inventory_panel->setSelectCallback(boost::bind(&LLFloaterAvatarPicker::doCallingCardSelectionChange, this, _1, _2));
-
getChild<LLTabContainer>("ResidentChooserTabs")->setCommitCallback(
boost::bind(&LLFloaterAvatarPicker::onTabChanged, this));
@@ -173,11 +161,7 @@ void LLFloaterAvatarPicker::onBtnSelect(void* userdata)
{
LLPanel* active_panel = self->childGetVisibleTab("ResidentChooserTabs");
- if(active_panel == self->getChild<LLPanel>("CallingCardsPanel"))
- {
- self->mCallback(self->mSelectedInventoryAvatarNames, self->mSelectedInventoryAvatarIDs, self->mCallbackUserdata);
- }
- else if(active_panel == self->getChild<LLPanel>("SearchPanel"))
+ if(active_panel == self->getChild<LLPanel>("SearchPanel"))
{
std::vector<std::string> avatar_names;
std::vector<LLUUID> avatar_ids;
@@ -192,7 +176,6 @@ void LLFloaterAvatarPicker::onBtnSelect(void* userdata)
self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata);
}
}
- self->getChild<LLInventoryPanel>("InventoryPanel")->setSelection(LLUUID::null, FALSE);
self->getChild<LLScrollListCtrl>("SearchResults")->deselectAllItems(TRUE);
self->getChild<LLScrollListCtrl>("NearMe")->deselectAllItems(TRUE);
if(self->mCloseOnSelect)
@@ -235,40 +218,6 @@ void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata)
}
}
-// Callback for inventory picker (select from calling cards)
-void LLFloaterAvatarPicker::doCallingCardSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
-{
- bool panel_active = (childGetVisibleTab("ResidentChooserTabs") == getChild<LLPanel>("CallingCardsPanel"));
-
- mSelectedInventoryAvatarIDs.clear();
- mSelectedInventoryAvatarNames.clear();
-
- if (panel_active)
- {
- childSetEnabled("Select", FALSE);
- }
-
- std::deque<LLFolderViewItem*>::const_iterator item_it;
- for (item_it = items.begin(); item_it != items.end(); ++item_it)
- {
- LLFolderViewEventListener* listenerp = (*item_it)->getListener();
- if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
- {
- LLInventoryItem* item = gInventory.getItem(listenerp->getUUID());
- if (item)
- {
- mSelectedInventoryAvatarIDs.push_back(item->getCreatorUUID());
- mSelectedInventoryAvatarNames.push_back(listenerp->getName());
- }
- }
- }
-
- if (panel_active)
- {
- childSetEnabled("Select", visibleItemsSelected());
- }
-}
-
void LLFloaterAvatarPicker::populateNearMe()
{
BOOL all_loaded = TRUE;
@@ -336,10 +285,6 @@ BOOL LLFloaterAvatarPicker::visibleItemsSelected() const
{
return getChild<LLScrollListCtrl>("SearchResults")->getFirstSelectedIndex() >= 0;
}
- else if(active_panel == getChild<LLPanel>("CallingCardsPanel"))
- {
- return mSelectedInventoryAvatarIDs.size() > 0;
- }
else if(active_panel == getChild<LLPanel>("NearMePanel"))
{
return getChild<LLScrollListCtrl>("NearMe")->getFirstSelectedIndex() >= 0;
@@ -349,7 +294,7 @@ BOOL LLFloaterAvatarPicker::visibleItemsSelected() const
void LLFloaterAvatarPicker::find()
{
- const std::string& text = childGetValue("Edit").asString();
+ std::string text = childGetValue("Edit").asString();
mQueryID.generate();
@@ -375,7 +320,6 @@ void LLFloaterAvatarPicker::find()
void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple)
{
getChild<LLScrollListCtrl>("SearchResults")->setAllowMultipleSelection(allow_multiple);
- getChild<LLInventoryPanel>("InventoryPanel")->setAllowMultiSelect(allow_multiple);
getChild<LLScrollListCtrl>("NearMe")->setAllowMultipleSelection(allow_multiple);
}
diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h
index 63896bef9f..f3b9aefb9c 100644
--- a/indra/newview/llfloateravatarpicker.h
+++ b/indra/newview/llfloateravatarpicker.h
@@ -37,7 +37,6 @@
#include <vector>
-
class LLFloaterAvatarPicker : public LLFloater
{
public:
@@ -57,7 +56,6 @@ public:
static void processAvatarPickerReply(class LLMessageSystem* msg, void**);
private:
-
static void editKeystroke(class LLLineEditor* caller, void* user_data);
static void onBtnFind(void* userdata);
@@ -68,8 +66,6 @@ private:
static void onList(class LLUICtrl* ctrl, void* userdata);
void onTabChanged();
- void doCallingCardSelectionChange(const std::deque<class LLFolderViewItem*> &items, BOOL user_action);
-
void populateNearMe();
BOOL visibleItemsSelected() const; // Returns true if any items in the current tab are selected.
@@ -79,8 +75,6 @@ private:
virtual void draw();
virtual BOOL handleKeyHere(KEY key, MASK mask);
- std::vector<LLUUID> mSelectedInventoryAvatarIDs;
- std::vector<std::string> mSelectedInventoryAvatarNames;
LLUUID mQueryID;
BOOL mResultsReturned;
BOOL mNearMeListComplete;
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 473d5ce827..9d07362edc 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -74,8 +74,6 @@ BOOL LLFloaterBuy::postBuild()
// mid-session and the saved rect is off-center.
center();
- mCloseSignal.connect(boost::bind(&LLFloaterBuy::onClose, this));
-
return TRUE;
}
@@ -310,7 +308,8 @@ void LLFloaterBuy::onClickCancel()
closeFloater();
}
-void LLFloaterBuy::onClose()
+// virtual
+void LLFloaterBuy::onClose(bool app_quitting)
{
mObjectSelection.clear();
}
diff --git a/indra/newview/llfloaterbuy.h b/indra/newview/llfloaterbuy.h
index 2ec66136b2..ab38e082dc 100644
--- a/indra/newview/llfloaterbuy.h
+++ b/indra/newview/llfloaterbuy.h
@@ -56,6 +56,7 @@ public:
~LLFloaterBuy();
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
static void show(const LLSaleInfo& sale_info);
@@ -70,7 +71,6 @@ protected:
void onClickBuy();
void onClickCancel();
- void onClose();
private:
LLSafeHandle<LLObjectSelection> mObjectSelection;
diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp
index 6b0b5ed5e0..2e0ae3265e 100644
--- a/indra/newview/llfloaterhelpbrowser.cpp
+++ b/indra/newview/llfloaterhelpbrowser.cpp
@@ -50,9 +50,6 @@
LLFloaterHelpBrowser::LLFloaterHelpBrowser(const LLSD& key)
: LLFloater(key)
{
- // really really destroy the help browser when it's closed, it'll be recreated.
- // *TODO: when onClose() is resurrected as a virtual, this bind can go away.
- mCloseSignal.connect(boost::bind(&LLFloaterHelpBrowser::onClose, this));
}
BOOL LLFloaterHelpBrowser::postBuild()
@@ -79,8 +76,10 @@ void LLFloaterHelpBrowser::buildURLHistory()
}
}
-void LLFloaterHelpBrowser::onClose()
+//virtual
+void LLFloaterHelpBrowser::onClose(bool app_quitting)
{
+ // really really destroy the help browser when it's closed, it'll be recreated.
destroy(); // really destroy this dialog on closure, it's relatively heavyweight.
}
diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h
index 14a276b428..b66a67c4d6 100644
--- a/indra/newview/llfloaterhelpbrowser.h
+++ b/indra/newview/llfloaterhelpbrowser.h
@@ -47,7 +47,7 @@ class LLFloaterHelpBrowser :
LLFloaterHelpBrowser(const LLSD& key);
/*virtual*/ BOOL postBuild();
- void onClose();
+ /*virtual*/ void onClose(bool app_quitting);
// inherited from LLViewerMediaObserver
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp
index 9b7f3305e5..5673550fbe 100644
--- a/indra/newview/llfloatermediabrowser.cpp
+++ b/indra/newview/llfloatermediabrowser.cpp
@@ -156,6 +156,8 @@ std::string LLFloaterMediaBrowser::getSupportURL()
{
return getString("support_page_url");
}
+
+//virtual
void LLFloaterMediaBrowser::onClose(bool app_quitting)
{
//setVisible(FALSE);
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 811cc26efb..aa457de2d8 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -52,7 +52,10 @@ LLFloaterMediaSettings::LLFloaterMediaSettings(const LLSD& key)
mPanelMediaSettingsGeneral(NULL),
mPanelMediaSettingsSecurity(NULL),
mPanelMediaSettingsPermissions(NULL),
- mWaitingToClose( false )
+ mWaitingToClose( false ),
+ mIdenticalHasMediaInfo( true ),
+ mMultipleMedia(false),
+ mMultipleValidMedia(false)
{
// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_settings.xml");
}
@@ -86,8 +89,6 @@ LLFloaterMediaSettings::~LLFloaterMediaSettings()
//
BOOL LLFloaterMediaSettings::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterMediaSettings::onClose, this));
-
mApplyBtn = getChild<LLButton>("Apply");
mApplyBtn->setClickedCallback(onBtnApply, this);
@@ -153,29 +154,29 @@ void LLFloaterMediaSettings::apply()
}
////////////////////////////////////////////////////////////////////////////////
-void LLFloaterMediaSettings::onClose()
+void LLFloaterMediaSettings::onClose(bool app_quitting)
{
if(mPanelMediaSettingsGeneral)
{
- mPanelMediaSettingsGeneral->onClose();
+ mPanelMediaSettingsGeneral->onClose(app_quitting);
}
LLFloaterReg::hideInstance("whitelist_entry");
}
////////////////////////////////////////////////////////////////////////////////
//static
-void LLFloaterMediaSettings::initValues( const LLSD& media_settings )
+void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable )
{
- sInstance->clearValues();
+ sInstance->clearValues(editable);
// update all panels with values from simulator
sInstance->mPanelMediaSettingsGeneral->
- initValues( sInstance->mPanelMediaSettingsGeneral, media_settings );
+ initValues( sInstance->mPanelMediaSettingsGeneral, media_settings, editable );
sInstance->mPanelMediaSettingsSecurity->
- initValues( sInstance->mPanelMediaSettingsSecurity, media_settings );
+ initValues( sInstance->mPanelMediaSettingsSecurity, media_settings, editable );
sInstance->mPanelMediaSettingsPermissions->
- initValues( sInstance->mPanelMediaSettingsPermissions, media_settings );
+ initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
}
@@ -195,12 +196,12 @@ void LLFloaterMediaSettings::commitFields()
////////////////////////////////////////////////////////////////////////////////
//static
-void LLFloaterMediaSettings::clearValues()
+void LLFloaterMediaSettings::clearValues( bool editable)
{
// clean up all panels before updating
- sInstance->mPanelMediaSettingsGeneral->clearValues(sInstance->mPanelMediaSettingsGeneral);
- sInstance->mPanelMediaSettingsSecurity->clearValues(sInstance->mPanelMediaSettingsSecurity);
- sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions);
+ sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
+ sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
+ sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
}
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index b95c590346..e2683039cc 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -47,14 +47,20 @@ public:
LLFloaterMediaSettings(const LLSD& key);
~LLFloaterMediaSettings();
- virtual BOOL postBuild();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
+
static LLFloaterMediaSettings* getInstance();
static void apply();
- static void initValues( const LLSD& media_settings );
- static void clearValues();
+ static void initValues( const LLSD& media_settings , bool editable);
+ static void clearValues( bool editable);
void enableOkApplyBtns( bool enable );
LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
+ bool mIdenticalHasMediaInfo;
+ bool mMultipleMedia;
+ bool mMultipleValidMedia;
+
protected:
LLButton *mOKBtn;
LLButton *mCancelBtn;
@@ -65,7 +71,7 @@ protected:
LLPanelMediaSettingsSecurity* mPanelMediaSettingsSecurity;
LLPanelMediaSettingsPermissions* mPanelMediaSettingsPermissions;
- void onClose();
+
static void onBtnOK(void*);
static void onBtnCancel(void*);
static void onBtnApply(void*);
diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h
index 0df3780ac4..a61cc04941 100644
--- a/indra/newview/llfloateropenobject.h
+++ b/indra/newview/llfloateropenobject.h
@@ -63,7 +63,6 @@ protected:
void refresh();
void draw();
virtual void onOpen(const LLSD& key);
-// virtual void onClose();
void moveToInventory(bool wear);
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
new file mode 100644
index 0000000000..88811d06fe
--- /dev/null
+++ b/indra/newview/llfloaterpay.cpp
@@ -0,0 +1,573 @@
+/**
+ * @file llfloaterpay.cpp
+ * @author Aaron Brashears, Kelly Washington, James Cook
+ * @brief Implementation of the LLFloaterPay class.
+ *
+ * $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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterpay.h"
+
+#include "message.h"
+#include "llfloater.h"
+#include "lllslconstants.h" // MAX_PAY_BUTTONS
+#include "lluuid.h"
+
+#include "llagent.h"
+#include "llfloaterreg.h"
+#include "llresmgr.h"
+#include "lltextbox.h"
+#include "lllineeditor.h"
+#include "llmutelist.h"
+#include "llfloaterreporter.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llbutton.h"
+#include "llselectmgr.h"
+#include "lltransactiontypes.h"
+#include "lluictrlfactory.h"
+
+///----------------------------------------------------------------------------
+/// Local function declarations, constants, enums, and typedefs
+///----------------------------------------------------------------------------
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLGiveMoneyInfo
+//
+// A small class used to track callback information
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFloaterPay;
+
+struct LLGiveMoneyInfo
+{
+ LLFloaterPay* mFloater;
+ S32 mAmount;
+ LLGiveMoneyInfo(LLFloaterPay* floater, S32 amount) :
+ mFloater(floater), mAmount(amount){}
+};
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterPay
+///----------------------------------------------------------------------------
+
+class LLFloaterPay : public LLFloater
+{
+public:
+ LLFloaterPay(const LLSD& key);
+ virtual ~LLFloaterPay();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
+
+ void setCallback(money_callback callback) { mCallback = callback; }
+
+
+ static void payViaObject(money_callback callback, LLSafeHandle<LLObjectSelection> selection);
+
+ static void payDirectly(money_callback callback,
+ const LLUUID& target_id,
+ bool is_group);
+
+private:
+ static void onCancel(void* data);
+ static void onKeystroke(LLLineEditor* editor, void* data);
+ static void onGive(void* data);
+ void give(S32 amount);
+ static void processPayPriceReply(LLMessageSystem* msg, void **userdata);
+ void onCacheOwnerName(const LLUUID& owner_id,
+ const std::string& firstname,
+ const std::string& lastname,
+ BOOL is_group);
+ void finishPayUI(const LLUUID& target_id, BOOL is_group);
+
+protected:
+ std::vector<LLGiveMoneyInfo*> mCallbackData;
+ money_callback mCallback;
+ LLTextBox* mObjectNameText;
+ LLUUID mTargetUUID;
+ BOOL mTargetIsGroup;
+ BOOL mHaveName;
+
+ LLButton* mQuickPayButton[MAX_PAY_BUTTONS];
+ LLGiveMoneyInfo* mQuickPayInfo[MAX_PAY_BUTTONS];
+
+ LLSafeHandle<LLObjectSelection> mObjectSelection;
+
+ static S32 sLastAmount;
+};
+
+
+S32 LLFloaterPay::sLastAmount = 0;
+const S32 MAX_AMOUNT_LENGTH = 10;
+const S32 FASTPAY_BUTTON_WIDTH = 80;
+
+LLFloaterPay::LLFloaterPay(const LLSD& key)
+ : LLFloater(key),
+ mCallbackData(),
+ mCallback(NULL),
+ mObjectNameText(NULL),
+ mTargetUUID(key.asUUID()),
+ mTargetIsGroup(FALSE)
+{
+}
+
+// Destroys the object
+LLFloaterPay::~LLFloaterPay()
+{
+ std::for_each(mCallbackData.begin(), mCallbackData.end(), DeletePointer());
+ // Name callbacks will be automatically disconnected since LLFloater is trackable
+}
+
+BOOL LLFloaterPay::postBuild()
+{
+ S32 i = 0;
+
+ LLGiveMoneyInfo* info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_0);
+ mCallbackData.push_back(info);
+
+ childSetAction("fastpay 1",&LLFloaterPay::onGive,info);
+ childSetVisible("fastpay 1", FALSE);
+
+ mQuickPayButton[i] = getChild<LLButton>("fastpay 1");
+ mQuickPayInfo[i] = info;
+ ++i;
+
+ info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_1);
+ mCallbackData.push_back(info);
+
+ childSetAction("fastpay 5",&LLFloaterPay::onGive,info);
+ childSetVisible("fastpay 5", FALSE);
+
+ mQuickPayButton[i] = getChild<LLButton>("fastpay 5");
+ mQuickPayInfo[i] = info;
+ ++i;
+
+ info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_2);
+ mCallbackData.push_back(info);
+
+ childSetAction("fastpay 10",&LLFloaterPay::onGive,info);
+ childSetVisible("fastpay 10", FALSE);
+
+ mQuickPayButton[i] = getChild<LLButton>("fastpay 10");
+ mQuickPayInfo[i] = info;
+ ++i;
+
+ info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_3);
+ mCallbackData.push_back(info);
+
+ childSetAction("fastpay 20",&LLFloaterPay::onGive,info);
+ childSetVisible("fastpay 20", FALSE);
+
+ mQuickPayButton[i] = getChild<LLButton>("fastpay 20");
+ mQuickPayInfo[i] = info;
+ ++i;
+
+
+ childSetVisible("amount text", FALSE);
+
+ std::string last_amount;
+ if(sLastAmount > 0)
+ {
+ last_amount = llformat("%d", sLastAmount);
+ }
+
+ childSetVisible("amount", FALSE);
+
+ getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);
+ childSetText("amount", last_amount);
+ childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32);
+
+ info = new LLGiveMoneyInfo(this, 0);
+ mCallbackData.push_back(info);
+
+ childSetAction("pay btn",&LLFloaterPay::onGive,info);
+ setDefaultBtn("pay btn");
+ childSetVisible("pay btn", FALSE);
+ childSetEnabled("pay btn", (sLastAmount > 0));
+
+ childSetAction("cancel btn",&LLFloaterPay::onCancel,this);
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterPay::onClose(bool app_quitting)
+{
+ // Deselect the objects
+ mObjectSelection = NULL;
+}
+
+// static
+void LLFloaterPay::processPayPriceReply(LLMessageSystem* msg, void **userdata)
+{
+ LLFloaterPay* self = (LLFloaterPay*)userdata;
+ if (self)
+ {
+ S32 price;
+ LLUUID target;
+
+ msg->getUUIDFast(_PREHASH_ObjectData,_PREHASH_ObjectID,target);
+ if (target != self->mTargetUUID)
+ {
+ // This is a message for a different object's pay info
+ return;
+ }
+
+ msg->getS32Fast(_PREHASH_ObjectData,_PREHASH_DefaultPayPrice,price);
+
+ if (PAY_PRICE_HIDE == price)
+ {
+ self->childSetVisible("amount", FALSE);
+ self->childSetVisible("pay btn", FALSE);
+ self->childSetVisible("amount text", FALSE);
+ }
+ else if (PAY_PRICE_DEFAULT == price)
+ {
+ self->childSetVisible("amount", TRUE);
+ self->childSetVisible("pay btn", TRUE);
+ self->childSetVisible("amount text", TRUE);
+ }
+ else
+ {
+ // PAY_PRICE_HIDE and PAY_PRICE_DEFAULT are negative values
+ // So we take the absolute value here after we have checked for those cases
+
+ self->childSetVisible("amount", TRUE);
+ self->childSetVisible("pay btn", TRUE);
+ self->childSetEnabled("pay btn", TRUE);
+ self->childSetVisible("amount text", TRUE);
+
+ self->childSetText("amount", llformat("%d", llabs(price)));
+ }
+
+ S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_ButtonData);
+ S32 i = 0;
+ if (num_blocks > MAX_PAY_BUTTONS) num_blocks = MAX_PAY_BUTTONS;
+
+ S32 max_pay_amount = 0;
+ S32 padding_required = 0;
+
+ for (i=0;i<num_blocks;++i)
+ {
+ S32 pay_button;
+ msg->getS32Fast(_PREHASH_ButtonData,_PREHASH_PayButton,pay_button,i);
+ if (pay_button > 0)
+ {
+ std::string button_str = "L$";
+ button_str += LLResMgr::getInstance()->getMonetaryString( pay_button );
+
+ self->mQuickPayButton[i]->setLabelSelected(button_str);
+ self->mQuickPayButton[i]->setLabelUnselected(button_str);
+ self->mQuickPayButton[i]->setVisible(TRUE);
+ self->mQuickPayInfo[i]->mAmount = pay_button;
+ self->childSetVisible("fastpay text",TRUE);
+
+ if ( pay_button > max_pay_amount )
+ {
+ max_pay_amount = pay_button;
+ }
+ }
+ else
+ {
+ self->mQuickPayButton[i]->setVisible(FALSE);
+ }
+ }
+
+ // build a string containing the maximum value and calc nerw button width from it.
+ std::string balance_str = "L$";
+ balance_str += LLResMgr::getInstance()->getMonetaryString( max_pay_amount );
+ const LLFontGL* font = LLFontGL::getFontSansSerif();
+ S32 new_button_width = font->getWidth( std::string(balance_str));
+ new_button_width += ( 12 + 12 ); // padding
+
+ // dialong is sized for 2 digit pay amounts - larger pay values need to be scaled
+ const S32 threshold = 100000;
+ if ( max_pay_amount >= threshold )
+ {
+ S32 num_digits_threshold = (S32)log10((double)threshold) + 1;
+ S32 num_digits_max = (S32)log10((double)max_pay_amount) + 1;
+
+ // calculate the extra width required by 2 buttons with max amount and some commas
+ padding_required = ( num_digits_max - num_digits_threshold + ( num_digits_max / 3 ) ) * font->getWidth( std::string("0") );
+ };
+
+ // change in button width
+ S32 button_delta = new_button_width - FASTPAY_BUTTON_WIDTH;
+ if ( button_delta < 0 )
+ button_delta = 0;
+
+ // now we know the maximum amount, we can resize all the buttons to be
+ for (i=0;i<num_blocks;++i)
+ {
+ LLRect r;
+ r = self->mQuickPayButton[i]->getRect();
+
+ // RHS button colum needs to move further because LHS changed too
+ if ( i % 2 )
+ {
+ r.setCenterAndSize( r.getCenterX() + ( button_delta * 3 ) / 2 ,
+ r.getCenterY(),
+ r.getWidth() + button_delta,
+ r.getHeight() );
+ }
+ else
+ {
+ r.setCenterAndSize( r.getCenterX() + button_delta / 2,
+ r.getCenterY(),
+ r.getWidth() + button_delta,
+ r.getHeight() );
+ }
+ self->mQuickPayButton[i]->setRect( r );
+ }
+
+ for (i=num_blocks;i<MAX_PAY_BUTTONS;++i)
+ {
+ self->mQuickPayButton[i]->setVisible(FALSE);
+ }
+
+ self->reshape( self->getRect().getWidth() + padding_required, self->getRect().getHeight(), FALSE );
+ }
+ msg->setHandlerFunc("PayPriceReply",NULL,NULL);
+}
+
+// static
+void LLFloaterPay::payViaObject(money_callback callback, LLSafeHandle<LLObjectSelection> selection)
+{
+ // Object that lead to the selection, may be child
+ LLViewerObject* object = selection->getPrimaryObject();
+ if (!object)
+ return;
+
+ LLFloaterPay *floater = LLFloaterReg::showTypedInstance<LLFloaterPay>("pay_object", LLSD(object->getID()));
+ if (!floater)
+ return;
+
+ floater->setCallback(callback);
+ // Hold onto the selection until we close
+ floater->mObjectSelection = selection;
+
+ LLSelectNode* node = selection->getFirstRootNode();
+ if (!node)
+ {
+ //FIXME: notify user object no longer exists
+ floater->closeFloater();
+ return;
+ }
+
+ LLHost target_region = object->getRegion()->getHost();
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_RequestPayPrice);
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
+ msg->sendReliable(target_region);
+ msg->setHandlerFuncFast(_PREHASH_PayPriceReply, processPayPriceReply,(void **)floater);
+
+ LLUUID owner_id;
+ BOOL is_group = FALSE;
+ node->mPermissions->getOwnership(owner_id, is_group);
+
+ floater->childSetText("object_name_text",node->mName);
+
+ floater->finishPayUI(owner_id, is_group);
+}
+
+void LLFloaterPay::payDirectly(money_callback callback,
+ const LLUUID& target_id,
+ bool is_group)
+{
+ LLFloaterPay *floater = LLFloaterReg::showTypedInstance<LLFloaterPay>("pay_resident", LLSD(target_id));
+ if (!floater)
+ return;
+
+ floater->setCallback(callback);
+ floater->mObjectSelection = NULL;
+
+ floater->childSetVisible("amount", TRUE);
+ floater->childSetVisible("pay btn", TRUE);
+ floater->childSetVisible("amount text", TRUE);
+
+ floater->childSetVisible("fastpay text",TRUE);
+ for(S32 i=0;i<MAX_PAY_BUTTONS;++i)
+ {
+ floater->mQuickPayButton[i]->setVisible(TRUE);
+ }
+
+ floater->finishPayUI(target_id, is_group);
+}
+
+void LLFloaterPay::finishPayUI(const LLUUID& target_id, BOOL is_group)
+{
+ gCacheName->get(target_id, is_group, boost::bind(&LLFloaterPay::onCacheOwnerName, this, _1, _2, _3, _4));
+
+ // Make sure the amount field has focus
+
+ childSetFocus("amount", TRUE);
+
+ LLLineEditor* amount = getChild<LLLineEditor>("amount");
+ amount->selectAll();
+ mTargetIsGroup = is_group;
+}
+
+void LLFloaterPay::onCacheOwnerName(const LLUUID& owner_id,
+ const std::string& firstname,
+ const std::string& lastname,
+ BOOL is_group)
+{
+ if (is_group)
+ {
+ childSetVisible("payee_group",true);
+ childSetVisible("payee_resident",false);
+ }
+ else
+ {
+ childSetVisible("payee_group",false);
+ childSetVisible("payee_resident",true);
+ }
+
+ childSetTextArg("payee_name", "[FIRST]", firstname);
+ childSetTextArg("payee_name", "[LAST]", lastname);
+}
+
+// static
+void LLFloaterPay::onCancel(void* data)
+{
+ LLFloaterPay* self = reinterpret_cast<LLFloaterPay*>(data);
+ if(self)
+ {
+ self->closeFloater();
+ }
+}
+
+// static
+void LLFloaterPay::onKeystroke(LLLineEditor*, void* data)
+{
+ LLFloaterPay* self = reinterpret_cast<LLFloaterPay*>(data);
+ if(self)
+ {
+ // enable the Pay button when amount is non-empty and positive, disable otherwise
+ std::string amtstr = self->childGetText("amount");
+ self->childSetEnabled("pay btn", !amtstr.empty() && atoi(amtstr.c_str()) > 0);
+ }
+}
+
+// static
+void LLFloaterPay::onGive(void* data)
+{
+ LLGiveMoneyInfo* info = reinterpret_cast<LLGiveMoneyInfo*>(data);
+ if(info && info->mFloater)
+ {
+ info->mFloater->give(info->mAmount);
+ info->mFloater->closeFloater();
+ }
+}
+
+void LLFloaterPay::give(S32 amount)
+{
+ if(mCallback)
+ {
+ // if the amount is 0, that menas that we should use the
+ // text field.
+ if(amount == 0)
+ {
+ amount = atoi(childGetText("amount").c_str());
+ }
+ sLastAmount = amount;
+
+ // Try to pay an object.
+ if (mObjectSelection.notNull())
+ {
+ LLViewerObject* dest_object = gObjectList.findObject(mTargetUUID);
+ if(dest_object)
+ {
+ LLViewerRegion* region = dest_object->getRegion();
+ if (region)
+ {
+ // Find the name of the root object
+ LLSelectNode* node = mObjectSelection->getFirstRootNode();
+ std::string object_name;
+ if (node)
+ {
+ object_name = node->mName;
+ }
+ S32 tx_type = TRANS_PAY_OBJECT;
+ if(dest_object->isAvatar()) tx_type = TRANS_GIFT;
+ mCallback(mTargetUUID, region, amount, FALSE, tx_type, object_name);
+ mObjectSelection = NULL;
+
+ // request the object owner in order to check if the owner needs to be unmuted
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_RequestFlags, OBJECT_PAY_REQUEST );
+ msg->addUUIDFast(_PREHASH_ObjectID, mTargetUUID);
+ msg->sendReliable( region->getHost() );
+ }
+ }
+ }
+ else
+ {
+ // just transfer the L$
+ mCallback(mTargetUUID, gAgent.getRegion(), amount, mTargetIsGroup, TRANS_GIFT, LLStringUtil::null);
+
+ // check if the payee needs to be unmuted
+ LLMuteList::getInstance()->autoRemove(mTargetUUID, LLMuteList::AR_MONEY);
+ }
+ }
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Namespace LLFloaterPayUtil
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+void LLFloaterPayUtil::registerFloater()
+{
+ // Sneaky, use same code but different XML for dialogs
+ LLFloaterReg::add("pay_resident", "floater_pay.xml",
+ &LLFloaterReg::build<LLFloaterPay>);
+ LLFloaterReg::add("pay_object", "floater_pay_object.xml",
+ &LLFloaterReg::build<LLFloaterPay>);
+}
+
+void LLFloaterPayUtil::payViaObject(money_callback callback,
+ LLSafeHandle<LLObjectSelection> selection)
+{
+ LLFloaterPay::payViaObject(callback, selection);
+}
+
+void LLFloaterPayUtil::payDirectly(money_callback callback,
+ const LLUUID& target_id,
+ bool is_group)
+{
+ LLFloaterPay::payDirectly(callback, target_id, is_group);
+}
diff --git a/indra/newview/llfloaterpay.h b/indra/newview/llfloaterpay.h
new file mode 100644
index 0000000000..161ed78acb
--- /dev/null
+++ b/indra/newview/llfloaterpay.h
@@ -0,0 +1,61 @@
+/**
+ * @file llfloaterpay.h
+ *
+ * $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 LLFLOATERPAY_H
+#define LLFLOATERPAY_H
+
+#include "llsafehandle.h"
+
+class LLObjectSelection;
+class LLUUID;
+class LLViewerRegion;
+
+typedef void (*money_callback)(const LLUUID&, LLViewerRegion*,S32,BOOL,S32,const std::string&);
+
+namespace LLFloaterPayUtil
+{
+ /// Register with LLFloaterReg
+ void registerFloater();
+
+ /// Pay into an in-world object, which will trigger scripts and eventually
+ /// transfer the L$ to the resident or group that owns the object.
+ /// Objects must be selected. Recipient (primary) object may be a child.
+ void payViaObject(money_callback callback,
+ LLSafeHandle<LLObjectSelection> selection);
+
+ /// Pay an avatar or group directly, not via an object in the world.
+ /// Scripts are not notified, L$ can be direcly transferred.
+ void payDirectly(money_callback callback,
+ const LLUUID& target_id,
+ bool is_group);
+}
+
+#endif // LLFLOATERPAY_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 57c043a1e0..dbee9ea309 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -357,8 +357,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
BOOL LLFloaterPreference::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterPreference::onClose, this));
-
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
@@ -566,7 +564,8 @@ void LLFloaterPreference::setHardwareDefaults()
refreshEnabledGraphics();
}
-void LLFloaterPreference::onClose()
+//virtual
+void LLFloaterPreference::onClose(bool app_quitting)
{
gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
LLPanelLogin::setAlwaysRefresh(false);
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index ce31abcd9e..34723b8c7e 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -70,8 +70,9 @@ public:
void apply();
void cancel();
/*virtual*/ void draw();
- virtual BOOL postBuild();
- virtual void onOpen(const LLSD& key);
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
// static data update, called from message handler
static void updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email);
@@ -79,10 +80,7 @@ public:
// refresh all the graphics preferences menus
static void refreshEnabledGraphics();
-protected:
-
- void onClose();
-
+protected:
void onBtnOK();
void onBtnCancel();
void onBtnApply();
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 9e203c4269..43d31aa30a 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -58,7 +58,7 @@ class LLFloaterSellLandUI
public:
LLFloaterSellLandUI(const LLSD& key);
virtual ~LLFloaterSellLandUI();
- void onClose();
+ /*virtual*/ void onClose(bool app_quitting);
private:
class SelectionObserver : public LLParcelObserver
@@ -131,7 +131,6 @@ LLFloaterSellLandUI::LLFloaterSellLandUI(const LLSD& key)
mRegion(0)
{
LLViewerParcelMgr::getInstance()->addObserver(&mParcelSelectionObserver);
- mCloseSignal.connect(boost::bind(&LLFloaterSellLandUI::onClose, this));
}
LLFloaterSellLandUI::~LLFloaterSellLandUI()
@@ -140,7 +139,7 @@ LLFloaterSellLandUI::~LLFloaterSellLandUI()
}
// Because we are single_instance, we are not destroyed on close.
-void LLFloaterSellLandUI::onClose()
+void LLFloaterSellLandUI::onClose(bool app_quitting)
{
// Must release parcel selection to allow land to deselect, see EXT-803
mParcelSelection = NULL;
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index c08996cc26..320647ff1a 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -77,12 +77,14 @@
#include "lltoolpipette.h"
#include "lltoolplacer.h"
#include "lltoolselectland.h"
+#include "lltrans.h"
#include "llui.h"
+#include "llviewercontrol.h"
+#include "llviewerjoystick.h"
+#include "llviewerregion.h"
#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewerjoystick.h"
#include "lluictrlfactory.h"
// Globals
@@ -198,9 +200,7 @@ LLPCode toolData[]={
LL_PCODE_LEGACY_GRASS};
BOOL LLFloaterTools::postBuild()
-{
- mCloseSignal.connect(boost::bind(&LLFloaterTools::onClose, this));
-
+{
// Hide until tool selected
setVisible(FALSE);
@@ -724,7 +724,8 @@ void LLFloaterTools::onOpen(const LLSD& key)
//gMenuBarView->setItemVisible("BuildTools", TRUE);
}
-void LLFloaterTools::onClose()
+// virtual
+void LLFloaterTools::onClose(bool app_quitting)
{
mTab->setVisible(FALSE);
@@ -980,27 +981,86 @@ void LLFloaterTools::onFocusReceived()
void LLFloaterTools::refreshMedia()
{
getMediaState();
- LLFloaterMediaSettings::getInstance();
- LLFloaterMediaSettings::initValues(mMediaSettings );
}
-
+bool LLFloaterTools::selectedMediaEditable()
+{
+ U32 owner_mask_on;
+ U32 owner_mask_off;
+ U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER,
+ &owner_mask_on, &owner_mask_off );
+ U32 group_mask_on;
+ U32 group_mask_off;
+ U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP,
+ &group_mask_on, &group_mask_off );
+ U32 everyone_mask_on;
+ U32 everyone_mask_off;
+ S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE,
+ &everyone_mask_on, &everyone_mask_off );
+
+ bool selected_Media_editable = false;
+
+ // if perms we got back are valid
+ if ( valid_owner_perms &&
+ valid_group_perms &&
+ valid_everyone_perms )
+ {
+
+ if ( ( owner_mask_on & PERM_MODIFY ) ||
+ ( group_mask_on & PERM_MODIFY ) ||
+ ( group_mask_on & PERM_MODIFY ) )
+ {
+ selected_Media_editable = true;
+ }
+ else
+ // user is NOT allowed to press the RESET button
+ {
+ selected_Media_editable = false;
+ };
+ };
+
+ return selected_Media_editable;
+}
void LLFloaterTools::getMediaState()
{
- LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+ LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
+ LLViewerObject* first_object = selected_objects->getFirstObject();
+ LLLineEditor* media_info = getChild<LLLineEditor>("media_info");
+
+ if( !(first_object
+ && first_object->getPCode() == LL_PCODE_VOLUME
+ &&first_object->permModify()
+ ))
+ {
+ childSetEnabled("media_tex", FALSE);
+ childSetEnabled("add_media", FALSE);
+ childSetEnabled("delete_media", FALSE);
+ childSetEnabled("edit_media", FALSE);
+ childSetEnabled("media_info", FALSE);
+ media_info->setEnabled(FALSE);
+ media_info->clear();
+ clearMediaSettings();
+ return;
+ }
- if( !objectp )
+ std::string url = first_object->getRegion()->getCapability("ObjectMedia");
+ bool has_media_capability = (!url.empty());
+
+ if(!has_media_capability)
{
childSetEnabled("media_tex", FALSE);
childSetEnabled("add_media", FALSE);
childSetEnabled("delete_media", FALSE);
childSetEnabled("edit_media", FALSE);
- updateMediaSettings();
+ childSetEnabled("media_info", FALSE);
+ media_info->setEnabled(FALSE);
+ media_info->clear();
+ clearMediaSettings();
return;
}
- bool editable = gAgent.isGodlike() || (objectp->permModify() && objectp->getPCode() == LL_PCODE_VOLUME);
+ bool editable = (first_object->permModify());// && selectedMediaEditable());
// Media settings
U8 has_media = (U8)0;
@@ -1011,24 +1071,104 @@ void LLFloaterTools::getMediaState()
return (object->getTE(face)->getMediaTexGen());
}
} func;
- bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, has_media );
+ // check if all faces have media(or, all dont have media)
+ LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, has_media );
+ bool bool_has_media = (has_media & LLTextureEntry::MF_HAS_MEDIA);
+
+ const LLMediaEntry default_media_data;
+
+ struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
+ {
+ functor_getter_media_data(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
+ LLMediaEntry get( LLViewerObject* object, S32 face )
+ {
+ if ( object )
+ if ( object->getTE(face) )
+ if ( object->getTE(face)->getMediaData() )
+ return *(object->getTE(face)->getMediaData());
+ return mMediaEntry;
+ };
+
+ const LLMediaEntry& mMediaEntry;
+
+ } func_media_data(default_media_data);
+
+ LLMediaEntry media_data_get;
+ LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue( &func_media_data, media_data_get ));
+
+ std::string multi_media_info_str = LLTrans::getString("Multiple Media");
+ std::string media_title = "";
// update UI depending on whether "object" (prim or face) has media
// and whether or not you are allowed to edit it.
- bool bool_has_media = (has_media & LLTextureEntry::MF_HAS_MEDIA);
- childSetEnabled("media_tex", bool_has_media & editable);
- childSetEnabled( "edit_media", bool_has_media & editable );
- childSetEnabled( "delete_media", bool_has_media & editable );
- childSetEnabled( "add_media", ( ! bool_has_media ) & editable );
+
+ // IF all the faces have media (or all dont have media)
+ if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+ {
+ // TODO: get media title and set it.
+ media_info->clear();
+ // if identical is set, all faces are same (whether all empty or has the same media)
+ if(!(LLFloaterMediaSettings::getInstance()->mMultipleMedia) )
+ {
+ // Media data is valid
+ if(media_data_get!=default_media_data)
+ {
+ //TODO: get Meida title
+ //media_title = media_data_get->getTile();
+ //LLFloaterMediaSettings::getInstance()->mIdenticalValidMedia = true;
+ media_title = media_data_get.getHomeURL();
+ }
+ // else all faces might be empty.
+
+
+ }
+ else // there' re Different Medias' been set on on the faces.
+ {
+ media_title = multi_media_info_str;
+ }
+
+ childSetEnabled("media_tex", bool_has_media & editable);
+ childSetEnabled( "edit_media", bool_has_media & editable );
+ childSetEnabled( "delete_media", bool_has_media & editable );
+ childSetEnabled( "add_media", ( ! bool_has_media ) & editable );
+ media_info->setEnabled(bool_has_media & editable);
+ // TODO: display a list of all media on the face - use 'identical' flag
+ }
+ else // not all face has media but at least one does.
+ {
+ // seleted faces have not identical value
+ LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data );
+
+ if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+ {
+ media_title = multi_media_info_str;
+ }
+ else
+ {
+ // Media data is valid
+ if(media_data_get!=default_media_data)
+ {
+ //TODO: get Meida title
+ //media_title = media_data_get->getTile();
+ media_title = media_data_get.getHomeURL();
+ }
+
+ }
+
+ media_info->setEnabled(TRUE);
+ media_info->setTentative(true);
+ childSetEnabled("media_tex", TRUE);
+ childSetEnabled( "edit_media", TRUE);
+ childSetEnabled( "delete_media", TRUE);
+ childSetEnabled( "add_media", FALSE );
+ }
+ media_info->setText(media_title);
// load values for media settings
updateMediaSettings();
- // if identical is set, all faces are same
- if ( identical )
- {
- // TODO: display a list of all media on the face - use 'identical' flag
- };
+ LLFloaterMediaSettings::initValues(mMediaSettings, editable );
}
@@ -1104,6 +1244,12 @@ bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& re
return false;
}
+void LLFloaterTools::clearMediaSettings()
+{
+ LLFloaterMediaSettings::getInstance();
+ LLFloaterMediaSettings::clearValues(false);
+
+}
//////////////////////////////////////////////////////////////////////////////
//
void LLFloaterTools::updateMediaSettings()
@@ -1116,23 +1262,26 @@ void LLFloaterTools::updateMediaSettings()
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
// TODO: (CP) refactor this using something clever or boost or both !!
- LLMediaEntry default_media_data;
+ const LLMediaEntry default_media_data;
// controls
U8 value_u8 = default_media_data.getControls();
struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
{
+ functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
+
U8 get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getControls();
- LLMediaEntry default_media_data;
- return default_media_data.getControls();
+ return mMediaEntry.getControls();
};
- } func_controls;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_controls(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
base_key = std::string( LLMediaEntry::CONTROLS_KEY );
mMediaSettings[ base_key ] = value_u8;
@@ -1142,17 +1291,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = default_media_data.getFirstClickInteract();
struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_first_click(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getFirstClickInteract();
- LLMediaEntry default_media_data;
- return default_media_data.getFirstClickInteract();
+ return mMediaEntry.getFirstClickInteract();
};
- } func_first_click;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_first_click(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
base_key = std::string( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1162,38 +1314,43 @@ void LLFloaterTools::updateMediaSettings()
value_str = default_media_data.getHomeURL();
struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
{
+ functor_getter_home_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
std::string get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getHomeURL();
- LLMediaEntry default_media_data;
- return default_media_data.getHomeURL();
+ return mMediaEntry.getHomeURL();
};
- } func_home_url;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_home_url(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
base_key = std::string( LLMediaEntry::HOME_URL_KEY );
mMediaSettings[ base_key ] = value_str;
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
- llwarns<<"Angela debug : home url string == "<<value_str<<llendl;
// Current URL
value_str = default_media_data.getCurrentURL();
struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
{
- std::string get( LLViewerObject* object, S32 face )
+ functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
+ std::string get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getCurrentURL();
- LLMediaEntry default_media_data;
- return default_media_data.getCurrentURL();
+ return mMediaEntry.getCurrentURL();
};
- } func_current_url;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_current_url(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
base_key = std::string( LLMediaEntry::CURRENT_URL_KEY );
mMediaSettings[ base_key ] = value_str;
@@ -1203,17 +1360,21 @@ void LLFloaterTools::updateMediaSettings()
value_bool = default_media_data.getAutoZoom();
struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
{
+
+ functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoZoom();
- LLMediaEntry default_media_data;
- return default_media_data.getAutoZoom();
+ return mMediaEntry.getAutoZoom();
};
- } func_auto_zoom;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_auto_zoom(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
base_key = std::string( LLMediaEntry::AUTO_ZOOM_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1223,37 +1384,44 @@ void LLFloaterTools::updateMediaSettings()
value_bool = default_media_data.getAutoPlay();
struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoPlay();
- LLMediaEntry default_media_data;
- return default_media_data.getAutoPlay();
+ return mMediaEntry.getAutoPlay();
};
- } func_auto_play;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_auto_play(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
base_key = std::string( LLMediaEntry::AUTO_PLAY_KEY );
mMediaSettings[ base_key ] = value_bool;
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
+
// Auto scale
value_bool = default_media_data.getAutoScale();
struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoScale();
- LLMediaEntry default_media_data;
- return default_media_data.getAutoScale();;
+ return mMediaEntry.getAutoScale();;
};
- } func_auto_scale;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_auto_scale(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
base_key = std::string( LLMediaEntry::AUTO_SCALE_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1263,17 +1431,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = default_media_data.getAutoLoop();
struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoLoop();
- LLMediaEntry default_media_data;
- return default_media_data.getAutoLoop();
+ return mMediaEntry.getAutoLoop();
};
- } func_auto_loop;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_auto_loop(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
base_key = std::string( LLMediaEntry::AUTO_LOOP_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1283,17 +1454,20 @@ void LLFloaterTools::updateMediaSettings()
value_int = default_media_data.getWidthPixels();
struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
{
+ functor_getter_width_pixels(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
int get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getWidthPixels();
- LLMediaEntry default_media_data;
- return default_media_data.getWidthPixels();
+ return mMediaEntry.getWidthPixels();
};
- } func_width_pixels;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_width_pixels(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
base_key = std::string( LLMediaEntry::WIDTH_PIXELS_KEY );
mMediaSettings[ base_key ] = value_int;
@@ -1303,17 +1477,20 @@ void LLFloaterTools::updateMediaSettings()
value_int = default_media_data.getHeightPixels();
struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
{
- int get( LLViewerObject* object, S32 face )
+ functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
+ int get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getHeightPixels();
- LLMediaEntry default_media_data;
- return default_media_data.getHeightPixels();
+ return mMediaEntry.getHeightPixels();
};
- } func_height_pixels;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_height_pixels(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
base_key = std::string( LLMediaEntry::HEIGHT_PIXELS_KEY );
mMediaSettings[ base_key ] = value_int;
@@ -1323,17 +1500,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = default_media_data.getAltImageEnable();
struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
{
- bool get( LLViewerObject* object, S32 face )
+ functor_getter_enable_alt_image(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
+ bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAltImageEnable();
- LLMediaEntry default_media_data;
- return default_media_data.getAltImageEnable();
+ return mMediaEntry.getAltImageEnable();
};
- } func_enable_alt_image;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_enable_alt_image(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
base_key = std::string( LLMediaEntry::ALT_IMAGE_ENABLE_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1343,17 +1523,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER );
struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
{
- bool get( LLViewerObject* object, S32 face )
+ functor_getter_perms_owner_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
+ bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
- LLMediaEntry default_media_data;
- return 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER );
+ return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
};
- } func_perms_owner_interact;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_perms_owner_interact(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
base_key = std::string( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1363,17 +1546,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER );
struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
- LLMediaEntry default_media_data;
- return 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER );
+ return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
};
- } func_perms_owner_control;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_perms_owner_control(default_media_data);
identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
base_key = std::string( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1383,17 +1569,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP );
struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_perms_group_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
- LLMediaEntry default_media_data;
- return 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP );
+ return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
};
- } func_perms_group_interact;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_perms_group_interact(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
base_key = std::string( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1403,17 +1592,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP );
struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_perms_group_control(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
- LLMediaEntry default_media_data;
- return 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP );
+ return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
};
- } func_perms_group_control;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_perms_group_control(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
base_key = std::string( LLPanelContents::PERMS_GROUP_CONTROL_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1423,17 +1615,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_perms_anyone_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
- LLMediaEntry default_media_data;
- return 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
+ return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
};
- } func_perms_anyone_interact;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_perms_anyone_interact(default_media_data);
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
base_key = std::string( LLPanelContents::PERMS_ANYONE_INTERACT_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1443,17 +1638,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE );
struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
- LLMediaEntry default_media_data;
- return 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE );
+ return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
};
- } func_perms_anyone_control;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_perms_anyone_control(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
base_key = std::string( LLPanelContents::PERMS_ANYONE_CONTROL_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1463,17 +1661,20 @@ void LLFloaterTools::updateMediaSettings()
value_bool = default_media_data.getWhiteListEnable();
struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
{
+ functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {}
+
bool get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getWhiteListEnable();
- LLMediaEntry default_media_data;
- return default_media_data.getWhiteListEnable();
+ return mMediaEntry.getWhiteListEnable();
};
- } func_whitelist_enable;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_whitelist_enable(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
base_key = std::string( LLMediaEntry::WHITELIST_ENABLE_KEY );
mMediaSettings[ base_key ] = value_bool;
@@ -1483,17 +1684,20 @@ void LLFloaterTools::updateMediaSettings()
std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
{
+ functor_getter_whitelist_urls(const LLMediaEntry& entry): mMediaEntry(entry) {}
+
std::vector<std::string> get( LLViewerObject* object, S32 face )
{
if ( object )
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getWhiteList();
- LLMediaEntry default_media_data;
- return default_media_data.getWhiteList();
+ return mMediaEntry.getWhiteList();
};
- } func_whitelist_urls;
+ const LLMediaEntry & mMediaEntry;
+
+ } func_whitelist_urls(default_media_data);
identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
base_key = std::string( LLMediaEntry::WHITELIST_KEY );
mMediaSettings[ base_key ].clear();
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 008c9677ed..ffccf93943 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -74,6 +74,7 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ BOOL canClose();
+ /*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void draw();
/*virtual*/ void onFocusReceived();
@@ -105,10 +106,10 @@ public:
void onClickBtnDeleteMedia();
void onClickBtnAddMedia();
void onClickBtnEditMedia();
-
+ void clearMediaSettings();
+ bool selectedMediaEditable();
private:
- void onClose();
void refresh();
void refreshMedia();
void getMediaState();
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 266252efea..98ca33c9cc 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -283,8 +283,6 @@ LLFloaterUIPreview::~LLFloaterUIPreview()
// Perform post-build setup (defined in superclass)
BOOL LLFloaterUIPreview::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterUIPreview::onClose, this, _2));
-
LLPanel* main_panel_tmp = getChild<LLPanel>("main_panel"); // get a pointer to the main panel in order to...
mFileList = main_panel_tmp->getChild<LLScrollListCtrl>("name_list"); // save pointer to file list
// Double-click opens the floater, for convenience
@@ -442,9 +440,9 @@ void LLFloaterUIPreview::onClickExportSchema()
// Close click handler -- delete my displayed floater if it exists
-void LLFloaterUIPreview::onClose(const LLSD& app_quitting)
+void LLFloaterUIPreview::onClose(bool app_quitting)
{
- if(!app_quitting.asBoolean() && mDisplayedFloater)
+ if(!app_quitting && mDisplayedFloater)
{
onClickCloseDisplayedFloater(PRIMARY_FLOATER);
onClickCloseDisplayedFloater(SECONDARY_FLOATER);
diff --git a/indra/newview/llfloateruipreview.h b/indra/newview/llfloateruipreview.h
index b8c378e2e9..2a98c90727 100644
--- a/indra/newview/llfloateruipreview.h
+++ b/indra/newview/llfloateruipreview.h
@@ -96,7 +96,9 @@ public:
std::string getLocStr(S32 ID); // fetches the localization string based on what is selected in the drop-down menu
void displayFloater(BOOL click, S32 ID, bool save = false); // needs to be public so live file can call it when it finds an update
- BOOL postBuild(); // post-build setup (called by superclass' constructor)
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
+
void refreshList(); // refresh list (empty it out and fill it up from scratch)
void addFloaterEntry(const std::string& path); // add a single file's entry to the list of floaters
@@ -116,9 +118,6 @@ public:
typedef std::map<std::string, std::pair<StringListPtr,StringListPtr> > DiffMap;
DiffMap mDiffsMap; // map, of filename to pair of list of changed element paths and list of errors
-protected:
- void onClose(const LLSD& app_quitting);
-
private:
// XUI elements for this floater
LLScrollListCtrl* mFileList; // scroll list control for file list
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index a7658d90e9..b64257b11d 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -293,11 +293,11 @@ LLFloaterVoiceDeviceSettings::LLFloaterVoiceDeviceSettings(const LLSD& seed)
}
BOOL LLFloaterVoiceDeviceSettings::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterVoiceDeviceSettings::onClose, this));
-
center();
return TRUE;
}
+
+// virtual
void LLFloaterVoiceDeviceSettings::onOpen(const LLSD& key)
{
if(mDevicePanel)
@@ -306,7 +306,8 @@ void LLFloaterVoiceDeviceSettings::onOpen(const LLSD& key)
}
}
-void LLFloaterVoiceDeviceSettings::onClose()
+// virtual
+void LLFloaterVoiceDeviceSettings::onClose(bool app_settings)
{
if(mDevicePanel)
{
diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h
index 2565bfad2b..f1603dc414 100644
--- a/indra/newview/llfloatervoicedevicesettings.h
+++ b/indra/newview/llfloatervoicedevicesettings.h
@@ -68,8 +68,9 @@ class LLFloaterVoiceDeviceSettings : public LLFloater
public:
- virtual BOOL postBuild();
+ /*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_settings);
/*virtual*/ void draw();
void apply();
void cancel();
@@ -78,9 +79,7 @@ private:
protected:
static void* createPanelVoiceDeviceSettings(void* user_data);
-
- void onClose();
-
+
protected:
LLPanelVoiceDeviceSettings* mDevicePanel;
};
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 098a5197df..d653d44f8c 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -183,8 +183,6 @@ void* LLFloaterWorldMap::createWorldMapView(void* data)
BOOL LLFloaterWorldMap::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterWorldMap::onClose, this));
-
mTabs = getChild<LLTabContainer>("maptab");
if (!mTabs) return FALSE;
@@ -255,7 +253,8 @@ LLFloaterWorldMap* LLFloaterWorldMap::getInstance()
return LLFloaterReg::getTypedInstance<LLFloaterWorldMap>("world_map");
}
-void LLFloaterWorldMap::onClose()
+// virtual
+void LLFloaterWorldMap::onClose(bool app_quitting)
{
// While we're not visible, discard the overlay images we're using
LLWorldMap::getInstance()->clearImageRefs();
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index f117ea05af..6d5b7543d4 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -65,6 +65,7 @@ public:
BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
static void reloadIcons(void*);
@@ -111,9 +112,7 @@ public:
// teleport to the tracked item, if there is one
void teleport();
-protected:
- void onClose();
-
+protected:
void onGoHome();
void onLandmarkComboPrearrange();
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index dde36ac25b..3e449e2c82 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -78,12 +78,11 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
}
}
- mCloseSignal.connect(boost::bind(&LLIMFloater::onClose, this));
-
LLTransientFloaterMgr::getInstance()->registerTransientFloater(this);
}
-void LLIMFloater::onClose()
+// virtual
+void LLIMFloater::onClose(bool app_quitting)
{
LLIMModel::instance().sendLeaveSession(mSessionID, mOtherParticipantUUID);
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index a183212f04..f85a941be3 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -56,6 +56,7 @@ public:
/*virtual*/ void setVisible(BOOL visible);
// LLFloater overrides
+ /*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
// override LLFloater's minimization according to EXT-1216
/*virtual*/ void setMinimized(BOOL minimize);
@@ -79,10 +80,6 @@ public:
// called when docked floater's position has been set by chiclet
void setPositioned(bool b) { mPositioned = b; };
- // handler for a CLOSE signal
- void onClose();
-
-
private:
static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 89a885090c..4435bba0ed 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -1052,8 +1052,6 @@ LLFloaterIMPanel::~LLFloaterIMPanel()
BOOL LLFloaterIMPanel::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterIMPanel::onClose, this));
-
mVisibleSignal.connect(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
mInputEditor = getChild<LLLineEditor>("chat_editor");
@@ -1610,7 +1608,8 @@ void LLFloaterIMPanel::onInputEditorKeystroke(LLLineEditor* caller, void* userda
}
}
-void LLFloaterIMPanel::onClose()
+// virtual
+void LLFloaterIMPanel::onClose(bool app_quitting)
{
setTyping(FALSE);
diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h
index fb9b28ad16..57379b2c0d 100644
--- a/indra/newview/llimpanel.h
+++ b/indra/newview/llimpanel.h
@@ -198,7 +198,7 @@ public:
// Check typing timeout timer.
/*virtual*/ void draw();
- void onClose();
+ /*virtual*/ void onClose(bool app_quitting);
void onVisibilityChange(const LLSD& new_visibility);
// add target ids to the session.
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 9b75c15597..4046c893c1 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -51,6 +51,7 @@
#include "llcontrol.h" // LLCachedControl
#include "llfloater.h"
#include "llfloaterreg.h"
+#include "llmenubutton.h"
#include "lltooltip.h" // positionViewNearMouse()
#include "lluictrl.h"
@@ -80,6 +81,9 @@ public:
// Because floater is single instance, need to re-parse data on each spawn
// (for example, inspector about same avatar but in different position)
/*virtual*/ void onOpen(const LLSD& avatar_id);
+
+ // When closing they should close their gear menu
+ /*virtual*/ void onClose(bool app_quitting);
// Inspectors close themselves when they lose focus
/*virtual*/ void onFocusLost();
@@ -288,6 +292,12 @@ void LLInspectAvatar::onOpen(const LLSD& data)
updateVolumeSlider();
}
+// virtual
+void LLInspectAvatar::onClose(bool app_quitting)
+{
+ getChild<LLMenuButton>("gear_btn")->hideMenu();
+}
+
//virtual
void LLInspectAvatar::onFocusLost()
{
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index b0e6273c41..8c38e785e9 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -46,6 +46,7 @@
#include "llcontrol.h" // LLCachedControl
#include "llfloater.h"
#include "llfloaterreg.h"
+#include "llmenubutton.h"
#include "llresmgr.h" // getMonetaryString
#include "llsafehandle.h"
#include "lltextbox.h" // for description truncation
@@ -81,7 +82,7 @@ public:
/*virtual*/ void onOpen(const LLSD& avatar_id);
// Release the selection and do other cleanup
- void onClose();
+ /*virtual*/ void onClose(bool app_quitting);
// Inspectors close themselves when they lose focus
/*virtual*/ void onFocusLost();
@@ -175,8 +176,6 @@ BOOL LLInspectObject::postBuild(void)
LLSelectMgr::getInstance()->mUpdateSignal.connect(
boost::bind(&LLInspectObject::update, this) );
- mCloseSignal.connect( boost::bind(&LLInspectObject::onClose, this) );
-
return TRUE;
}
@@ -250,10 +249,13 @@ void LLInspectObject::onOpen(const LLSD& data)
}
}
-void LLInspectObject::onClose()
+// virtual
+void LLInspectObject::onClose(bool app_quitting)
{
// Release selection to deselect
mObjectSelection = NULL;
+
+ getChild<LLMenuButton>("gear_btn")->hideMenu();
}
//virtual
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index ad6ebbbc5c..26ff219437 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -68,7 +68,9 @@ LLMediaCtrl::Params::Params()
texture_width("texture_width", 1024),
texture_height("texture_height", 1024),
caret_color("caret_color")
-{}
+{
+ tab_stop(false);
+}
LLMediaCtrl::LLMediaCtrl( const Params& p) :
LLPanel( p ),
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 599e6b6859..7c8ffa3b94 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -72,11 +72,9 @@ public:
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
- virtual void onClose (bool app_quitting) { if(app_quitting) destroy(); else setVisible(false); }
+ /*virtual*/ void onOpen (const LLSD& key);
- virtual void onOpen (const LLSD& key);
-
- virtual void draw ();
+ /*virtual*/ void draw ();
private:
void add_timestamped_line(const LLChat& chat, const LLColor4& color);
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 1ed5fa4357..a03902caba 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -78,11 +78,11 @@ public:
* Profile tabs should close any opened panels here.
*
* Called from LLPanelProfile::onOpen() before opening new profile.
- * See LLPanelpicks::onClose for example. LLPanelPicks closes picture info panel
+ * See LLPanelPicks::onClosePanel for example. LLPanelPicks closes picture info panel
* before new profile is displayed, otherwise new profile will
* be hidden behind picture info panel.
*/
- virtual void onClose() {}
+ virtual void onClosePanel() {}
/**
* Resets controls visibility, state, etc.
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index c61b987b1c..ee0426c7df 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -786,8 +786,8 @@ void LLPanelFace::getState()
childSetEnabled("button align",FALSE);
childSetEnabled("button apply",FALSE);
- childSetEnabled("has media", FALSE);
- childSetEnabled("media info set", FALSE);
+ //childSetEnabled("has media", FALSE);
+ //childSetEnabled("media info set", FALSE);
}
}
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index be40d6fb5f..295415cb2d 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -49,6 +49,8 @@
#include "llpanelcontents.h"
#include "llpluginclassmedia.h"
#include "llfloatermediasettings.h"
+#include "llfloatertools.h"
+#include "lltrans.h"
////////////////////////////////////////////////////////////////////////////////
//
@@ -155,43 +157,11 @@ void LLPanelMediaSettingsGeneral::draw()
};
// current URL can change over time.
- updateCurrentURL();
+// updateCurrentURL();
// enable/disable RESRET button depending on permissions
// since this is the same as a navigate action
- U32 owner_mask_on;
- U32 owner_mask_off;
- U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER,
- &owner_mask_on, &owner_mask_off );
- U32 group_mask_on;
- U32 group_mask_off;
- U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP,
- &group_mask_on, &group_mask_off );
- U32 everyone_mask_on;
- U32 everyone_mask_off;
- S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE,
- &everyone_mask_on, &everyone_mask_off );
-
- bool user_can_press_reset = false;
-
- // if perms we got back are valid
- if ( valid_owner_perms &&
- valid_group_perms &&
- valid_everyone_perms )
- {
- // if user is allowed to press the RESET button
- if ( ( owner_mask_on & PERM_MODIFY ) ||
- ( group_mask_on & PERM_MODIFY ) ||
- ( group_mask_on & PERM_MODIFY ) )
- {
- user_can_press_reset = true;
- }
- else
- // user is NOT allowed to press the RESET button
- {
- user_can_press_reset = false;
- };
- };
+ bool user_can_press_reset = gFloaterTools->selectedMediaEditable();
// several places modify this widget so we must collect states in one place
if ( reset_button_is_active )
@@ -216,7 +186,7 @@ void LLPanelMediaSettingsGeneral::draw()
////////////////////////////////////////////////////////////////////////////////
// static
-void LLPanelMediaSettingsGeneral::clearValues( void* userdata )
+void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
{
LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
self->mAltImageEnable ->clear();
@@ -230,12 +200,23 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata )
self->mHeightPixels->clear();
self->mHomeURL->clear();
self->mWidthPixels->clear();
+ self->mAltImageEnable ->setEnabled(editable);
+ self->mAutoLoop ->setEnabled(editable);
+ self->mAutoPlay ->setEnabled(editable);
+ self->mAutoScale ->setEnabled(editable);
+ self->mAutoZoom ->setEnabled(editable);
+ self->mControls ->setEnabled(editable);
+ self->mCurrentURL ->setEnabled(editable);
+ self->mFirstClick ->setEnabled(editable);
+ self->mHeightPixels ->setEnabled(editable);
+ self->mHomeURL ->setEnabled(editable);
+ self->mWidthPixels ->setEnabled(editable);
self->mPreviewMedia->unloadMediaSource();
}
////////////////////////////////////////////////////////////////////////////////
// static
-void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings )
+void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable)
{
LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
@@ -243,6 +224,29 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_
//llinfos << ll_pretty_print_sd(media_settings) << llendl;
//llinfos << "---------------" << llendl;
+ // IF all the faces have media (or all dont have media)
+ if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
+ {
+ self->clearValues(self, editable);
+ // only show multiple
+ self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
+ return;
+ }
+
+ }
+ else
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+ {
+ self->clearValues(self, editable);
+ // only show multiple
+ self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
+ return;
+ }
+
+ }
std::string base_key( "" );
std::string tentative_key( "" );
@@ -293,10 +297,11 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_
static_cast< LLSpinCtrl* >( data_set[ i ].ctrl_ptr )->
setValue( media_settings[ base_key ].asInteger() );
+ data_set[ i ].ctrl_ptr->setEnabled(editable);
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
-
+
// interrogates controls and updates widgets as required
self->updateMediaPreview();
self->updateCurrentURL();
@@ -322,30 +327,17 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview()
// Helper to set current URL
void LLPanelMediaSettingsGeneral::updateCurrentURL()
{
- if( mPreviewMedia )
+ if( mCurrentURL->getText().empty() )
{
- LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
- if( media_plugin )
- {
- // get current URL from plugin and display
- std::string current_location = media_plugin->getLocation();
- if ( current_location.length() )
- {
- childSetText( "current_url", current_location );
- }
- else
- // current location may be empty so we need to clear it
- {
- const std::string empty_string( "" );
- childSetText( "current_url", empty_string );
- };
- };
- };
+ childSetText( "current_url", mHomeURL->getText() );
+ }
+
}
////////////////////////////////////////////////////////////////////////////////
-void LLPanelMediaSettingsGeneral::onClose()
+// virtual
+void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
{
if(mPreviewMedia)
{
@@ -374,7 +366,7 @@ void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl()
void LLPanelMediaSettingsGeneral::apply( void* userdata )
{
LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
-
+ self->mHomeURL->onCommit();
// build LLSD Fragment
LLSD media_data_general;
self->getValues(media_data_general);
diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h
index 24678a3a07..5acfa39181 100644
--- a/indra/newview/llpanelmediasettingsgeneral.h
+++ b/indra/newview/llpanelmediasettingsgeneral.h
@@ -48,7 +48,9 @@ class LLPanelMediaSettingsGeneral : public LLPanel
{
public:
BOOL postBuild();
- virtual void draw();
+ /*virtual*/ void draw();
+ /*virtual*/ void onClose(bool app_quitting);
+
static void apply(void*);
void getValues(LLSD &fill_me_in);
@@ -56,14 +58,12 @@ public:
~LLPanelMediaSettingsGeneral();
void setParent( LLFloaterMediaSettings* parent );
- static void initValues( void* userdata, const LLSD& media_settings );
- static void clearValues( void* userdata );
+ static void initValues( void* userdata, const LLSD& media_settings ,bool editable);
+ static void clearValues( void* userdata, bool editable);
void updateMediaPreview();
void updateCurrentURL();
- void onClose();
-
protected:
LLFloaterMediaSettings* mParent;
@@ -74,7 +74,7 @@ private:
LLComboBox* mControls;
LLCheckBoxCtrl* mAutoLoop;
LLCheckBoxCtrl* mFirstClick;
- LLTextureCtrl* mMediaPreview;
+// LLTextureCtrl* mMediaPreview;
LLCheckBoxCtrl* mAutoZoom;
LLCheckBoxCtrl* mAutoPlay;
LLCheckBoxCtrl* mAutoScale;
diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp
index d6a2677f4b..4d84874e7a 100644
--- a/indra/newview/llpanelmediasettingspermissions.cpp
+++ b/indra/newview/llpanelmediasettingspermissions.cpp
@@ -49,7 +49,8 @@
#include "llselectmgr.h"
#include "llmediaentry.h"
#include "llnamebox.h"
-
+#include "lltrans.h"
+#include "llfloatermediasettings.h"
////////////////////////////////////////////////////////////////////////////////
//
LLPanelMediaSettingsPermissions::LLPanelMediaSettingsPermissions() :
@@ -119,7 +120,7 @@ void LLPanelMediaSettingsPermissions::draw()
////////////////////////////////////////////////////////////////////////////////
// static
-void LLPanelMediaSettingsPermissions::clearValues( void* userdata )
+void LLPanelMediaSettingsPermissions::clearValues( void* userdata, bool editable)
{
LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata;
self->mPermsOwnerInteract->clear();
@@ -128,16 +129,41 @@ void LLPanelMediaSettingsPermissions::clearValues( void* userdata )
self->mPermsGroupControl->clear();
self->mPermsWorldInteract ->clear();
self->mPermsWorldControl ->clear();
-// mPermsGroupName ->setValue(0);
-
+
+ self->mPermsOwnerInteract->setEnabled(editable);
+ self->mPermsOwnerControl ->setEnabled(editable);
+ self->mPermsGroupInteract->setEnabled(editable);
+ self->mPermsGroupControl ->setEnabled(editable);
+ self->mPermsWorldInteract->setEnabled(editable);
+ self->mPermsWorldControl ->setEnabled(editable);
}
////////////////////////////////////////////////////////////////////////////////
// static
-void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& media_settings )
+void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& media_settings , bool editable)
{
LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata;
+ if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
+ {
+ self->clearValues(self, editable);
+ // only show multiple
+ return;
+ }
+
+ }
+ else
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+ {
+ self->clearValues(self, editable);
+ // only show multiple
+ return;
+ }
+
+ }
std::string base_key( "" );
std::string tentative_key( "" );
@@ -178,10 +204,17 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me
if ( data_set[ i ].ctrl_type == "LLComboBox" )
static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
setCurrentByIndex( media_settings[ base_key ].asInteger() );
-
+ data_set[ i ].ctrl_ptr->setEnabled(editable);
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
+ self->childSetEnabled("media_perms_label_owner", editable );
+ self->childSetText("media_perms_label_owner", LLTrans::getString("Media Perms Owner") );
+ self->childSetEnabled("media_perms_label_group", editable );
+ self->childSetText("media_perms_label_group", LLTrans::getString("Media Perms Group") );
+ self->childSetEnabled("media_perms_label_anyone", editable );
+ self->childSetText("media_perms_label_anyone", LLTrans::getString("Media Perms Anyone") );
+
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingspermissions.h b/indra/newview/llpanelmediasettingspermissions.h
index ce293e07b9..ecc50e3582 100644
--- a/indra/newview/llpanelmediasettingspermissions.h
+++ b/indra/newview/llpanelmediasettingspermissions.h
@@ -55,8 +55,8 @@ class LLPanelMediaSettingsPermissions : public LLPanel
LLPanelMediaSettingsPermissions();
~LLPanelMediaSettingsPermissions();
- static void initValues( void* userdata, const LLSD& media_settings );
- static void clearValues( void* userdata );
+ static void initValues( void* userdata, const LLSD& media_settings, bool editable );
+ static void clearValues( void* userdata, bool editable);
private:
LLCheckBoxCtrl* mPermsOwnerInteract;
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index a4eee82aa9..cea105d7de 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -44,7 +44,7 @@
#include "llselectmgr.h"
#include "llmediaentry.h"
#include "llfloaterwhitelistentry.h"
-
+#include "llfloatermediasettings.h"
////////////////////////////////////////////////////////////////////////////////
//
LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity()
@@ -110,10 +110,30 @@ void LLPanelMediaSettingsSecurity::draw()
////////////////////////////////////////////////////////////////////////////////
// static
-void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings )
+void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
+ if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
+ {
+ self->clearValues(self, editable);
+ // only show multiple
+ return;
+ }
+
+ }
+ else
+ {
+ if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
+ {
+ self->clearValues(self, editable);
+ // only show multiple
+ return;
+ }
+
+ }
std::string base_key( "" );
std::string tentative_key( "" );
@@ -163,7 +183,7 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media
++iter;
};
};
-
+ data_set[ i ].ctrl_ptr->setEnabled(editable);
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
@@ -171,11 +191,13 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media
////////////////////////////////////////////////////////////////////////////////
// static
-void LLPanelMediaSettingsSecurity::clearValues( void* userdata )
+void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
self->mEnableWhiteList->clear();
self->mWhiteListList->deleteAllItems();
+ self->mEnableWhiteList->setEnabled(editable);
+ self->mWhiteListList->setEnabled(editable);
}
////////////////////////////////////////////////////////////////////////////////
// static
diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h
index d77509897d..b7cf67c039 100644
--- a/indra/newview/llpanelmediasettingssecurity.h
+++ b/indra/newview/llpanelmediasettingssecurity.h
@@ -49,8 +49,8 @@ class LLPanelMediaSettingsSecurity : public LLPanel
LLPanelMediaSettingsSecurity();
~LLPanelMediaSettingsSecurity();
- static void initValues( void* userdata, const LLSD& media_settings );
- static void clearValues( void* userdata );
+ static void initValues( void* userdata, const LLSD& media_settings,bool editable );
+ static void clearValues( void* userdata, bool editable);
void addWhiteListItem(const std::string& url);
private:
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index e74afba25a..979e9618da 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -463,7 +463,8 @@ void LLPickItem::processProperties(void *data, EAvatarProcessorType type)
LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorID, this);
}
-void LLPanelPicks::onClose()
+// virtual
+void LLPanelPicks::onClosePanel()
{
// Toggle off Pick Info panel if it is visible.
if(mPickPanel && mPickPanel->getVisible())
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 7ebdc3089c..18c571c735 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -77,7 +77,7 @@ public:
/**
* Closes LLPanelPick if it is visible.
*/
- /*virtual*/ void onClose();
+ /*virtual*/ void onClosePanel();
private:
void onClickDelete();
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index eb269fabe3..d6be0a9419 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -44,14 +44,16 @@
#include "llqueryflags.h"
#include "llbutton.h"
+#include "llcombobox.h"
#include "lliconctrl.h"
-#include "lllineeditor.h"
#include "llscrollcontainer.h"
#include "lltextbox.h"
+#include "lltrans.h"
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llagent.h"
+#include "llagentui.h"
#include "llavatarpropertiesprocessor.h"
#include "llfloaterworldmap.h"
#include "llinventorymodel.h"
@@ -64,6 +66,16 @@
#include "llviewertexteditor.h"
#include "llworldmap.h"
+//----------------------------------------------------------------------------
+// Aux types and methods
+//----------------------------------------------------------------------------
+
+typedef std::pair<LLUUID, std::string> folder_pair_t;
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
+static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
+
static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info");
LLPanelPlaceInfo::LLPanelPlaceInfo()
@@ -141,11 +153,8 @@ BOOL LLPanelPlaceInfo::postBuild()
mCreated = getChild<LLTextBox>("created");
mTitleEditor = getChild<LLLineEditor>("title_editor");
- mTitleEditor->setCommitCallback(boost::bind(&LLPanelPlaceInfo::onCommitTitleOrNote, this, TITLE));
-
mNotesEditor = getChild<LLTextEditor>("notes_editor");
- mNotesEditor->setCommitCallback(boost::bind(&LLPanelPlaceInfo::onCommitTitleOrNote, this, NOTE));
- mNotesEditor->setCommitOnFocusLost(true);
+ mFolderCombo = getChild<LLComboBox>("folder_combo");
LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container");
scroll_container->setBorderVisible(FALSE);
@@ -316,6 +325,7 @@ void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel");
bool is_info_type_agent = type == AGENT;
+ bool is_info_type_create_landmark = type == CREATE_LANDMARK;
bool is_info_type_landmark = type == LANDMARK;
bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
@@ -329,7 +339,10 @@ void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
mLastVisited->setVisible(is_info_type_teleport_history);
landmark_info_panel->setVisible(is_info_type_landmark);
- landmark_edit_panel->setVisible(is_info_type_landmark || type == CREATE_LANDMARK);
+ landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark);
+
+ getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark);
+ mFolderCombo->setVisible(is_info_type_create_landmark);
getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
@@ -337,6 +350,11 @@ void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
{
case CREATE_LANDMARK:
mCurrentTitle = getString("title_create_landmark");
+
+ mTitleEditor->setEnabled(TRUE);
+ mNotesEditor->setEnabled(TRUE);
+
+ populateFoldersList();
break;
case AGENT:
@@ -351,6 +369,11 @@ void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
case LANDMARK:
mCurrentTitle = getString("title_landmark");
+
+ mTitleEditor->setEnabled(FALSE);
+ mNotesEditor->setEnabled(FALSE);
+
+ populateFoldersList();
break;
case TELEPORT_HISTORY:
@@ -485,10 +508,9 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
parcel_data.sim_name.c_str(), region_x, region_y, region_z);
mRegionName->setText(name);
}
-
+
if (mInfoType == CREATE_LANDMARK)
{
-
if (parcel_data.name.empty())
{
mTitleEditor->setText(name);
@@ -498,7 +520,15 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
mTitleEditor->setText(parcel_data.name);
}
- mNotesEditor->setText(LLStringUtil::null);
+ // FIXME: Creating landmark works only for current agent location.
+ std::string desc;
+ LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
+ mNotesEditor->setText(desc);
+
+ if (!LLLandmarkActions::landmarkAlreadyExists())
+ {
+ createLandmark(mFolderCombo->getValue().asUUID());
+ }
}
}
@@ -694,7 +724,6 @@ void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel,
&rent_price,
&for_sale,
&dwell);
-
if (for_sale)
{
// Adding "For Sale" flag in remote parcel response format.
@@ -803,52 +832,42 @@ void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date)
}
}
-void LLPanelPlaceInfo::onCommitTitleOrNote(LANDMARK_INFO_TYPE type)
+void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled)
{
- LLInventoryItem* item = gInventory.getItem(mLandmarkID);
- if (!item)
- return;
-
- std::string current_value;
- std::string item_value;
- if (type == TITLE)
+ // If switching to edit mode while creating landmark
+ // the "Create Landmark" title remains.
+ if (enabled && mInfoType != CREATE_LANDMARK)
{
- if (mTitleEditor)
- {
- current_value = mTitleEditor->getText();
- item_value = item->getName();
- }
+ mTitle->setText(getString("title_edit_landmark"));
}
else
{
- if (mNotesEditor)
- {
- current_value = mNotesEditor->getText();
- item_value = item->getDescription();
- }
+ mTitle->setText(mCurrentTitle);
}
- LLStringUtil::trim(current_value);
+ mTitleEditor->setEnabled(enabled);
+ mNotesEditor->setReadOnly(!enabled);
+ mFolderCombo->setVisible(enabled);
+ getChild<LLTextBox>("folder_lable")->setVisible(enabled);
- if (!current_value.empty() &&
- item_value != current_value &&
- gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))
- {
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ // HACK: To change the text color in a text editor
+ // when it was enabled/disabled we set the text once again.
+ mNotesEditor->setText(mNotesEditor->getText());
+}
- if (type == TITLE)
- {
- new_item->rename(current_value);
- }
- else
- {
- new_item->setDescription(current_value);
- }
+const std::string& LLPanelPlaceInfo::getLandmarkTitle() const
+{
+ return mTitleEditor->getText();
+}
- new_item->updateServer(FALSE);
- gInventory.updateItem(new_item);
- gInventory.notifyObservers();
- }
+const std::string LLPanelPlaceInfo::getLandmarkNotes() const
+{
+ return mNotesEditor->getText();
+}
+
+const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const
+{
+ return mFolderCombo->getValue().asUUID();
}
void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id)
@@ -921,3 +940,91 @@ void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility)
}
}
}
+
+void LLPanelPlaceInfo::populateFoldersList()
+{
+ // Collect all folders that can contain landmarks.
+ LLInventoryModel::cat_array_t cats;
+ collectLandmarkFolders(cats);
+
+ mFolderCombo->removeall();
+
+ // Put the "Landmarks" folder first in list.
+ LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
+ if (!cat)
+ {
+ llwarns << "Cannot find the landmarks folder" << llendl;
+ }
+ std::string cat_full_name = getFullFolderName(cat);
+ mFolderCombo->add(cat_full_name, cat->getUUID());
+
+ typedef std::vector<folder_pair_t> folder_vec_t;
+ folder_vec_t folders;
+ // Sort the folders by their full name.
+ for (S32 i = 0; i < cats.count(); i++)
+ {
+ cat = cats.get(i);
+ cat_full_name = getFullFolderName(cat);
+ folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
+ }
+ sort(folders.begin(), folders.end(), cmp_folders);
+
+ // Finally, populate the combobox.
+ for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
+ mFolderCombo->add(it->second, LLSD(it->first));
+}
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
+{
+ return left.second < right.second;
+}
+
+static std::string getFullFolderName(const LLViewerInventoryCategory* cat)
+{
+ std::string name = cat->getName();
+ LLUUID parent_id;
+
+ // translate category name, if it's right below the root
+ // FIXME: it can throw notification about non existent string in strings.xml
+ if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+ {
+ LLTrans::findString(name, "InvFolder " + name);
+ }
+
+ // we don't want "My Inventory" to appear in the name
+ while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
+ {
+ cat = gInventory.getCategory(parent_id);
+ name = cat->getName() + "/" + name;
+ }
+
+ return name;
+}
+
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
+{
+ LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+
+ // Add descendent folders of the "Landmarks" category.
+ LLInventoryModel::item_array_t items; // unused
+ LLIsType is_category(LLAssetType::AT_CATEGORY);
+ gInventory.collectDescendentsIf(
+ landmarks_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_category);
+
+ // Add the "My Favorites" category.
+ LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+ LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
+ if (!favorites_cat)
+ {
+ llwarns << "Cannot find the favorites folder" << llendl;
+ }
+ else
+ {
+ cats.put(favorites_cat);
+ }
+}
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 23a845bc20..49aa195490 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -42,6 +42,7 @@
#include "llremoteparcelrequest.h"
class LLButton;
+class LLComboBox;
class LLInventoryItem;
class LLLineEditor;
class LLPanelPick;
@@ -117,18 +118,19 @@ public:
const std::string& first,
const std::string& last);
+ void toggleLandmarkEditMode(BOOL enabled);
+
+ const std::string& getLandmarkTitle() const;
+ const std::string getLandmarkNotes() const;
+ const LLUUID getLandmarkFolder() const;
+
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void handleVisibilityChange (BOOL new_visibility);
private:
- enum LANDMARK_INFO_TYPE
- {
- TITLE,
- NOTE
- };
- void onCommitTitleOrNote(LANDMARK_INFO_TYPE type);
+ void populateFoldersList();
LLUUID mParcelID;
LLUUID mRequestedID;
@@ -182,6 +184,7 @@ private:
LLTextBox* mCreated;
LLLineEditor* mTitleEditor;
LLTextEditor* mNotesEditor;
+ LLComboBox* mFolderCombo;
LLPanel* mScrollingPanel;
LLPanel* mInfoPanel;
LLMediaPanel* mMediaPanel;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 80ecc95afb..35206f54c7 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -40,16 +40,19 @@
#include "lllandmark.h"
#include "llparcel.h"
+#include "llcombobox.h"
+#include "llfiltereditor.h"
#include "llfloaterreg.h"
#include "llnotifications.h"
-#include "llfiltereditor.h"
#include "lltabcontainer.h"
+#include "lltexteditor.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llagent.h"
#include "llavatarpropertiesprocessor.h"
#include "llfloaterworldmap.h"
+#include "llinventorybridge.h"
#include "llinventorymodel.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
@@ -74,9 +77,6 @@ static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history";
// Helper functions
static bool is_agent_in_selected_parcel(LLParcel* parcel);
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
-static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
static void onSLURLBuilt(std::string& slurl);
static void setAllChildrenVisible(LLView* view, BOOL visible);
@@ -125,8 +125,8 @@ LLPanelPlaces::LLPanelPlaces()
mItem(NULL),
mPlaceMenu(NULL),
mLandmarkMenu(NULL),
- mLandmarkFoldersMenuHandle(),
- mPosGlobal()
+ mPosGlobal(),
+ isLandmarkEditModeOn(false)
{
mParcelObserver = new LLPlacesParcelObserver(this);
mInventoryObserver = new LLPlacesInventoryObserver(this);
@@ -146,20 +146,12 @@ LLPanelPlaces::~LLPanelPlaces()
LLViewerParcelMgr::getInstance()->removeObserver(mParcelObserver);
- LLView::deleteViewByHandle(mLandmarkFoldersMenuHandle);
-
delete mInventoryObserver;
delete mParcelObserver;
}
BOOL LLPanelPlaces::postBuild()
{
- mCreateLandmarkBtn = getChild<LLButton>("create_landmark_btn");
- mCreateLandmarkBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onCreateLandmarkButtonClicked, this, LLUUID()));
-
- mFolderMenuBtn = getChild<LLButton>("folder_menu_btn");
- mFolderMenuBtn->setClickedCallback(boost::bind(&LLPanelPlaces::showLandmarkFoldersMenu, this));
-
mTeleportBtn = getChild<LLButton>("teleport_btn");
mTeleportBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onTeleportButtonClicked, this));
@@ -169,6 +161,18 @@ BOOL LLPanelPlaces::postBuild()
mShareBtn = getChild<LLButton>("share_btn");
//mShareBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShareButtonClicked, this));
+ mEditBtn = getChild<LLButton>("edit_btn");
+ mEditBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+
+ mSaveBtn = getChild<LLButton>("save_btn");
+ mSaveBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onSaveButtonClicked, this));
+
+ mCancelBtn = getChild<LLButton>("cancel_btn");
+ mCancelBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onCancelButtonClicked, this));
+
+ mCloseBtn = getChild<LLButton>("close_btn");
+ mCloseBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
+
mOverflowBtn = getChild<LLButton>("overflow_btn");
mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this));
@@ -200,10 +204,18 @@ BOOL LLPanelPlaces::postBuild()
}
mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info");
-
+
LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn");
back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
+ LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor");
+ title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL);
+
+ LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor");
+ notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+
+ LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo");
+ folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
return TRUE;
}
@@ -217,6 +229,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
mPlaceInfoType = key["type"].asString();
mPosGlobal.setZero();
+ mItem = NULL;
togglePlaceInfoPanel(TRUE);
updateVerbs();
@@ -227,11 +240,25 @@ void LLPanelPlaces::onOpen(const LLSD& key)
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+
+ if (key.has("x") && key.has("y") && key.has("z"))
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ }
+ else
+ {
+ mPosGlobal = gAgent.getPositionGlobal();
+ }
+
+ mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
- LLUUID item_uuid = key["id"].asUUID();
- LLInventoryItem* item = gInventory.getItem(item_uuid);
+ mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
+
+ LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
if (!item)
return;
@@ -272,8 +299,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
// Start using LLViewerParcelMgr for land selection if
// information about nearby land is requested.
// Otherwise stop using land selection and deselect land.
- if (mPlaceInfoType == AGENT_INFO_TYPE ||
- mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
+ if (mPlaceInfoType == AGENT_INFO_TYPE)
{
parcel_mgr->addObserver(mParcelObserver);
parcel_mgr->selectParcelAt(gAgent.getPositionGlobal());
@@ -291,7 +317,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
void LLPanelPlaces::setItem(LLInventoryItem* item)
{
- if (!mPlaceInfo)
+ if (!item)
return;
mItem = item;
@@ -304,7 +330,9 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
return;
}
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
+ if (!mPlaceInfo)
+ return;
+
mPlaceInfo->displayItemInfo(mItem);
LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(),
@@ -324,6 +352,12 @@ void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)
landmark->getRegionID(region_id);
landmark->getGlobalPos(mPosGlobal);
mPlaceInfo->displayParcelInfo(region_id, mPosGlobal);
+
+ // Check if item is in agent's inventory and he has the permission to modify it.
+ BOOL is_landmark_editable = mItem.notNull() &&
+ gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.getRootFolderID()) &&
+ mItem->getPermissions().allowModifyBy(gAgent.getID());
+ mEditBtn->setEnabled(is_landmark_editable);
}
void LLPanelPlaces::onFilterEdit(const std::string& search_string)
@@ -436,6 +470,136 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
}
}
+void LLPanelPlaces::onEditButtonClicked()
+{
+ if (!mPlaceInfo || isLandmarkEditModeOn)
+ return;
+
+ isLandmarkEditModeOn = true;
+
+ mPlaceInfo->toggleLandmarkEditMode(TRUE);
+
+ updateVerbs();
+}
+
+void LLPanelPlaces::onSaveButtonClicked()
+{
+ if (!mPlaceInfo || mItem.isNull())
+ return;
+
+ LLAssetType::EType item_type = mItem->getType();
+ if (item_type == LLAssetType::AT_LANDMARK || item_type != LLAssetType::AT_LINK)
+ {
+ // If the item is a link get a linked item
+ if (item_type == LLAssetType::AT_LINK)
+ {
+ mItem = gInventory.getItem(mItem->getAssetUUID());
+ if (mItem.isNull())
+ return;
+ }
+ }
+ else
+ {
+ return;
+ }
+
+ std::string current_title_value = mPlaceInfo->getLandmarkTitle();
+ std::string item_title_value = mItem->getName();
+ std::string current_notes_value = mPlaceInfo->getLandmarkNotes();
+ std::string item_notes_value = mItem->getDescription();
+
+ LLStringUtil::trim(current_title_value);
+ LLStringUtil::trim(current_notes_value);
+
+ bool is_item_update_needed = false;
+
+ if (!current_title_value.empty() &&
+ (item_title_value != current_title_value || item_notes_value != current_notes_value))
+ {
+ is_item_update_needed = true;
+ }
+
+ LLUUID item_id = mItem->getUUID();
+ LLUUID folder_id = mPlaceInfo->getLandmarkFolder();
+
+ // Check if item is in agent's inventory and he has the permission to modify it.
+ if (!gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) ||
+ !mItem->getPermissions().allowModifyBy(gAgent.getID()))
+ return;
+
+ if(folder_id != mItem->getParentUUID() || is_item_update_needed)
+ {
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)mItem.get();
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+
+ LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+
+ // If target is the favorites folder we create link to it.
+ if (favorites_id == folder_id)
+ {
+ if (is_item_update_needed)
+ {
+ new_item->rename(current_title_value);
+ new_item->setDescription(current_notes_value);
+ new_item->updateServer(FALSE);
+
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
+
+ link_inventory_item(gAgent.getID(),
+ item->getUUID(),
+ folder_id,
+ item->getName(),
+ LLAssetType::AT_LINK,
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ else
+ {
+ if (is_item_update_needed)
+ {
+ new_item->rename(current_title_value);
+ new_item->setDescription(current_notes_value);
+ new_item->updateServer(FALSE);
+ }
+
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(folder_id, 1);
+ update.push_back(new_folder);
+ gInventory.accountForUpdate(update);
+
+ new_item->setParent(folder_id);
+ new_item->updateParentOnServer(FALSE);
+
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
+ }
+
+ onCancelButtonClicked();
+}
+
+void LLPanelPlaces::onCancelButtonClicked()
+{
+ if (!mPlaceInfo)
+ return;
+
+ if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
+ {
+ onBackButtonClicked();
+ }
+ else
+ {
+ mPlaceInfo->toggleLandmarkEditMode(FALSE);
+ updateVerbs();
+
+ // Reload the landmark properties.
+ mPlaceInfo->displayItemInfo(mItem);
+ }
+}
+
void LLPanelPlaces::onOverflowButtonClicked()
{
LLToggleableMenu* menu;
@@ -487,7 +651,12 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
std::string item = param.asString();
if (item == "landmark")
{
- onOpen(LLSD().insert("type", CREATE_LANDMARK_INFO_TYPE));
+ LLSD key;
+ key["type"] = CREATE_LANDMARK_INFO_TYPE;
+ key["x"] = mPosGlobal.mdV[VX];
+ key["y"] = mPosGlobal.mdV[VY];
+ key["z"] = mPosGlobal.mdV[VZ];
+ onOpen(key);
}
else if (item == "copy")
{
@@ -523,20 +692,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
}
}
-void LLPanelPlaces::onCreateLandmarkButtonClicked(const LLUUID& folder_id)
-{
- if (!mPlaceInfo)
- return;
-
- // To prevent creating duplicate landmarks
- // disable landmark creating buttons until
- // the information on existing landmarks is reloaded.
- mCreateLandmarkBtn->setEnabled(FALSE);
- mFolderMenuBtn->setEnabled(FALSE);
-
- mPlaceInfo->createLandmark(folder_id);
-}
-
void LLPanelPlaces::onBackButtonClicked()
{
if (!mPlaceInfo)
@@ -697,10 +852,14 @@ void LLPanelPlaces::updateVerbs()
bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE;
bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible();
- mTeleportBtn->setVisible(!is_create_landmark_visible);
- mShareBtn->setVisible(!is_create_landmark_visible);
- mCreateLandmarkBtn->setVisible(is_create_landmark_visible);
- mFolderMenuBtn->setVisible(is_create_landmark_visible);
+ mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mShareBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);
+ mSaveBtn->setVisible(isLandmarkEditModeOn);
+ mCancelBtn->setVisible(isLandmarkEditModeOn);
+ mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible);
@@ -714,15 +873,6 @@ void LLPanelPlaces::updateVerbs()
!mPosGlobal.isExactlyZero() &&
!LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));
}
- else if (is_create_landmark_visible)
- {
- // Enable "Create Landmark" only if there is no landmark
- // for the current parcel and agent is inside it.
- bool enable = !LLLandmarkActions::landmarkAlreadyExists() &&
- is_agent_in_selected_parcel(mParcel->getParcel());
- mCreateLandmarkBtn->setEnabled(enable);
- mFolderMenuBtn->setEnabled(enable);
- }
else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
mTeleportBtn->setEnabled(TRUE);
@@ -735,131 +885,8 @@ void LLPanelPlaces::updateVerbs()
if (mActivePanel)
mActivePanel->updateVerbs();
}
-}
-
-void LLPanelPlaces::showLandmarkFoldersMenu()
-{
- if (mLandmarkFoldersMenuHandle.isDead())
- {
- LLToggleableMenu::Params menu_p;
- menu_p.name("landmarks_folders_menu");
- menu_p.can_tear_off(false);
- menu_p.visible(false);
- menu_p.scrollable(true);
- menu_p.max_scrollable_items = 10;
-
- LLToggleableMenu* menu = LLUICtrlFactory::create<LLToggleableMenu>(menu_p);
-
- mLandmarkFoldersMenuHandle = menu->getHandle();
- }
-
- LLToggleableMenu* menu = (LLToggleableMenu*)mLandmarkFoldersMenuHandle.get();
- if(!menu)
- return;
-
- if (!menu->toggleVisibility())
- return;
-
- // Collect all folders that can contain landmarks.
- LLInventoryModel::cat_array_t cats;
- collectLandmarkFolders(cats);
-
- // Sort the folders by their full name.
- folder_vec_t folders;
- S32 count = cats.count();
- for (S32 i = 0; i < count; i++)
- {
- const LLViewerInventoryCategory* cat = cats.get(i);
- std::string cat_full_name = getFullFolderName(cat);
- folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
- }
- sort(folders.begin(), folders.end(), cmp_folders);
-
- LLRect btn_rect = mFolderMenuBtn->getRect();
-
- LLRect root_rect = getRootView()->getRect();
-
- // Check it there are changed items or viewer dimensions
- // have changed since last call
- if (mLandmarkFoldersCache.size() == count &&
- mRootViewWidth == root_rect.getWidth() &&
- mRootViewHeight == root_rect.getHeight())
- {
- S32 i;
- for (i = 0; i < count; i++)
- {
- if (mLandmarkFoldersCache[i].second != folders[i].second)
- {
- break;
- }
- }
-
- // Check passed, just show the menu
- if (i == count)
- {
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
-
- menu->setButtonRect(btn_rect, this);
- LLMenuGL::showPopup(this, menu, btn_rect.mRight, btn_rect.mTop);
- return;
- }
- }
-
- // If there are changes, store the new viewer dimensions
- // and a list of folders
- mRootViewWidth = root_rect.getWidth();
- mRootViewHeight = root_rect.getHeight();
- mLandmarkFoldersCache = folders;
-
- menu->empty();
-
- // Menu width must not exceed the root view limits,
- // so we assume the space between the left edge of
- // the root view and
- LLRect screen_btn_rect;
- localRectToScreen(btn_rect, &screen_btn_rect);
- S32 free_space = screen_btn_rect.mRight;
- U32 max_width = llmin(LANDMARK_FOLDERS_MENU_WIDTH, free_space);
- for(folder_vec_t::const_iterator it = mLandmarkFoldersCache.begin(); it != mLandmarkFoldersCache.end(); it++)
- {
- const std::string& item_name = it->second;
-
- LLMenuItemCallGL::Params item_params;
- item_params.name(item_name);
- item_params.label(item_name);
-
- item_params.on_click.function(boost::bind(&LLPanelPlaces::onCreateLandmarkButtonClicked, this, it->first));
-
- LLMenuItemCallGL *menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
-
- // *TODO: Use a separate method for menu width calculation.
- // Check whether item name wider than menu
- if (menu_item->getNominalWidth() > max_width)
- {
- S32 chars_total = item_name.length();
- S32 chars_fitted = 1;
- menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
- menu_item->getNominalWidth(); // This returns width of menu item with empty label (pad pixels)
-
- while (chars_fitted < chars_total && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
- {
- chars_fitted++;
- }
- chars_fitted--; // Rolling back one char, that doesn't fit
-
- menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
- }
-
- menu->addChild(menu_item);
- }
-
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
- menu->setButtonRect(btn_rect, this);
- LLMenuGL::showPopup(this, menu, btn_rect.mRight, btn_rect.mTop);
+ isLandmarkEditModeOn = false;
}
static bool is_agent_in_selected_parcel(LLParcel* parcel)
@@ -874,70 +901,6 @@ static bool is_agent_in_selected_parcel(LLParcel* parcel)
parcel->getLocalID() == parcel_mgr->getAgentParcel()->getLocalID();
}
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
-{
- return left.second < right.second;
-}
-
-static std::string getFullFolderName(const LLViewerInventoryCategory* cat)
-{
- std::string name = cat->getName();
- LLUUID parent_id;
-
- // translate category name, if it's right below the root
- // FIXME: it can throw notification about non existent string in strings.xml
- if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
- {
- LLTrans::findString(name, "InvFolder " + name);
- }
-
- // we don't want "My Inventory" to appear in the name
- while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
- {
- cat = gInventory.getCategory(parent_id);
- name = cat->getName() + "/" + name;
- }
-
- return name;
-}
-
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
-{
- // Add the "Landmarks" category itself.
- LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
- LLViewerInventoryCategory* landmarks_cat = gInventory.getCategory(landmarks_id);
- if (!landmarks_cat)
- {
- llwarns << "Cannot find the landmarks folder" << llendl;
- }
- else
- {
- cats.put(landmarks_cat);
- }
-
- // Add descendent folders of the "Landmarks" category.
- LLInventoryModel::item_array_t items; // unused
- LLIsType is_category(LLAssetType::AT_CATEGORY);
- gInventory.collectDescendentsIf(
- landmarks_id,
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- is_category);
-
- // Add the "My Favorites" category.
- LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
- LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
- if (!favorites_cat)
- {
- llwarns << "Cannot find the favorites folder" << llendl;
- }
- else
- {
- cats.put(favorites_cat);
- }
-}
-
static void onSLURLBuilt(std::string& slurl)
{
LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index f208e91237..0b3b3b5fc3 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -72,6 +72,9 @@ private:
//void onShareButtonClicked();
void onTeleportButtonClicked();
void onShowOnMapButtonClicked();
+ void onEditButtonClicked();
+ void onSaveButtonClicked();
+ void onCancelButtonClicked();
void onOverflowButtonClicked();
void onOverflowMenuItemClicked(const LLSD& param);
void onCreateLandmarkButtonClicked(const LLUUID& folder_id);
@@ -84,8 +87,6 @@ private:
void onAgentParcelChange();
void updateVerbs();
- void showLandmarkFoldersMenu();
-
LLFilterEditor* mFilterEditor;
LLPanelPlacesTab* mActivePanel;
LLTabContainer* mTabContainer;
@@ -94,11 +95,13 @@ private:
LLToggleableMenu* mPlaceMenu;
LLToggleableMenu* mLandmarkMenu;
- LLButton* mCreateLandmarkBtn;
- LLButton* mFolderMenuBtn;
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
LLButton* mShareBtn;
+ LLButton* mEditBtn;
+ LLButton* mSaveBtn;
+ LLButton* mCancelBtn;
+ LLButton* mCloseBtn;
LLButton* mOverflowBtn;
LLPlacesInventoryObserver* mInventoryObserver;
@@ -118,19 +121,7 @@ private:
// Information type currently shown in Place Information panel
std::string mPlaceInfoType;
- // Menu handle for pop-up menu to chose a landmark saving
- // folder when creating a new landmark
- LLHandle<LLView> mLandmarkFoldersMenuHandle;
-
- typedef std::vector<folder_pair_t> folder_vec_t;
-
- // List of folders to choose from when creating a landmark
- folder_vec_t mLandmarkFoldersCache;
-
- // If root view width or height is changed
- // the pop-up menu must be updated
- S32 mRootViewWidth;
- S32 mRootViewHeight;
+ bool isLandmarkEditModeOn;
LLSafeHandle<LLParcelSelection> mParcel;
};
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 3bd2645be3..cda7942c1d 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -102,7 +102,7 @@ void LLPanelProfile::onOpen(const LLSD& key)
{
if (key.has("open_tab_name"))
{
- getTabContainer()[PANEL_PICKS]->onClose();
+ getTabContainer()[PANEL_PICKS]->onClosePanel();
// onOpen from selected panel will be called from onTabSelected callback
getTabCtrl()->selectTabByName(key["open_tab_name"]);
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 3bda30e0c6..604faf8eb4 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -68,8 +68,6 @@ void LLPreviewAnim::endAnimCallback( void *userdata )
// virtual
BOOL LLPreviewAnim::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLPreviewAnim::onClose, this));
-
const LLInventoryItem* item = getItem();
if(item)
{
@@ -181,7 +179,8 @@ void LLPreviewAnim::auditionAnim( void *userdata )
}
}
-void LLPreviewAnim::onClose()
+// virtual
+void LLPreviewAnim::onClose(bool app_quitting)
{
const LLInventoryItem *item = getItem();
diff --git a/indra/newview/llpreviewanim.h b/indra/newview/llpreviewanim.h
index d24e624c32..616c5789ac 100644
--- a/indra/newview/llpreviewanim.h
+++ b/indra/newview/llpreviewanim.h
@@ -46,10 +46,10 @@ public:
static void auditionAnim( void* userdata );
static void endAnimCallback( void *userdata );
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_quitting);
void activate(e_activation_type type);
protected:
- void onClose();
LLAnimPauseRequest mPauseRequest;
LLUUID mItemID;
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index faca950963..32ed20bd56 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -32,10 +32,10 @@
#include "llviewerprecompiledheaders.h"
-#include <algorithm>
-
#include "llpreviewgesture.h"
+#include <algorithm>
+
// libraries
#include "lldatapacker.h"
#include "lldarray.h"
@@ -260,7 +260,8 @@ BOOL LLPreviewGesture::canClose()
}
}
-void LLPreviewGesture::onClose()
+// virtual
+void LLPreviewGesture::onClose(bool app_quitting)
{
LLGestureManager::instance().stopGesture(mPreviewGesture);
}
@@ -354,7 +355,6 @@ LLPreviewGesture::~LLPreviewGesture()
BOOL LLPreviewGesture::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLPreviewGesture::onClose, this));
mVisibleSignal.connect(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
LLLineEditor* edit;
diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h
index 16ac935775..9d26539453 100644
--- a/indra/newview/llpreviewgesture.h
+++ b/indra/newview/llpreviewgesture.h
@@ -70,11 +70,10 @@ public:
// LLFloater
/*virtual*/ BOOL canClose();
+ /*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void onUpdateSucceeded();
/*virtual*/ void refresh();
-
-
protected:
// Populate various comboboxes
void addModifiers();
@@ -108,7 +107,6 @@ protected:
// "Sound", "Chat", or "Wait"
LLScrollListItem* addStep(const enum EStepType step_type);
- void onClose();
void onVisibilityChange ( const LLSD& new_visibility );
static std::string getLabel(std::vector<std::string> labels);
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 26ac95060f..296502ff16 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -273,11 +273,14 @@ public:
LLViewerObject* getFirstCopyableObject(BOOL get_parent = FALSE);
LLViewerObject* getFirstDeleteableObject();
LLViewerObject* getFirstMoveableObject(BOOL get_parent = FALSE);
+
+ /// Return the object that lead to this selection, possible a child
LLViewerObject* getPrimaryObject() { return mPrimaryObject; }
// iterate through texture entries
template <typename T> bool getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res);
-
+ template <typename T> bool isMultipleTEValue(LLSelectedTEGetFunctor<T>* func, const T& ignore_value);
+
void addNode(LLSelectNode *nodep);
void addNodeAtEnd(LLSelectNode *nodep);
void moveNodeToFront(LLSelectNode *nodep);
@@ -783,5 +786,52 @@ template <typename T> bool LLObjectSelection::getSelectedTEValue(LLSelectedTEGet
return identical;
}
+// Templates
+//-----------------------------------------------------------------------------
+// isMultipleTEValue iterate through all TEs and test for uniqueness
+// with certain return value ignored when performing the test.
+// e.g. when testing if the selection has a unique non-empty homeurl :
+// you can set ignore_value = "" and it will only compare among the non-empty
+// homeUrls and ignore the empty ones.
+//-----------------------------------------------------------------------------
+template <typename T> bool LLObjectSelection::isMultipleTEValue(LLSelectedTEGetFunctor<T>* func, const T& ignore_value)
+{
+ bool have_first = false;
+ T selected_value = T();
+
+ // Now iterate through all TEs to test for sameness
+ bool unique = TRUE;
+ for (iterator iter = begin(); iter != end(); iter++)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ for (S32 te = 0; te < object->getNumTEs(); ++te)
+ {
+ if (!node->isTESelected(te))
+ {
+ continue;
+ }
+ T value = func->get(object, te);
+ if(value == ignore_value)
+ {
+ continue;
+ }
+ if (!have_first)
+ {
+ have_first = true;
+ }
+ else
+ {
+ if (value !=selected_value )
+ {
+ unique = false;
+ return !unique;
+ }
+ }
+ }
+ }
+ return !unique;
+}
+
#endif
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 2bb1e80eb8..c5a92f52d0 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -522,7 +522,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
contactName->setValue(name);
mCloseBtn = getChild<LLButton>("hide_btn");
- mCloseBtn->setCommitCallback(boost::bind(&LLSysWellWindow::RowPanel::onClose, this));
+ mCloseBtn->setCommitCallback(boost::bind(&LLSysWellWindow::RowPanel::onClosePanel, this));
}
//---------------------------------------------------------------------------------
@@ -531,7 +531,7 @@ LLSysWellWindow::RowPanel::~RowPanel()
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::RowPanel::onClose()
+void LLSysWellWindow::RowPanel::onClosePanel()
{
gIMMgr->removeSession(mChiclet->getSessionId());
// This row panel will be removed from the list in LLSysWellWindow::sessionRemoved().
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 203b949715..0c3f4d0587 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -137,7 +137,7 @@ private:
void onMouseLeave(S32 x, S32 y, MASK mask);
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
private:
- void onClose();
+ void onClosePanel();
public:
LLIMChiclet* mChiclet;
private:
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 9fc91e2971..43f82e592b 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -102,15 +102,16 @@ public:
virtual ~LLFloaterTexturePicker();
// LLView overrides
- virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type, void *cargo_data,
EAcceptance *accept,
std::string& tooltip_msg);
- virtual void draw();
- virtual BOOL handleKeyHere(KEY key, MASK mask);
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
// LLFloater overrides
- virtual BOOL postBuild();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose(bool app_settings);
// New functions
void setImageID( const LLUUID& image_asset_id);
@@ -130,7 +131,6 @@ public:
void commitIfImmediateSet();
void onFilterEdit(const std::string& search_string );
- void onClose();
static void onBtnSetToDefault( void* userdata );
static void onBtnSelect( void* userdata );
@@ -369,7 +369,7 @@ BOOL LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask)
return LLFloater::handleKeyHere(key, mask);
}
-void LLFloaterTexturePicker::onClose()
+void LLFloaterTexturePicker::onClose(bool app_quitting)
{
if (mOwner)
{
@@ -381,8 +381,6 @@ void LLFloaterTexturePicker::onClose()
// virtual
BOOL LLFloaterTexturePicker::postBuild()
{
- mCloseSignal.connect(boost::bind(&LLFloaterTexturePicker::onClose, this));
-
LLFloater::postBuild();
if (!mLabel.empty())
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index d9be6b172c..e4a3f8603b 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -308,7 +308,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
//gFloaterView->adjustToFitScreen(this, FALSE);
if (mLineEditor)
{
- mLineEditor->setFocus(TRUE);
mLineEditor->selectAll();
}
if(mDefaultOption >= 0)
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 5525c359fc..beb16c267e 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -70,6 +70,7 @@
#include "llworld.h"
#include "llui.h"
#include "llweb.h"
+#include "pipeline.h" // setHighlightObject
extern BOOL gDebugClicks;
@@ -391,24 +392,24 @@ ECursorType cursor_from_object(LLViewerObject* object)
case CLICK_ACTION_SIT:
if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // not already sitting?
{
- cursor = UI_CURSOR_TOOLSIT;
+ cursor = UI_CURSOR_HAND;
}
break;
case CLICK_ACTION_BUY:
- cursor = UI_CURSOR_TOOLBUY;
+ cursor = UI_CURSOR_HAND;
break;
case CLICK_ACTION_OPEN:
// Open always opens the parent.
if (parent && parent->allowOpen())
{
- cursor = UI_CURSOR_TOOLOPEN;
+ cursor = UI_CURSOR_HAND;
}
break;
case CLICK_ACTION_PAY:
if ((object && object->flagTakesMoney())
|| (parent && parent->flagTakesMoney()))
{
- cursor = UI_CURSOR_TOOLPAY;
+ cursor = UI_CURSOR_HAND;
}
break;
case CLICK_ACTION_PLAY:
@@ -472,7 +473,9 @@ void LLToolPie::selectionPropertiesReceived()
BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
{
mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
-
+
+ // Show screen-space highlight glow effect
+ bool show_highlight = false;
LLViewerObject *parent = NULL;
LLViewerObject *object = mHoverPick.getObject();
@@ -483,24 +486,28 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
if (object && useClickAction(mask, object, parent))
{
+ show_highlight = true;
ECursorType cursor = cursor_from_object(object);
gViewerWindow->setCursor(cursor);
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
else if (handleMediaHover(mHoverPick))
{
+ show_highlight = true;
// cursor set by media object
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
else if ((object && !object->isAvatar() && object->usePhysics())
|| (parent && !parent->isAvatar() && parent->usePhysics()))
{
+ show_highlight = true;
gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
else if ( (object && object->flagHandleTouch())
|| (parent && parent->flagHandleTouch()))
{
+ show_highlight = true;
gViewerWindow->setCursor(UI_CURSOR_HAND);
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
@@ -519,6 +526,15 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
}
}
+ static LLCachedControl<bool> enable_highlight(
+ gSavedSettings, "RenderHighlightEnable", false);
+ LLDrawable* drawable = NULL;
+ if (enable_highlight && show_highlight && object)
+ {
+ drawable = object->mDrawable;
+ }
+ gPipeline.setHighlightObject(drawable);
+
return TRUE;
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 0b21f3565d..8c46949d70 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -83,7 +83,7 @@
#include "llfloaternamedesc.h"
#include "llfloaternotificationsconsole.h"
#include "llfloateropenobject.h"
-#include "llgivemoney.h"
+#include "llfloaterpay.h"
#include "llfloaterparcel.h"
#include "llfloaterperms.h"
#include "llfloaterpostcard.h"
@@ -195,8 +195,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>);
- LLFloaterReg::add("pay_resident", "floater_pay.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPay>);
- LLFloaterReg::add("pay_object", "floater_pay_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPay>);
+ LLFloaterPayUtil::registerFloater();
LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index d375e7ee4e..60b3af5ca1 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1397,7 +1397,8 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
LLSD args;
args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
- LLNotifications::instance().add("MediaPluginFailed", args);
+ // SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert!
+ //LLNotifications::instance().add("MediaPluginFailed", args);
}
break;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index d95992412f..dde7b1c7ee 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -111,6 +111,7 @@
#include "llfloaterlandholdings.h"
#include "llfloatermap.h"
#include "llfloateropenobject.h"
+#include "llfloaterpay.h"
#include "llfloaterperms.h"
#include "llfloaterpostprocess.h"
#include "llfloaterpreference.h"
@@ -129,7 +130,6 @@
#include "llavataractions.h"
#include "lllandmarkactions.h"
#include "llmemoryview.h"
-#include "llgivemoney.h"
#include "llgroupmgr.h"
#include "lltooltip.h"
#include "llhudeffecttrail.h"
@@ -567,6 +567,15 @@ void init_menus()
gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
gDetachSubMenu = gMenuBarView->findChildMenuByName("Detach Object", TRUE);
+#if !MEM_TRACK_MEM
+ // Don't display the Memory console menu if the feature is turned off
+ LLMenuItemCheckGL *memoryMenu = gMenuBarView->getChild<LLMenuItemCheckGL>("Memory", TRUE);
+ if (memoryMenu)
+ {
+ memoryMenu->setVisible(FALSE);
+ }
+#endif
+
gMenuBarView->createJumpKeys();
// Let land based option enable when parcel changes
@@ -5405,7 +5414,7 @@ class LLAvatarAddContact : public view_listener_t
}
};
-bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle)
+bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle selection)
{
S32 option = LLNotification::getSelectedOption(notification, response);
if (option == 0)
@@ -5413,7 +5422,7 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec
gAgent.clearBusy();
}
- LLViewerObject* objectp = handle->getPrimaryObject();
+ LLViewerObject* objectp = selection->getPrimaryObject();
// Show avatar's name if paying attachment
if (objectp && objectp->isAttachment())
@@ -5428,14 +5437,14 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec
{
if (objectp->isAvatar())
{
- const BOOL is_group = FALSE;
- LLFloaterPay::payDirectly(&give_money,
+ const bool is_group = false;
+ LLFloaterPayUtil::payDirectly(&give_money,
objectp->getID(),
is_group);
}
else
{
- LLFloaterPay::payViaObject(&give_money, objectp->getID());
+ LLFloaterPayUtil::payViaObject(&give_money, selection);
}
}
return false;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 2e8580907e..aa662b713e 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -98,6 +98,7 @@
#include "llnotifications.h"
#include "llnotify.h"
#include "llpanelgrouplandmoney.h"
+#include "llpanelplaces.h"
#include "llrecentpeople.h"
#include "llselectmgr.h"
#include "llsidetray.h"
@@ -138,7 +139,6 @@
#include "llkeythrottle.h"
#include "llgroupactions.h"
#include "llagentui.h"
-#include "llsidetray.h"
#include "llpanelblockedlist.h"
#include "llpanelplaceinfo.h"
@@ -907,14 +907,15 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
LLSD args;
args["LANDMARK_NAME"] = item->getName();
- args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unnkown");
+ args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
LLNotifications::instance().add("LandmarkCreated", args);
-
- // Open new landmark for editing in Places panel.
- LLSD key;
- key["type"] = "landmark";
- key["id"] = item->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+
+ // Created landmark is passed to Places panel to allow its editing.
+ LLPanelPlaces *panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD()));
+ if (panel)
+ {
+ panel->setItem(item);
+ }
}
break;
case LLAssetType::AT_TEXTURE:
diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.cur
deleted file mode 100644
index c61cd76bef..0000000000
--- a/indra/newview/res/toolbuy.cur
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur
deleted file mode 100644
index 8408f7c7eb..0000000000
--- a/indra/newview/res/toolopen.cur
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur
deleted file mode 100644
index 60b0e773e5..0000000000
--- a/indra/newview/res/toolsit.cur
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index bdf7631770..4ac48c1857 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -123,10 +123,6 @@ TOOLPICKOBJECT3 CURSOR "toolpickobject3.cur"
ARROWCOPY CURSOR "arrowcop.cur"
ARROWDRAGMULTI CURSOR "llarrowdragmulti.cur"
ARROWCOPYMULTI CURSOR "arrowcopmulti.cur"
-TOOLSIT CURSOR "toolsit.cur"
-TOOLBUY CURSOR "toolbuy.cur"
-TOOLPAY CURSOR "toolpay.cur"
-TOOLOPEN CURSOR "toolopen.cur"
TOOLPIPETTE CURSOR "toolpipette.cur"
TOOLPLAY CURSOR "toolplay.cur"
TOOLPAUSE CURSOR "toolpause.cur"
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f106796cd9..2c09689ec6 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -384,12 +384,12 @@
<texture name="TaskPanel_BG" file_name="taskpanel/TaskPanel_BG.png" preload="false" scale.left="4" scale.top="146" scale.right="146" scale.bottom="4" />
<texture name="TaskPanel_Tab_Unselected" file_name="taskpanel/TaskPanel_Tab_Over.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
- <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="4" scale.top="18" scale.right="252" scale.bottom="4" />
- <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="4" scale.top="18" scale.right="252" scale.bottom="4" />
- <texture name="TextField_Search_Active" file_name="widgets/TextField_Search_Active.png" preload="true" scale.left="4" scale.top="18" scale.right="252" scale.bottom="4" />
- <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="4" scale.top="18" scale.right="252" scale.bottom="4" />
- <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="4" scale.top="18" scale.right="252" scale.bottom="4" />
- <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="4" scale.top="18" scale.right="252" scale.bottom="4" />
+ <texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Active" file_name="widgets/TextField_Search_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
<texture name="Toast" file_name="windows/Toast.png" preload="true" />
@@ -513,11 +513,6 @@
<texture name="toggle_button_off" file_name="toggle_button_off.png" preload="true" />
<texture name="toggle_button_selected" file_name="toggle_button_selected.png" preload="true" />
-<!--TODO: REPLACE CODE REFERENCE TO THIS ART WITH Icon_Minimize_Background above -->
- <texture name="minimize_inactive.tga" preload="true" />
- <texture name="minimize.tga" preload="true" />
- <texture name="minimize_pressed.tga" preload="true" />
-
<texture name="sm_rounded_corners_simple.tga" scale.left="4" scale.top="4" scale.bottom="4" scale.right="4" />
<texture name="rounded_square.tga" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml
index 0eb090d2e4..c52f7ab832 100644
--- a/indra/newview/skins/default/xui/da/floater_camera.xml
+++ b/indra/newview/skins/default/xui/da/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="move floater" title="">
- <string name="rotate_tooltip">
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
Roter kamera omkring fokus
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Zoom kamera mod fokus
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
Flyt kamera op og ned, til venstre og højre
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, til venstre og højre"/>
+ <joystick_zoom name="zoom" tool_tip="Zoom kamera mod fokus"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_color_picker.xml b/indra/newview/skins/default/xui/da/floater_color_picker.xml
index e6cc5774ed..c8e1fc813b 100644
--- a/indra/newview/skins/default/xui/da/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/da/floater_color_picker.xml
@@ -26,6 +26,6 @@
Nuværende Farve:
</text>
<text name="(Drag below to save.)">
- (Træk ned og gem.)
+ (Træk ned og gem)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml
index 198b5b07f2..f44db713d8 100644
--- a/indra/newview/skins/default/xui/de/floater_camera.xml
+++ b/indra/newview/skins/default/xui/de/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="move floater">
- <string name="rotate_tooltip">
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
Kamera um Fokus drehen
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Kamera auf Fokus zoomen
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
Kamera nach oben, unten, links und rechts bewegen
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
+ <joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml
index f53a1135dc..fa2f616249 100644
--- a/indra/newview/skins/default/xui/de/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml
@@ -27,6 +27,6 @@
</text>
<text name="(Drag below to save.)">
(Nach unten ziehen,
- um zu speichern.)
+ um zu speichern)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index f76e4acbc9..e1f8011cbe 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -84,38 +84,7 @@
top="52"
width="132" />
</panel>
- <panel
- border="true"
- height="150"
- label="Calling Cards"
- layout="topleft"
- left_delta="-1"
- name="CallingCardsPanel"
- top_delta="134"
- width="135">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="InstructSelectCallingCard"
- top="8"
- width="220">
- Select a calling card:
- </text>
- <inventory_panel
- allow_multi_select="false"
- border="true"
- follows="left|top|right|bottom"
- height="110"
- layout="topleft"
- left_delta="0"
- name="InventoryPanel"
- top_pad="7"
- width="115" />
- </panel>
+
<panel
border="none"
height="150"
diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
index 5a29c6a319..8ed2047a27 100644
--- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
@@ -316,13 +316,16 @@
height="40"
follows="top|left|bottom"
layout="topleft"
- name="test_text_editor"
+ name="test_text_box"
tool_tip="text box"
top_pad="5"
width="200">
Text box
with
multiple lines
+and too
+many
+line to actually fit
</text>
<!-- And a third column -->
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 053215f8ae..c65206d629 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2688,7 +2688,7 @@
height="18"
layout="topleft"
left="20"
- max_length="63"
+ read_only="true"
name="media_info"
select_on_focus="true"
top_delta="12"
diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
index 0eb2c5e1be..4f501b65f3 100644
--- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- can_minimize="false"
- height="108"
- layout="topleft"
- name="whitelist_entry"
- width="390">
-
- <text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft"
- left="10" name="media_label" top="20">
- Enter a URL or URL pattern to add to the list of allowed domains
- </text>
-
- <line_editor bottom_delta="40" enabled="true" follows="left|top" font="SansSerif"
- height="20" left="10" name="whitelist_entry"
- tool_tip="Enter a URL or URL pattern to White List"
- width="350" />
-
- <button follows="top|left" height="20" font="SansSerifSmall" label="OK"
- layout="topleft" left="10" name="ok_btn" bottom_delta="28" width="64" />
-
- <button follows="top|left" height="20" font="SansSerifSmall" label="Cancel"
- layout="topleft" left_pad="5" name="cancel_btn" bottom_delta="0" width="64" />
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_minimize="false"
+ height="108"
+ layout="topleft"
+ name="whitelist_entry"
+ width="390">
+
+ <text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft"
+ left="10" name="media_label" top="20">
+ Enter a URL or URL pattern to add to the list of allowed domains
+ </text>
+
+ <line_editor bottom_delta="40" enabled="true" follows="left|top" font="SansSerif"
+ height="20" left="10" name="whitelist_entry"
+ tool_tip="Enter a URL or URL pattern to White List"
+ width="350" />
+
+ <button follows="top|left" height="20" font="SansSerifSmall" label="OK"
+ layout="topleft" left="10" name="ok_btn" bottom_delta="28" width="64" />
+
+ <button follows="top|left" height="20" font="SansSerifSmall" label="Cancel"
+ layout="topleft" left_pad="5" name="cancel_btn" bottom_delta="0" width="64" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index b44acebbcf..1af07c35be 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -5,16 +5,16 @@
-->
<floater
bevel_style="in"
- bg_alpha_color="PanelDefaultBackgroundColor"
+ bg_opaque_color="MouseGray"
can_close="false"
can_minimize="false"
- height="190"
+ height="138"
layout="topleft"
name="inspect_avatar"
single_instance="true"
sound_flags="0"
visible="true"
- width="300">
+ width="245">
<!-- Allowed fields include:
[BORN_ON] ("12/3/2008")
[SL_PROFILE] (Second Life profile),
@@ -36,107 +36,116 @@
Partner: [PARTNER]
</string>
<text
- follows="left|top|right|bottom"
- font="SansSerifHugeBold"
- height="70"
- left="10"
+ follows="all"
+ font="SansSerifLargeBold"
+ height="18"
+ left="8"
name="user_name"
+ top="5"
text_color="white"
- top="20"
use_ellipses="true"
- value="Test Name"
- width="280"
- word_wrap="true" />
- <text
- follows="left|top|right|bottom"
- font="SansSerifBig"
- height="20"
- left="10"
- name="user_subtitle"
- text_color="white"
- top="45"
- width="150" />
+ value="Grumpity ProductEngine"
+ width="240"
+ word_wrap="false" />
<!-- Leave text fields blank so it doesn't flash when data arrives off the network -->
<text
- follows="left|top|right|bottom"
- height="20"
- left="10"
+ follows="all"
+ height="16"
+ left="8"
+ value="Grumpity ProductEngine moose moose"
name="user_details"
- text_color="white"
- top="85"
- width="290"
- word_wrap="true" />
+ top_pad="0"
+ width="170"
+ use_ellipses="true"
+ word_wrap="false" />
<text
- follows="left|top|right|bottom"
- height="20"
- left="10"
+ follows="all"
+ font="SansSerifSmallBold"
+ text_color="White"
+ height="18"
+ left="8"
+ name="user_subtitle"
+ use_ellipses="true"
+ top_pad="0"
+ width="170" />
+ <text
+ follows="all"
+ height="16"
+ left="8"
name="user_partner"
- text_color="white"
- top="105"
- width="290"
- word_wrap="true" />
- <avatar_icon
- follows="left|top|right|bottom"
- height="60"
- left="230"
- mouse_opaque="true"
- name="avatar_icon"
- top="15"
- width="60" />
+ top_pad="8"
+ width="240"
+ use_ellipses="true"
+ word_wrap="false" />
<slider
follows="top|left"
- height="30"
+ height="23"
increment="0.05"
- left="20"
+ left="1"
max_val="0.95"
min_val="0.05"
name="volume_slider"
show_text="false"
tool_tip="Voice Volume"
- top="125"
+ top_pad="0"
value="0.5"
- width="240" />
+ width="150" />
<button
- follows="left|top|right|bottom"
+ follows="all"
height="16"
- image_disabled="icn_speaker_dark.tga"
- image_disabled_selected="icn_speaker-muted_dark.tga"
- image_hover_selected="icn_speaker-muted_dark.tga"
- image_selected="icn_speaker-muted_dark.tga"
- image_unselected="icn_speaker_dark.tga"
+ image_disabled="Inv_Sound"
+ image_disabled_selected="Inv_Sound"
+ image_hover_selected="Inv_Sound"
+ image_selected="Inv_Sound"
+ image_unselected="Inv_Sound"
is_toggle="true"
- left="265"
+ left_pad="0"
+ top_delta="4"
name="mute_btn"
picture_style="true"
- top="132"
- width="32" />
+ width="16" />
+ <avatar_icon
+ follows="all"
+ height="38"
+ right="-25"
+ bevel_style="in"
+ border_style="line"
+ mouse_opaque="true"
+ name="avatar_icon"
+ top="24"
+ width="38" />
<button
follows="top|left"
- font="SansSerif"
- height="20"
+ height="18"
+ image_disabled="ForwardArrow_Disabled"
+ image_selected="ForwardArrow_Press"
+ image_unselected="ForwardArrow_Off"
+ layout="topleft"
+ name="view_profile_btn"
+ picture_style="true"
+ right="-8"
+ top="35"
+ left_delta="110"
+ tab_stop="false"
+ width="18" />
+ <button
+ follows="bottom|left"
+ height="23"
label="Add Friend"
- left="10"
+ left="8"
+ top="246"
name="add_friend_btn"
- top_pad="10"
- width="105" />
- <button
- follows="top|left"
- font="SansSerif"
- height="20"
- label="View Profile"
- left_delta="110"
- name="view_profile_btn"
- top_delta="0"
- width="105" />
+ width="100" />
<menu_button
follows="top|left"
- height="20"
- image_overlay="windows\Icon_Gear_Foreground.png"
- image_overlay_alignment="center"
+ height="18"
+ image_disabled="OptionsMenu_Disabled"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
menu_filename="menu_inspect_avatar_gear.xml"
name="gear_btn"
picture_style="true"
- top_delta="0"
- left_delta="110"
- width="60"/>
+ right="-10"
+ top="249"
+ width="18" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index cc56f630b0..97df28aa30 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -17,8 +17,8 @@
width="300">
<string name="Creator">By [CREATOR]</string>
<string name="CreatorAndOwner">
-By [CREATOR]
-Owned by [OWNER]
+by [CREATOR]
+owner [OWNER]
</string>
<!-- *TODO: Might need to change to [AMOUNT] if icon contains "L$" -->
<string name="Price">L$[AMOUNT]</string>
@@ -28,57 +28,59 @@ Owned by [OWNER]
<text
follows="all"
font="SansSerifLargeBold"
- height="20"
+ height="16"
left="8"
name="object_name"
- text_color="white"
- top="8"
+ text_color="White"
+ top="5"
use_ellipses="true"
value="Test Object Name That Is Really Long"
- width="268" />
+ width="291" />
<text
follows="all"
font="SansSerif"
height="30"
- left="10"
+ left="8"
name="object_creator"
top_pad="0"
- width="280">
-By Longavatarname Johnsonlongstonnammer
-Owned by James Linden
- </text>
- <text
- follows="all"
- height="45"
- left="100"
- name="object_description"
- top_pad="4"
- width="200"
- word_wrap="true">
-This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
+ use_ellipses="true"
+ width="275">
+by Longavatarname Johnsonlongstonnammer
+owner James Linden
</text>
<!-- *TODO: Replace this icon -->
<icon
name="price_icon"
- image_name="Favorite_Star_Active"
- left="5"
+ image_name="Icon_For_Sale"
+ left="7"
width="16"
height="16"
- top="79"
+ top="52"
follows="left|top"
/>
<text
follows="all"
font="SansSerifSmallBold"
- height="45"
- left="22"
+ height="16"
+ left_pad="5"
name="price_text"
text_color="white"
- top="80"
+ top="54"
font_shadow="none"
- width="80">
+ width="150">
L$300,000
</text>
+ <text
+ follows="all"
+ height="30"
+ left="8"
+ name="object_description"
+ top_pad="0"
+ width="291"
+ use_ellipses="true"
+ word_wrap="true">
+This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
+ </text>
<!-- Overlapping buttons for all default actions. Show "Buy" if
for sale, "Sit" if can sit, etc. -->
<button
@@ -88,7 +90,7 @@ L$300,000
label="Buy"
left="10"
name="buy_btn"
- top="116"
+ top="114"
width="100" />
<button
follows="top|left"
@@ -136,27 +138,30 @@ L$300,000
top_delta="0"
width="100" />
<!-- non-overlapping buttons here -->
- <menu_button
+ <menu_button
follows="top|left"
- height="23"
- image_overlay="Icon_Gear_Foreground"
- image_overlay_alignment="center"
- right="-8"
- menu_filename="menu_inspect_object_gear.xml"
+ height="18"
+ image_disabled="OptionsMenu_Disabled"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
+ menu_filename="menu_inspect_avatar_gear.xml"
name="gear_btn"
picture_style="true"
- top_delta="0"
- width="30" />
- <button
+ right="-10"
+ top_delta="5"
+ width="18" />
+ <button
follows="top|left"
- height="22"
- image_overlay="TabIcon_Close_Off"
+ height="18"
+ image_disabled="ForwardArrow_Disabled"
+ image_selected="ForwardArrow_Press"
+ image_unselected="ForwardArrow_Off"
layout="topleft"
name="more_info_btn"
picture_style="true"
- right="-8"
- top="7"
+ right="-5"
+ top="20"
left_delta="110"
tab_stop="false"
- width="20" />
+ width="18" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml
index 71418d446a..c523185034 100644
--- a/indra/newview/skins/default/xui/en/language_settings.xml
+++ b/indra/newview/skins/default/xui/en/language_settings.xml
@@ -6,7 +6,13 @@
<string name="MicrosoftLocale">english</string>
<string name="DarwinLocale">C</string>
<string name="LinuxLocale">C</string>
-
+
+ <!-- Note: for plural nouns, see strings.xml. For example:
+ AgeYearsA = singular,
+ AgeYearsB = plural,
+ AgeYearsC = plural for non-English languages like Russian
+ For example, LLTrans::getCountString("AgeYears", 3) is plural form B
+ in English and form C in Russian -->
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
datetimeToCodes["weekday"] = "%A"; // Thursday
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 2c77f61da6..b0839ce255 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -361,18 +361,6 @@
</menu_item_call>
</menu>
<menu_item_check
- label="Search"
- layout="topleft"
- name="Search"
- shortcut="control|F">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="search" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="search" />
- </menu_item_check>
- <menu_item_check
label="World Map"
layout="topleft"
name="World Map"
@@ -1072,6 +1060,18 @@
name="Shortcuts"
tear_off="true"
visible="false">
+ <menu_item_check
+ label="Search"
+ layout="topleft"
+ name="Search"
+ shortcut="control|F">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="search" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="search" />
+ </menu_item_check>
<menu_item_call
enabled="false"
label="Release Keys"
@@ -2503,7 +2503,6 @@
tear_off="true">
<menu_item_check
label="Axes"
- layout="topleft"
name="Axes">
<menu_item_check.on_check
function="CheckControl"
@@ -2514,7 +2513,6 @@
</menu_item_check>
<menu_item_check
label="Tangent Basis"
- layout="topleft"
name="Tangent Basis">
<menu_item_check.on_check
function="CheckControl"
@@ -2525,7 +2523,6 @@
</menu_item_check>
<menu_item_call
label="Selected Texture Info Basis"
- layout="topleft"
name="Selected Texture Info Basis"
shortcut="control|alt|shift|T">
<menu_item_call.on_click
@@ -2533,7 +2530,6 @@
</menu_item_call>
<menu_item_check
label="Wireframe"
- layout="topleft"
name="Wireframe"
shortcut="control|shift|R">
<menu_item_check.on_check
@@ -2544,7 +2540,6 @@
</menu_item_check>
<menu_item_check
label="Object-Object Occlusion"
- layout="topleft"
name="Object-Object Occlusion"
shortcut="control|shift|O">
<menu_item_check.on_check
@@ -2558,7 +2553,6 @@
</menu_item_check>
<menu_item_check
label="Framebuffer Objects"
- layout="topleft"
name="Framebuffer Objects">
<menu_item_check.on_check
function="CheckControl"
@@ -2571,7 +2565,6 @@
</menu_item_check>
<menu_item_check
label="Deferred Rendering"
- layout="topleft"
name="Deferred Rendering">
<menu_item_check.on_check
function="CheckControl"
@@ -2584,7 +2577,6 @@
</menu_item_check>
<menu_item_check
label="Global Illumintation"
- layout="topleft"
name="Global Illumination">
<menu_item_check.on_check
function="CheckControl"
@@ -2595,10 +2587,11 @@
<menu_item_check.on_enable
function="Advanced.EnableRenderDeferredGI" />
</menu_item_check>
-
+
+ <menu_item_separator />
+
<menu_item_check
label="Debug GL"
- layout="topleft"
name="Debug GL">
<menu_item_check.on_check
function="CheckControl"
@@ -2609,7 +2602,6 @@
</menu_item_check>
<menu_item_check
label="Debug Pipeline"
- layout="topleft"
name="Debug Pipeline">
<menu_item_check.on_check
function="CheckControl"
@@ -2620,7 +2612,6 @@
</menu_item_check>
<menu_item_check
label="Fast Alpha"
- layout="topleft"
name="Fast Alpha">
<menu_item_check.on_check
function="CheckControl"
@@ -2631,7 +2622,6 @@
</menu_item_check>
<menu_item_check
label="Animation Textures"
- layout="topleft"
name="Animation Textures">
<menu_item_check.on_check
function="CheckControl"
@@ -2642,7 +2632,6 @@
</menu_item_check>
<menu_item_check
label="Disable Textures"
- layout="topleft"
name="Disable Textures">
<menu_item_check.on_check
function="Advanced.CheckDisableTextures"
@@ -2652,7 +2641,6 @@
</menu_item_check>
<menu_item_check
label="Texture Atlas"
- layout="topleft"
name="Texture Atlas">
<menu_item_check.on_check
function="Advanced.CheckTextureAtlas"
@@ -2662,7 +2650,6 @@
</menu_item_check>
<menu_item_check
label="Render Attached Lights"
- layout="topleft"
name="Render Attached Lights">
<menu_item_check.on_check
function="CheckControl"
@@ -2673,7 +2660,6 @@
</menu_item_check>
<menu_item_check
label="Render Attached Particles"
- layout="topleft"
name="Render Attached Particles">
<menu_item_check.on_check
function="CheckControl"
@@ -2682,6 +2668,16 @@
function="Advanced.HandleAttchedLightParticles"
parameter="RenderAttachedParticles" />
</menu_item_check>
+ <menu_item_check
+ label="Hover Highlight Objects"
+ name="Hover Highlight Objects">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="RenderHighlightEnable" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="RenderHighlightEnable" />
+ </menu_item_check>
</menu>
<menu
create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 829c2e02d8..f141a909a8 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -761,7 +761,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
name="url"
openexternally = "1">
- http://join/secondlife.com/
+ http://join.secondlife.com/
</url>
<usetemplate
name="okcancelbuttons"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index 5d9baf4019..f1e2560356 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -64,7 +64,7 @@
<web_browser
border_visible="false"
- bottom_delta="-120"
+ bottom_delta="-133"
follows="top|left"
left="120"
name="preview_media"
@@ -83,7 +83,7 @@
</text>
<text
- bottom_delta="-20"
+ bottom_delta="-5"
follows="top|left"
height="15"
left="10"
@@ -161,32 +161,85 @@
radio_style="false"
width="150" />
- <check_box bottom_delta="-25" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Use Default Alternative Image" left="10" mouse_opaque="true"
- name="alt_image_enable" radio_style="false" width="150" />
+ <check_box
+ bottom_delta="-25"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Use Default Alternative Image"
+ left="10"
+ mouse_opaque="true"
+ name="alt_image_enable"
+ radio_style="false"
+ width="150" />
- <check_box bottom_delta="-25" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Auto Play Media" left="10" mouse_opaque="true"
- name="auto_play" radio_style="false" width="150" />
- <text bottom_delta="-14" follows="top|left" height="15" left="30" width="340"
- enabled="false" name="">
+ <check_box
+ bottom_delta="-25"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Auto Play Media"
+ left="10"
+ mouse_opaque="true"
+ name="auto_play"
+ radio_style="false"
+ width="150" />
+
+ <text
+ bottom_delta="-14"
+ follows="top|left"
+ height="15"
+ left="30"
+ width="340"
+ enabled="false"
+ name="meida_setting_note">
Note: Residents can override this setting
</text>
- <check_box bottom_delta="-25" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Auto Scale Media on Face of Object" left="10" mouse_opaque="true"
- name="auto_scale" radio_style="false" width="150" />
- <text bottom_delta="-20" follows="top|left" height="15" left="30" name="">
+ <check_box
+ bottom_delta="-25"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Auto Scale Media on Face of Object"
+ left="10"
+ mouse_opaque="true"
+ name="auto_scale"
+ radio_style="false"
+ width="150" />
+
+ <text
+ bottom_delta="-20"
+ follows="top|left"
+ height="15"
+ left="30"
+ name="">
Size:
</text>
- <spinner bottom_delta="0"
- decimal_digits="0" enabled="true" follows="left|top" height="16"
- increment="1" initial_val="256" label="" label_width="0"
- left_delta="40" max_val="2048" min_val="0" mouse_opaque="true"
- name="width_pixels" width="50" />
+
+ <spinner
+ bottom_delta="0"
+ decimal_digits="0"
+ enabled="true"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_val="256"
+ label=""
+ label_width="0"
+ left_delta="40"
+ max_val="2048"
+ min_val="0"
+ mouse_opaque="true"
+ name="width_pixels"
+ width="50" />
+
<text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="">
X
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
index f11364874a..0cc1406d62 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
@@ -1,49 +1,137 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel border="true" enabled="true" follows="left|top|right|bottom"
- height="500" label="Controls" left="102" mouse_opaque="true"
- name="Media settings for controls" width="365">
+<panel
+ border="true"
+ enabled="true"
+ follows="left|top|right|bottom"
+ height="500"
+ label="Controls"
+ left="102"
+ mouse_opaque="true"
+ name="Media settings for controls"
+ width="365">
- <text bottom_delta="-50" follows="top|left" height="15" left="10" name="" enabled="false">
+ <text
+ bottom_delta="-50"
+ follows="top|left"
+ height="15"
+ left="10"
+ name="media_perms_label_owner"
+ enabled="false">
Owner
</text>
- <check_box bottom_delta="-22" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Disable Navigation &amp; Interactivity" left="30" mouse_opaque="true"
- name="perms_owner_interact" radio_style="false" width="250" />
+
+ <check_box
+ bottom_delta="-22"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Disable Navigation &amp; Interactivity"
+ left="30"
+ mouse_opaque="true"
+ name="perms_owner_interact"
+ radio_style="false"
+ width="250" />
- <check_box bottom_delta="-22" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Hide Control Bar" left="30" mouse_opaque="true"
- name="perms_owner_control" radio_style="false" width="250" />
+ <check_box
+ bottom_delta="-22"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Hide Control Bar"
+ left="30"
+ mouse_opaque="true"
+ name="perms_owner_control"
+ radio_style="false"
+ width="250" />
- <text bottom_delta="-36" follows="top|left" height="15" left="10" name="perms_group_name_label" enabled="false">
+ <text
+ bottom_delta="-36"
+ follows="top|left"
+ height="15"
+ left="10"
+ name="media_perms_label_group"
+ enabled="false">
Group
</text>
- <name_box bottom_delta="-5" enabled="false" follows="left|top" font="SansSerif"
- height="20" left="60" name="perms_group_name"
- value =""
- width="200" />
- <check_box bottom_delta="-22" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Disable Navigation &amp; Interactivity" left="30" mouse_opaque="true"
- name="perms_group_interact" radio_style="false" width="250" />
+
+ <name_box
+ bottom_delta="-5"
+ enabled="false"
+ follows="left|top"
+ font="SansSerif"
+ height="20" left="60"
+ name="perms_group_name"
+ value =""
+ width="200" />
+
+ <check_box
+ bottom_delta="-22"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Disable Navigation &amp; Interactivity"
+ left="30"
+ mouse_opaque="true"
+ name="perms_group_interact"
+ radio_style="false"
+ width="250" />
- <check_box bottom_delta="-22" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Hide Control Bar" left="30" mouse_opaque="true"
- name="perms_group_control" radio_style="false" width="250" />
+ <check_box
+ bottom_delta="-22"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Hide Control Bar"
+ left="30"
+ mouse_opaque="true"
+ name="perms_group_control"
+ radio_style="false"
+ width="250" />
- <text bottom_delta="-36" follows="top|left" height="15" left="10" name="" enabled="false">
+ <text
+ bottom_delta="-36"
+ follows="top|left"
+ height="15"
+ left="10"
+ name="media_perms_label_anyone"
+ enabled="false">
Anyone
</text>
- <check_box bottom_delta="-22" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Disable Navigation &amp; Interactivity" left="30" mouse_opaque="true"
- name="perms_anyone_interact" radio_style="false" width="250" />
+
+ <check_box
+ bottom_delta="-22"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Disable Navigation &amp; Interactivity"
+ left="30"
+ mouse_opaque="true"
+ name="perms_anyone_interact"
+ radio_style="false"
+ width="250" />
- <check_box bottom_delta="-22" enabled="true" follows="left|top" font="SansSerifSmall"
- height="16" initial_value="false"
- label="Hide Control Bar" left="30" mouse_opaque="true"
- name="perms_anyone_control" radio_style="false" width="250" />
+ <check_box
+ bottom_delta="-22"
+ enabled="true"
+ follows="left|top"
+ font="SansSerifSmall"
+ height="16"
+ initial_value="false"
+ label="Hide Control Bar"
+ left="30"
+ mouse_opaque="true"
+ name="perms_anyone_control"
+ radio_style="false"
+ width="250" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 8b9fe2cf77..696e0b3c33 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -60,7 +60,7 @@
left="5"
name="teleport_btn"
top="0"
- width="90" />
+ width="70" />
<button
follows="bottom|left"
font="SansSerifSmallBold"
@@ -70,7 +70,7 @@
left_pad="5"
name="map_btn"
top="0"
- width="80" />
+ width="50" />
<button
enabled="false"
follows="bottom|left"
@@ -83,40 +83,54 @@
top="0"
width="60" />
<button
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Edit"
+ layout="topleft"
+ left_pad="5"
+ name="edit_btn"
+ top="0"
+ width="50" />
+ <button
follows="bottom|right"
font="SansSerifSmallBold"
height="25"
label="▼"
layout="topleft"
- left_pad="5"
name="overflow_btn"
+ right="-10"
top="0"
width="30" />
<button
- follows="bottom|left"
+ follows="bottom|right"
font="SansSerifSmallBold"
height="25"
- image_disabled="widgets/SegmentedBtn_Left_Disabled.png"
- image_selected="widgets/SegmentedBtn_Left_Selected.png"
- image_unselected="widgets/SegmentedBtn_Left_Off.png"
- label="Create"
+ label="Close"
layout="topleft"
- left="5"
- name="create_landmark_btn"
+ name="close_btn"
+ right="-10"
top="0"
- width="70" />
+ width="60" />
<button
- follows="bottom|left"
+ follows="bottom|right"
font="SansSerifSmallBold"
height="25"
- image_disabled="widgets/ComboButton_Disabled.png"
- image_selected="widgets/ComboButton_Selected.png"
- image_unselected="widgets/ComboButton_Off.png"
- label="▼"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-10"
+ top="0"
+ width="60" />
+ <button
+ follows="bottom|right"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Save"
layout="topleft"
- left_pad="0"
- name="folder_menu_btn"
+ name="save_btn"
+ right="-75"
top="0"
- width="20" />
+ width="60" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index b4212aaa34..9cf699ad46 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -43,7 +43,7 @@
layout="topleft"
top="0"
left="0"
- width="284"
+ width="300"
height="700">
<panel
follows="left|top"
@@ -52,7 +52,7 @@
left="10"
name="second_life_image_panel"
top="10"
- width="280">
+ width="285">
<texture_picker
allow_no_texture="true"
default_image_name="None"
@@ -94,7 +94,7 @@
top_pad="10"
left="10"
name="first_life_image_panel"
- width="280">
+ width="285">
<texture_picker
allow_no_texture="true"
default_image_name="None"
@@ -122,7 +122,7 @@
height="90"
layout="topleft"
name="fl_description_edit"
- width="180"
+ width="170"
expanded_bg_visible="true"
expanded_bg_color="black">
Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
index 3b1b049ff2..9845a9eb78 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml
@@ -4,7 +4,7 @@
bottom="0"
follows="left|top|right"
height="30"
- width="305"
+ width="333"
layout="topleft"
left="0"
name="sidetray_tab_panel">
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 3a5347fe12..d124a4cdfa 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -44,23 +44,12 @@
<!-- Tooltip, lltooltipview.cpp -->
- <!-- *TODO: Most of these are now unused, eliminate them -->
<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
<string name="TooltipOwner">Owner:</string> <!-- Owner name follows -->
<string name="TooltipPublic">Public</string> <!-- Public permissions on an object -->
<string name="TooltipIsGroup">(Group)</string> <!-- The name before this text is that of a group -->
- <string name="TooltipFlagScript">Script</string>
- <string name="TooltipFlagPhysics">Physics</string>
- <string name="TooltipFlagTouch">Touch</string>
- <string name="TooltipFlagL$">L$</string>
- <string name="TooltipFlagDropInventory">Drop Inventory</string>
- <string name="TooltipFlagPhantom">Phantom</string>
- <string name="TooltipFlagTemporary">Temporary</string>
- <string name="TooltipFlagRightClickMenu">(Right-click for menu)</string>
- <string name="TooltipFreeToCopy">Free to copy</string>
<string name="TooltipForSaleL$">For Sale: L$[AMOUNT]</string> <!-- L$ version -->
- <string name="TooltipForSaleMsg">For Sale: [MESSAGE]</string> <!-- Message (RetrievingData) -->
<string name="TooltipFlagGroupBuild">Group Build</string>
<string name="TooltipFlagNoBuild">No Build</string>
<string name="TooltipFlagNoEdit">Group Build</string>
@@ -1940,16 +1929,23 @@ this texture in your inventory
<string name="DaysOld">[AGEDAYS] old</string>
<string name="TodayOld">Joined today</string>
- <!-- AgeYearsA = singular, AgeYearsB = plural, see logic in
- LLTrans::getCountString() -->
+ <!-- AgeYearsA = singular,
+ AgeYearsB = plural,
+ AgeYearsC = plural for non-English languages like Russian
+ For example, LLTrans::getCountString("AgeYears", 3) is plural form B
+ in English and form C in Russian -->
<string name="AgeYearsA">[COUNT] year</string>
<string name="AgeYearsB">[COUNT] years</string>
+ <string name="AgeYearsC">[COUNT] years</string>
<string name="AgeMonthsA">[COUNT] month</string>
<string name="AgeMonthsB">[COUNT] months</string>
+ <string name="AgeMonthsC">[COUNT] months</string>
<string name="AgeWeeksA">[COUNT] week</string>
<string name="AgeWeeksB">[COUNT] weeks</string>
+ <string name="AgeWeeksC">[COUNT] weeks</string>
<string name="AgeDaysA">[COUNT] day</string>
<string name="AgeDaysB">[COUNT] days</string>
+ <string name="AgeDaysC">[COUNT] days</string>
<!-- Account types, see LLAvatarPropertiesProcessor -->
<string name="AcctTypeResident">Resident</string>
@@ -2177,6 +2173,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="'">'</string>
<string name="---">---</string>
+ <!-- media -->
+ <string name="Multiple Media">Multiple Media</string>
+
<!-- OSMessageBox messages -->
<string name="MBCmdLineError">
An error was found parsing the command line.
@@ -2246,225 +2245,585 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
</string>
<!-- Avatar Shape Information -->
- <string name="Attached Earlobes">Attached Earlobes</string>
- <string name="Arm Length">Arm Length</string>
- <string name="Back Bangs Down">Back Bangs Down</string>
- <string name="Back Bangs Up">Back Bangs Up</string>
- <string name="Back Hair Down">Back Hair Down</string>
- <string name="Back Hair Up">Back Hair Up</string>
- <string name="Belly Size">Belly Size</string>
- <string name="Blonde Hair">Blonde Hair</string>
- <string name="Big Eyeball">Big Eyeball</string>
- <string name="Big Hair Back">Big Hair: Back</string>
- <string name="Big Hair Front">Big Hair: Front</string>
- <string name="Big Hair Top">Big Hair: Top</string>
- <string name="Body Fat">Body Fat</string>
- <string name="Body Thickness">Body Thickness</string>
- <string name="Breast Buoyancy">Breast Buoyancy</string>
- <string name="Breast Cleavage">Breast Cleavage</string>
- <string name="Breast Size">Breast Size</string>
- <string name="Bridge Width">Bridge Width</string>
- <string name="Brow Size">Brow Size</string>
- <string name="Butt Size">Butt Size</string>
- <string name="Cheek Bones">Cheek Bones</string>
- <string name="Chest Size">Chest Size</string>
- <string name="Chin Angle">Chin Angle</string>
- <string name="Chin Cleft">Chin Cleft</string>
- <string name="Chin Depth">Chin Depth</string>
- <string name="Chin-Neck">Chin-Neck</string>
- <string name="Collar Back">Collar Back</string>
- <string name="Collar Front">Collar Front</string>
- <string name="Crooked Nose">Crooked Nose</string>
- <string name="Cuff Flare">Cuff Flare</string>
- <string name="Ear Angle">Ear Angle</string>
- <string name="Ear Size">Ear Size</string>
- <string name="Ear Tips">Ear Tips</string>
- <string name="Egg Head">Egg Head</string>
- <string name="Eye Bags">Eye Bags</string>
- <string name="Eye Color">Eye Color</string>
- <string name="Eye Depth">Eye Depth</string>
- <string name="Eye Lightness">Eye Lightness</string>
- <string name="Eye Opening">Eye Opening</string>
- <string name="Eye Pop">Eye Pop</string>
- <string name="Eye Size">Eye Size</string>
- <string name="Eye Spacing">Eye Spacing</string>
- <string name="Eyeball Size">Eyeball Size</string>
- <string name="Eyebrow Arc">Eyebrow Arc</string>
- <string name="Eyebrow Height">Eyebrow Height</string>
- <string name="Eyebrow Points">Eyebrow Points</string>
- <string name="Eyelash Length">Eyelash Length</string>
- <string name="Eyeliner">Eyeliner</string>
- <string name="Eyeliner Color">Eyeliner Color</string>
- <string name="Face Shear">Face Shear</string>
- <string name="Facial Definitionr">Facial Definition</string>
- <string name="Fat Head">Fat Head</string>
- <string name="Fat Lower Lip">Fat Lower Lip</string>
- <string name="Fat Torso">Fat Torso</string>
- <string name="Fat Upper Lip">Fat Upper Lip</string>
- <string name="Foot Size">Foot Size</string>
- <string name="Freckles">Freckles</string>
- <string name="Front Bangs Down">Front Bangs Down</string>
- <string name="Front Bangs Up">Front Bangs Up</string>
- <string name="Front Hair Down">Front Hair Down</string>
- <string name="Front Hair Up">Front Hair Up</string>
- <string name="Forehead Angle">Forehead Angle</string>
- <string name="Full Hair Sides">Full Hair Sides</string>
- <string name="Glove Fingers">Glove Fingers</string>
- <string name="Glove Length">Glove Length</string>
- <string name="Hair Thickess">Hair Thickess</string>
- <string name="Hair Tilted Left">Hair Tilted Left</string>
- <string name="Hair Tilted Right">Hair Tilted Right</string>
- <string name="Hair Volume">Hair: Volume</string>
- <string name="Hand Size">Hand Size</string>
- <string name="Head Length">Head Length</string>
- <string name="Head Shape">Head Shape</string>
- <string name="Head Size">Head Size</string>
- <string name="Head Stretch">Head Stretch</string>
- <string name="Heel Height">Heel Height</string>
- <string name="Heel Shape">Heel Shape</string>
- <string name="Height">Height</string>
- <string name="Hip Width">Hip Width</string>
- <string name="Hip Length">Hip Length</string>
- <string name="Inner Eye Corner">Inner Eye Corner</string>
- <string name="Jacket Length">Jacket Length</string>
- <string name="Jacket Wrinkles">Jacket Wrinkles</string>
- <string name="Jowls">Jowls</string>
- <string name="Jaw Angle">Jaw Angle</string>
- <string name="Jaw Jut">Jaw Jut</string>
- <string name="Jaw Shape">Jaw Shape</string>
- <string name="Knee Angle">Knee Angle</string>
- <string name="Left Part">Left Part</string>
- <string name="Leg Muscles">Leg Muscles</string>
- <string name="Leg Length">Leg Length</string>
- <string name="Lip Cleft">Lip Cleft</string>
- <string name="Lip Cleft Depth">Lip Cleft Depth</string>
- <string name="Lip Fullness">Lip Fullness</string>
- <string name="Lip Pinkness">Lip Pinkness</string>
- <string name="Lip Ratio">Lip Ratio</string>
- <string name="Lip Thickness">Lip Thickness</string>
- <string name="Lip Width">Lip Width</string>
- <string name="Longcuffs">Longcuffs</string>
- <string name="Love Handles">Love Handles</string>
- <string name="Lower Bridge">Lower Bridge</string>
- <string name="Lower Cheeks">Lower Cheeks</string>
- <string name="Middle Part">Middle Part</string>
- <string name="Mouth Corner">Mouth Corner</string>
- <string name="Mouth Position">Mouth Position</string>
- <string name="Nail Polish">Nail Polish</string>
- <string name="Nail Polish Color">Nail Polish Color</string>
- <string name="Neck Length">Neck Length</string>
- <string name="Neck Thickness">Neck Thickness</string>
- <string name="Nose Size">Nose Size</string>
- <string name="Nose Thickness">Nose Thickness</string>
- <string name="Nose Tip Angle">Nose Tip Angle</string>
- <string name="Nose Tip Shape">Nose Tip Shape</string>
- <string name="Nose Width">Nose Width</string>
- <string name="Nostril Division">Nostril Division</string>
- <string name="Nostril Width">Nostril Width</string>
- <string name="Open Front">Open Front</string>
- <string name="Lipstick Color">Lipstick Color</string>
- <string name="Lipstick">Lipstick</string>
- <string name="Lipgloss">Lipgloss</string>
- <string name="Blush">Blush</string>
- <string name="Blush Color">Blush Color</string>
- <string name="Blush Opacity">Blush Opacity</string>
- <string name="Inner Shadow">Inner Shadow</string>
- <string name="In Shdw Color">Inner Shadow Color</string>
- <string name="In Shdw Opacity">Inner Shadow Opacity</string>
- <string name="Body Definition">Body Definition</string>
- <string name="Body Freckles">Body Freckles</string>
- <string name="Facial Definition">Facial Definition</string>
- <string name="Hair Front">Hair: Front</string>
- <string name="Hair Sides">Hair: Sides</string>
- <string name="Hair Back">Hair: Back</string>
- <string name="Front Fringe">Front Fringe</string>
- <string name="Side Fringe">Side Fringe</string>
- <string name="Back Fringe">Back Fringe</string>
- <string name="Hair Sweep">Hair Sweep</string>
- <string name="Pigtails">Pigtails</string>
- <string name="Ponytail">Ponytail</string>
- <string name="Hair Tilt">Hair Tilt</string>
- <string name="Eyebrow Size">Eyebrow Size</string>
- <string name="Eyebrow Density">Eyebrow Density</string>
- <!-- string name="Hair Thickess">Hair Thickess</string Need a second string for Body Parts > Hair > Facial? -->
- <string name="Sideburns">Sideburns</string>
- <string name="Moustache">Moustache</string>
- <string name="Soulpatch">Soulpatch</string>
- <string name="Chin Curtains">Chin Curtains</string>
- <string name="Outer Eye Corner">Outer Eye Corner</string>
- <string name="Outer Shadow">Outer Shadow</string>
- <string name="Out Shdw Opacity">Outer Shadow Opacity</string>
- <string name="Out Shdw Color">Outer Shadow Color</string>
- <string name="Package">Package</string>
- <string name="Pants Crotch">Pants Crotch</string>
- <string name="Pants Fit">Pants Fit</string>
- <string name="Pants Length">Pants Length</string>
- <string name="Pants Waist">Pants Waist</string>
- <string name="Pants Wrinkles">Pants Wrinkles</string>
- <string name="Part Bangs">Part Bangs</string>
- <string name="Pectorals">Pectorals</string>
- <string name="Platform Height">Platform Height</string>
- <string name="Platform Width">Platform Width</string>
- <string name="Pigment">Pigment</string>
- <string name="Puffy Eyelids">Puffy Eyelids</string>
- <string name="Rainbow Color">Rainbow Color</string>
- <string name="Red Hair">Red Hair</string>
- <string name="Right Part">Right Part</string>
- <string name="Round Forehead">Round Forehead</string>
- <string name="Rosy Complexion">Rosy Complexion</string>
- <string name="Ruddiness">Ruddiness</string>
- <string name="Rumpled Hair">Rumpled Hair</string>
- <string name="Saddle Bags">Saddle Bags</string>
- <string name="Scrawny Leg">Scrawny Leg</string>
- <string name="Shear Back">Shear Back</string>
- <string name="Shear Face">Shear Face</string>
- <string name="Shear Front">Shear Front</string>
- <string name="Shift Mouth">Shift Mouth</string>
- <string name="Shirt Bottom">Shirt Bottom</string>
- <string name="Shirt Fit">Shirt Fit</string>
- <string name="Shirt Wrinkles">Shirt Wrinkles</string>
- <string name="Shoe Height">Shoe Height</string>
- <string name="Shoulders">Shoulders</string>
- <string name="Side Bangs Down">Side Bangs Down</string>
- <string name="Side Bangs Up">Side Bangs Up</string>
- <string name="Sides Hair Down">Sides Hair Down</string>
- <string name="Sides Hair Up">Sides Hair Up</string>
- <string name="Skirt Fit">Skirt Fit</string>
- <string name="Skirt Length">Skirt Length</string>
- <string name="Slanted Forehead">Slanted Forehead</string>
- <string name="Sleeve Length">Sleeve Length</string>
- <string name="Sleeve Looseness">Sleeve Looseness</string>
- <string name="Slit Back">Slit: Back</string>
- <string name="Slit Front">Slit: Front</string>
- <string name="Slit Left">Slit: Left</string>
- <string name="Slit Right">Slit: Right</string>
- <string name="Socks Length">Socks Length</string>
- <string name="Spiked Hair">Spiked Hair</string>
- <string name="Squash/Stretch Head">Squash/Stretch Head</string>
- <string name="Swept Back Hair">Swept Back Hair</string>
- <string name="Swept Forward Hair">Swept Forward Hair</string>
- <string name="Taper Back">Taper Back</string>
- <string name="Taper Front">Taper Front</string>
- <string name="Toe Shape">Toe Shape</string>
- <string name="Toe Thickness">Toe Thickness</string>
- <string name="Toe Length">Toe Length</string>
- <string name="Torso Length">Torso Length</string>
- <string name="Torso Muscles">Torso Muscles</string>
- <string name="Torso Scrawny">Torso Scrawny</string>
- <string name="Upper Bridge">Upper Bridge</string>
- <string name="Upper Cheeks">Upper Cheeks</string>
- <string name="Upper Chin Cleft">Upper Chin Cleft</string>
- <string name="Upper Eyelid Fold">Upper Eyelid Fold</string>
- <string name="Waist Height">Waist Height</string>
- <string name="White Hair">White Hair</string>
- <string name="big belly skirt">big belly skirt</string>
- <string name="bigbutt skirt">bigbutt skirt</string>
- <string name="bustle skirt">Bustle Skirt</string>
- <string name="legs skirt">legs skirt</string>
- <string name="loose skirt">loose skirt</string>
- <string name="poofy skirt">poofy skirt</string>
- <string name="tight skirt">tight skirt</string>
- <string name="wrinkles">Wrinkles</string>
+<string name="5 O'Clock Shadow">5 O'Clock Shadow</string>
+<string name="5 O'Clock Shadow bump">5 O'Clock Shadow bump</string>
+<string name="All White">All White</string>
+<string name="Anime Eyes">Anime Eyes</string>
+<string name="Arced">Arced</string>
+<string name="Arm Length">Arm Length</string>
+<string name="Attached">Attached</string>
+<string name="Attached Earlobes">Attached Earlobes</string>
+<string name="BELLY">BELLY</string>
+<string name="Back Bangs">Back Bangs</string>
+<string name="Back Bangs Down">Back Bangs Down</string>
+<string name="Back Bangs Up">Back Bangs Up</string>
+<string name="Back Fringe">Back Fringe</string>
+<string name="Back Hair">Back Hair</string>
+<string name="Back Hair Down">Back Hair Down</string>
+<string name="Back Hair Up">Back Hair Up</string>
+<string name="Baggy">Baggy</string>
+<string name="Bangs">Bangs</string>
+<string name="Bangs Down">Bangs Down</string>
+<string name="Bangs Up">Bangs Up</string>
+<string name="Beady Eyes">Beady Eyes</string>
+<string name="Belly Size">Belly Size</string>
+<string name="Big">Big</string>
+<string name="Big Butt">Big Butt</string>
+<string name="Big Eyeball">Big Eyeball</string>
+<string name="Big Hair Back">Big Hair Back</string>
+<string name="Big Hair Front">Big Hair Front</string>
+<string name="Big Hair Top">Big Hair Top</string>
+<string name="Big Head">Big Head</string>
+<string name="Big Pectorals">Big Pectorals</string>
+<string name="Big Spikes">Big Spikes</string>
+<string name="Black">Black</string>
+<string name="Blonde">Blonde</string>
+<string name="Blonde Hair">Blonde Hair</string>
+<string name="Blush">Blush</string>
+<string name="Blush Color">Blush Color</string>
+<string name="Blush Opacity">Blush Opacity</string>
+<string name="Body Definition">Body Definition</string>
+<string name="Body Fat">Body Fat</string>
+<string name="Body Freckles">Body Freckles</string>
+<string name="Body Thick">Body Thick</string>
+<string name="Body Thickness">Body Thickness</string>
+<string name="Body Thin">Body Thin</string>
+<string name="Bottom">Bottom</string>
+<string name="Bottom Left">Bottom Left</string>
+<string name="Bottom Right">Bottom Right</string>
+<string name="Bottom bump">Bottom bump</string>
+<string name="Bow Legged">Bow Legged</string>
+<string name="Breast Buoyancy">Breast Buoyancy</string>
+<string name="Breast Cleavage">Breast Cleavage</string>
+<string name="Breast Size">Breast Size</string>
+<string name="Bridge Width">Bridge Width</string>
+<string name="Broad">Broad</string>
+<string name="Brow Size">Brow Size</string>
+<string name="Bug Eyes">Bug Eyes</string>
+<string name="Bugged Eyes">Bugged Eyes</string>
+<string name="Bulbous">Bulbous</string>
+<string name="Bulbous Nose">Bulbous Nose</string>
+<string name="Bump base">Bump base</string>
+<string name="Bump upperdef">Bump upperdef</string>
+<string name="Bushy Eyebrows">Bushy Eyebrows</string>
+<string name="Bushy Hair">Bushy Hair</string>
+<string name="Butt Size">Butt Size</string>
+<string name="CHEST">CHEST</string>
+<string name="Center">Center</string>
+<string name="Center 2">Center 2</string>
+<string name="Chaplin">Chaplin</string>
+<string name="Cheek Bones">Cheek Bones</string>
+<string name="Chest">Chest</string>
+<string name="Chest Size">Chest Size</string>
+<string name="Chin">Chin</string>
+<string name="Chin Angle">Chin Angle</string>
+<string name="Chin Cleft">Chin Cleft</string>
+<string name="Chin Curtains">Chin Curtains</string>
+<string name="Chin Curtains bump">Chin Curtains bump</string>
+<string name="Chin Depth">Chin Depth</string>
+<string name="Chin Heavy">Chin Heavy</string>
+<string name="Chin In">Chin In</string>
+<string name="Chin Out">Chin Out</string>
+<string name="Chin-Neck">Chin-Neck</string>
+<string name="Clear">Clear</string>
+<string name="Cleft">Cleft</string>
+<string name="Close Set Eyes">Close Set Eyes</string>
+<string name="Closed">Closed</string>
+<string name="Closed Back">Closed Back</string>
+<string name="Closed Front">Closed Front</string>
+<string name="Closed Left">Closed Left</string>
+<string name="Closed Right">Closed Right</string>
+<string name="Coin Purse">Coin Purse</string>
+<string name="Collar Back">Collar Back</string>
+<string name="Collar Back Height Cloth">Collar Back Height Cloth</string>
+<string name="Collar Back Shadow Height">Collar Back Shadow Height</string>
+<string name="Collar Back bump">Collar Back bump</string>
+<string name="Collar Front">Collar Front</string>
+<string name="Collar Front Height Cloth">Collar Front Height Cloth</string>
+<string name="Collar Front Shadow Height">Collar Front Shadow Height</string>
+<string name="Collar Front bump">Collar Front bump</string>
+<string name="Corner Down">Corner Down</string>
+<string name="Corner Normal">Corner Normal</string>
+<string name="Corner Up">Corner Up</string>
+<string name="Creased">Creased</string>
+<string name="Crooked Nose">Crooked Nose</string>
+<string name="Cropped Hair">Cropped Hair</string>
+<string name="Cuff Flare">Cuff Flare</string>
+<string name="Dark">Dark</string>
+<string name="Dark Green">Dark Green</string>
+<string name="Darker">Darker</string>
+<string name="Deep">Deep</string>
+<string name="Default Heels">Default Heels</string>
+<string name="Default Toe">Default Toe</string>
+<string name="Dense">Dense</string>
+<string name="Dense hair">Dense hair</string>
+<string name="Double Chin">Double Chin</string>
+<string name="Downturned">Downturned</string>
+<string name="Duffle Bag">Duffle Bag</string>
+<string name="Ear Angle">Ear Angle</string>
+<string name="Ear Size">Ear Size</string>
+<string name="Ear Tips">Ear Tips</string>
+<string name="Egg Head">Egg Head</string>
+<string name="Eye Bags">Eye Bags</string>
+<string name="Eye Color">Eye Color</string>
+<string name="Eye Depth">Eye Depth</string>
+<string name="Eye Lightness">Eye Lightness</string>
+<string name="Eye Opening">Eye Opening</string>
+<string name="Eye Pop">Eye Pop</string>
+<string name="Eye Size">Eye Size</string>
+<string name="Eye Spacing">Eye Spacing</string>
+<string name="Eyeball Size">Eyeball Size</string>
+<string name="Eyebrow Arc">Eyebrow Arc</string>
+<string name="Eyebrow Density">Eyebrow Density</string>
+<string name="Eyebrow Density Bump">Eyebrow Density Bump</string>
+<string name="Eyebrow Height">Eyebrow Height</string>
+<string name="Eyebrow Points">Eyebrow Points</string>
+<string name="Eyebrow Size">Eyebrow Size</string>
+<string name="Eyebrow Size Bump">Eyebrow Size Bump</string>
+<string name="Eyelash Length">Eyelash Length</string>
+<string name="Eyeliner">Eyeliner</string>
+<string name="Eyeliner Color">Eyeliner Color</string>
+<string name="Eyes Back">Eyes Back</string>
+<string name="Eyes Bugged">Eyes Bugged</string>
+<string name="Eyes Forward">Eyes Forward</string>
+<string name="Eyes Long Head">Eyes Long Head</string>
+<string name="Eyes Shear Left Up">Eyes Shear Left Up</string>
+<string name="Eyes Shear Right Up">Eyes Shear Right Up</string>
+<string name="Eyes Short Head">Eyes Short Head</string>
+<string name="Eyes Spread">Eyes Spread</string>
+<string name="Eyes Sunken">Eyes Sunken</string>
+<string name="Eyes Together">Eyes Together</string>
+<string name="Face Shear">Face Shear</string>
+<string name="Facial Definition">Facial Definition</string>
+<string name="Far Set Eyes">Far Set Eyes</string>
+<string name="Fat">Fat</string>
+<string name="Fat Head">Fat Head</string>
+<string name="Fat Lips">Fat Lips</string>
+<string name="Fat Lower">Fat Lower</string>
+<string name="Fat Lower Lip">Fat Lower Lip</string>
+<string name="Fat Torso">Fat Torso</string>
+<string name="Fat Upper">Fat Upper</string>
+<string name="Fat Upper Lip">Fat Upper Lip</string>
+<string name="Female">Female</string>
+<string name="Fingerless">Fingerless</string>
+<string name="Fingers">Fingers</string>
+<string name="Flared Cuffs">Flared Cuffs</string>
+<string name="Flat">Flat</string>
+<string name="Flat Butt">Flat Butt</string>
+<string name="Flat Head">Flat Head</string>
+<string name="Flat Toe">Flat Toe</string>
+<string name="Foot Size">Foot Size</string>
+<string name="Forehead Angle">Forehead Angle</string>
+<string name="Forehead Heavy">Forehead Heavy</string>
+<string name="Freckles">Freckles</string>
+<string name="Front Bangs Down">Front Bangs Down</string>
+<string name="Front Bangs Up">Front Bangs Up</string>
+<string name="Front Fringe">Front Fringe</string>
+<string name="Front Hair">Front Hair</string>
+<string name="Front Hair Down">Front Hair Down</string>
+<string name="Front Hair Up">Front Hair Up</string>
+<string name="Full Back">Full Back</string>
+<string name="Full Eyeliner">Full Eyeliner</string>
+<string name="Full Front">Full Front</string>
+<string name="Full Hair Sides">Full Hair Sides</string>
+<string name="Full Sides">Full Sides</string>
+<string name="Glossy">Glossy</string>
+<string name="Glove Fingers">Glove Fingers</string>
+<string name="Glove Fingers bump">Glove Fingers bump</string>
+<string name="Glove Length">Glove Length</string>
+<string name="Glove Length bump">Glove Length bump</string>
+<string name="HEAD">HEAD</string>
+<string name="Hair">Hair</string>
+<string name="Hair Back">Hair Back</string>
+<string name="Hair Front">Hair Front</string>
+<string name="Hair Sides">Hair Sides</string>
+<string name="Hair Sweep">Hair Sweep</string>
+<string name="Hair Thickess">Hair Thickess</string>
+<string name="Hair Thickness">Hair Thickness</string>
+<string name="Hair Tilt">Hair Tilt</string>
+<string name="Hair Tilted Left">Hair Tilted Left</string>
+<string name="Hair Tilted Right">Hair Tilted Right</string>
+<string name="Hair Volume">Hair Volume</string>
+<string name="Hand Size">Hand Size</string>
+<string name="Handlebars">Handlebars</string>
+<string name="Head Length">Head Length</string>
+<string name="Head Shape">Head Shape</string>
+<string name="Head Size">Head Size</string>
+<string name="Head Stretch">Head Stretch</string>
+<string name="Heel Height">Heel Height</string>
+<string name="Heel Shape">Heel Shape</string>
+<string name="Height">Height</string>
+<string name="High">High</string>
+<string name="High Heels">High Heels</string>
+<string name="High Jaw">High Jaw</string>
+<string name="High Platforms">High Platforms</string>
+<string name="High and Tight">High and Tight</string>
+<string name="Higher">Higher</string>
+<string name="Hip Length">Hip Length</string>
+<string name="Hip Width">Hip Width</string>
+<string name="In">In</string>
+<string name="In Shdw Color">In Shdw Color</string>
+<string name="In Shdw Opacity">In Shdw Opacity</string>
+<string name="Inner Eye Corner">Inner Eye Corner</string>
+<string name="Inner Eye Shadow">Inner Eye Shadow</string>
+<string name="Inner Shadow">Inner Shadow</string>
+<string name="Jacket Collar Back bump">Jacket Collar Back bump</string>
+<string name="Jacket Collar Front bump">Jacket Collar Front bump</string>
+<string name="Jacket Length">Jacket Length</string>
+<string name="Jacket Sleeve Length bump">Jacket Sleeve Length bump</string>
+<string name="Jacket Wrinkles">Jacket Wrinkles</string>
+<string name="Jaw Angle">Jaw Angle</string>
+<string name="Jaw Jut">Jaw Jut</string>
+<string name="Jaw Shape">Jaw Shape</string>
+<string name="Join">Join</string>
+<string name="Jowls">Jowls</string>
+<string name="Knee Angle">Knee Angle</string>
+<string name="Knock Kneed">Knock Kneed</string>
+<string name="L Forearm">L Forearm</string>
+<string name="L Lower Leg">L Lower Leg</string>
+<string name="L Upper Arm">L Upper Arm</string>
+<string name="L Upper Leg">L Upper Leg</string>
+
+<string name="Large">Large</string>
+<string name="Large Hands">Large Hands</string>
+<string name="Left">Left</string>
+<string name="Left Ear">Left Ear</string>
+<string name="Left Eyeball">Left Eyeball</string>
+<string name="Left Foot">Left Foot</string>
+<string name="Left Hand">Left Hand</string>
+<string name="Left Hip">Left Hip</string>
+<string name="Left Part">Left Part</string>
+<string name="Left Pec">Left Pec</string>
+<string name="Left Shoulder">Left Shoulder</string>
+<string name="Leg Length">Leg Length</string>
+<string name="Leg Muscles">Leg Muscles</string>
+<string name="Less">Less</string>
+<string name="Less Body Fat">Less Body Fat</string>
+<string name="Less Curtains">Less Curtains</string>
+<string name="Less Freckles">Less Freckles</string>
+<string name="Less Full">Less Full</string>
+<string name="Less Gravity">Less Gravity</string>
+<string name="Less Love">Less Love</string>
+<string name="Less Muscles">Less Muscles</string>
+<string name="Less Muscular">Less Muscular</string>
+<string name="Less Rosy">Less Rosy</string>
+<string name="Less Round">Less Round</string>
+<string name="Less Saddle">Less Saddle</string>
+<string name="Less Square">Less Square</string>
+<string name="Less Volume">Less Volume</string>
+<string name="Less soul">Less soul</string>
+<string name="Light">Light</string>
+<string name="Lighter">Lighter</string>
+<string name="Lip Cleft">Lip Cleft</string>
+<string name="Lip Cleft Depth">Lip Cleft Depth</string>
+<string name="Lip Fullness">Lip Fullness</string>
+<string name="Lip Pinkness">Lip Pinkness</string>
+<string name="Lip Ratio">Lip Ratio</string>
+<string name="Lip Thickness">Lip Thickness</string>
+<string name="Lip Width">Lip Width</string>
+<string name="Lipgloss">Lipgloss</string>
+<string name="Lipstick">Lipstick</string>
+<string name="Lipstick Color">Lipstick Color</string>
+<string name="Long">Long</string>
+<string name="Long Head">Long Head</string>
+<string name="Long Hips">Long Hips</string>
+<string name="Long Legs">Long Legs</string>
+<string name="Long Neck">Long Neck</string>
+<string name="Long Pigtails">Long Pigtails</string>
+<string name="Long Ponytail">Long Ponytail</string>
+<string name="Long Torso">Long Torso</string>
+<string name="Long arms">Long arms</string>
+<string name="Longcuffs">Longcuffs</string>
+<string name="Loose Lower Clothing">Loose Lower Clothing</string>
+<string name="Loose Pants">Loose Pants</string>
+<string name="Loose Shirt">Loose Shirt</string>
+<string name="Loose Sleeves">Loose Sleeves</string>
+<string name="Loose Upper Clothing">Loose Upper Clothing</string>
+<string name="Love Handles">Love Handles</string>
+<string name="Low">Low</string>
+<string name="Low Heels">Low Heels</string>
+<string name="Low Jaw">Low Jaw</string>
+<string name="Low Platforms">Low Platforms</string>
+<string name="Low and Loose">Low and Loose</string>
+<string name="Lower">Lower</string>
+<string name="Lower Bridge">Lower Bridge</string>
+<string name="Lower Cheeks">Lower Cheeks</string>
+<string name="Lower Clothes Shading">Lower Clothes Shading</string>
+<string name="Male">Male</string>
+<string name="Middle Part">Middle Part</string>
+<string name="More">More</string>
+<string name="More Blush">More Blush</string>
+<string name="More Body Fat">More Body Fat</string>
+<string name="More Curtains">More Curtains</string>
+<string name="More Eyeshadow">More Eyeshadow</string>
+<string name="More Freckles">More Freckles</string>
+<string name="More Full">More Full</string>
+<string name="More Gravity">More Gravity</string>
+<string name="More Lipstick">More Lipstick</string>
+<string name="More Love">More Love</string>
+<string name="More Lower Lip">More Lower Lip</string>
+<string name="More Muscles">More Muscles</string>
+<string name="More Muscular">More Muscular</string>
+<string name="More Rosy">More Rosy</string>
+<string name="More Round">More Round</string>
+<string name="More Saddle">More Saddle</string>
+<string name="More Sloped">More Sloped</string>
+<string name="More Square">More Square</string>
+<string name="More Upper Lip">More Upper Lip</string>
+<string name="More Vertical">More Vertical</string>
+<string name="More Volume">More Volume</string>
+<string name="More soul">More soul</string>
+<string name="Moustache">Moustache</string>
+<string name="Moustache bump">Moustache bump</string>
+<string name="Mouth">Mouth</string>
+<string name="Mouth Corner">Mouth Corner</string>
+<string name="Mouth Position">Mouth Position</string>
+<string name="Mowhawk">Mowhawk</string>
+<string name="Muscular">Muscular</string>
+<string name="Mutton Chops">Mutton Chops</string>
+<string name="NECK">NECK</string>
+<string name="Nail Polish">Nail Polish</string>
+<string name="Nail Polish Color">Nail Polish Color</string>
+<string name="Narrow">Narrow</string>
+<string name="Narrow Back">Narrow Back</string>
+<string name="Narrow Front">Narrow Front</string>
+<string name="Narrow Lips">Narrow Lips</string>
+<string name="Natural">Natural</string>
+<string name="Neck Length">Neck Length</string>
+<string name="Neck Thickness">Neck Thickness</string>
+<string name="No Blush">No Blush</string>
+<string name="No Eyeliner">No Eyeliner</string>
+<string name="No Eyeshadow">No Eyeshadow</string>
+<string name="No Heels">No Heels</string>
+<string name="No Lipgloss">No Lipgloss</string>
+<string name="No Lipstick">No Lipstick</string>
+<string name="No Part">No Part</string>
+<string name="No Polish">No Polish</string>
+<string name="No Red">No Red</string>
+<string name="No Spikes">No Spikes</string>
+<string name="No White">No White</string>
+<string name="No Wrinkles">No Wrinkles</string>
+<string name="None">None</string>
+<string name="Normal Lower">Normal Lower</string>
+<string name="Normal Upper">Normal Upper</string>
+<string name="Nose">Nose</string>
+<string name="Nose Left">Nose Left</string>
+<string name="Nose Right">Nose Right</string>
+<string name="Nose Size">Nose Size</string>
+<string name="Nose Thickness">Nose Thickness</string>
+<string name="Nose Tip Angle">Nose Tip Angle</string>
+<string name="Nose Tip Shape">Nose Tip Shape</string>
+<string name="Nose Width">Nose Width</string>
+<string name="Nostril Division">Nostril Division</string>
+<string name="Nostril Width">Nostril Width</string>
+<string name="NotHair">NotHair</string>
+<string name="Old">Old</string>
+<string name="Opaque">Opaque</string>
+<string name="Open">Open</string>
+<string name="Open Back">Open Back</string>
+<string name="Open Front">Open Front</string>
+<string name="Open Left">Open Left</string>
+<string name="Open Right">Open Right</string>
+<string name="Orange">Orange</string>
+<string name="Out">Out</string>
+<string name="Out Shdw Color">Out Shdw Color</string>
+<string name="Out Shdw Opacity">Out Shdw Opacity</string>
+<string name="Outer Eye Corner">Outer Eye Corner</string>
+<string name="Outer Eye Shadow">Outer Eye Shadow</string>
+<string name="Outer Shadow">Outer Shadow</string>
+<string name="Overbite">Overbite</string>
+<string name="PELVIS">PELVIS</string>
+<string name="Package">Package</string>
+<string name="Painted Nails">Painted Nails</string>
+<string name="Pale">Pale</string>
+<string name="Pants Crotch">Pants Crotch</string>
+<string name="Pants Fit">Pants Fit</string>
+<string name="Pants Length">Pants Length</string>
+<string name="Pants Length Cloth">Pants Length Cloth</string>
+<string name="Pants Length Shadow">Pants Length Shadow</string>
+<string name="Pants Waist">Pants Waist</string>
+<string name="Pants Wrinkles">Pants Wrinkles</string>
+<string name="Part">Part</string>
+<string name="Part Bangs">Part Bangs</string>
+<string name="Pectorals">Pectorals</string>
+<string name="Pelvis">Pelvis</string>
+<string name="Pigment">Pigment</string>
+<string name="Pigtails">Pigtails</string>
+<string name="Pink">Pink</string>
+<string name="Pinker">Pinker</string>
+<string name="Platform Height">Platform Height</string>
+<string name="Platform Width">Platform Width</string>
+<string name="Pointy">Pointy</string>
+<string name="Pointy Heels">Pointy Heels</string>
+<string name="Pointy Toe">Pointy Toe</string>
+<string name="Ponytail">Ponytail</string>
+<string name="Poofy Skirt">Poofy Skirt</string>
+<string name="Pop Left Eye">Pop Left Eye</string>
+<string name="Pop Right Eye">Pop Right Eye</string>
+<string name="Puffy">Puffy</string>
+<string name="Puffy Eyelids">Puffy Eyelids</string>
+<string name="R Forearm">R Forearm</string>
+<string name="R Lower Leg">R Lower Leg</string>
+<string name="R Upper Arm">R Upper Arm</string>
+<string name="R Upper Leg">R Upper Leg</string>
+<string name="Rainbow Color">Rainbow Color</string>
+<string name="Red Hair">Red Hair</string>
+<string name="Red Skin">Red Skin</string>
+<string name="Regular">Regular</string>
+<string name="Regular Muscles">Regular Muscles</string>
+<string name="Right">Right</string>
+<string name="Right Ear">Right Ear</string>
+<string name="Right Eyeball">Right Eyeball</string>
+<string name="Right Foot">Right Foot</string>
+<string name="Right Hand">Right Hand</string>
+<string name="Right Hip">Right Hip</string>
+<string name="Right Part">Right Part</string>
+<string name="Right Pec">Right Pec</string>
+<string name="Right Shoulder">Right Shoulder</string>
+<string name="Rosy Complexion">Rosy Complexion</string>
+<string name="Round">Round</string>
+<string name="Round Forehead">Round Forehead</string>
+<string name="Ruddiness">Ruddiness</string>
+<string name="Ruddy">Ruddy</string>
+<string name="Rumpled Hair">Rumpled Hair</string>
+<string name="Saddle Bags">Saddle Bags</string>
+<string name="Saddlebags">Saddlebags</string>
+<string name="Scrawny">Scrawny</string>
+<string name="Scrawny Leg">Scrawny Leg</string>
+<string name="Separate">Separate</string>
+<string name="Shading">Shading</string>
+<string name="Shadow hair">Shadow hair</string>
+<string name="Shallow">Shallow</string>
+<string name="Shear Back">Shear Back</string>
+<string name="Shear Face">Shear Face</string>
+<string name="Shear Front">Shear Front</string>
+<string name="Shear Left">Shear Left</string>
+<string name="Shear Left Up">Shear Left Up</string>
+<string name="Shear Right">Shear Right</string>
+<string name="Shear Right Up">Shear Right Up</string>
+<string name="Sheared Back">Sheared Back</string>
+<string name="Sheared Front">Sheared Front</string>
+<string name="Shift Left">Shift Left</string>
+<string name="Shift Mouth">Shift Mouth</string>
+<string name="Shift Right">Shift Right</string>
+<string name="Shirt Bottom">Shirt Bottom</string>
+<string name="Shirt Bottom Cloth">Shirt Bottom Cloth</string>
+<string name="Shirt Fit">Shirt Fit</string>
+<string name="Shirt Shadow Bottom">Shirt Shadow Bottom</string>
+<string name="Shirt Wrinkles">Shirt Wrinkles</string>
+<string name="Shoe Height">Shoe Height</string>
+<string name="Shoe Height bump">Shoe Height bump</string>
+<string name="Short">Short</string>
+<string name="Short Arms">Short Arms</string>
+<string name="Short Legs">Short Legs</string>
+<string name="Short Neck">Short Neck</string>
+<string name="Short Pigtails">Short Pigtails</string>
+<string name="Short Ponytail">Short Ponytail</string>
+<string name="Short Sideburns">Short Sideburns</string>
+<string name="Short Torso">Short Torso</string>
+<string name="Short hips">Short hips</string>
+<string name="Shoulders">Shoulders</string>
+<string name="Side Bangs">Side Bangs</string>
+<string name="Side Bangs Down">Side Bangs Down</string>
+<string name="Side Bangs Up">Side Bangs Up</string>
+<string name="Side Fringe">Side Fringe</string>
+<string name="Sideburns">Sideburns</string>
+<string name="Sideburns bump">Sideburns bump</string>
+<string name="Sides Hair">Sides Hair</string>
+<string name="Sides Hair Down">Sides Hair Down</string>
+<string name="Sides Hair Up">Sides Hair Up</string>
+<string name="Skinny">Skinny</string>
+<string name="Skinny Neck">Skinny Neck</string>
+<string name="Skirt Fit">Skirt Fit</string>
+<string name="Skirt Length">Skirt Length</string>
+<string name="Skull">Skull</string>
+<string name="Slanted Forehead">Slanted Forehead</string>
+<string name="Sleeve Length">Sleeve Length</string>
+<string name="Sleeve Length Cloth">Sleeve Length Cloth</string>
+<string name="Sleeve Length Shadow">Sleeve Length Shadow</string>
+<string name="Sleeve Length bump">Sleeve Length bump</string>
+<string name="Sleeve Looseness">Sleeve Looseness</string>
+<string name="Slit Back">Slit Back</string>
+<string name="Slit Front">Slit Front</string>
+<string name="Slit Left">Slit Left</string>
+<string name="Slit Right">Slit Right</string>
+<string name="Small">Small</string>
+<string name="Small Hands">Small Hands</string>
+<string name="Small Head">Small Head</string>
+<string name="Smooth">Smooth</string>
+<string name="Smooth Hair">Smooth Hair</string>
+<string name="Socks Length">Socks Length</string>
+<string name="Socks Length bump">Socks Length bump</string>
+<string name="Some">Some</string>
+<string name="Soulpatch">Soulpatch</string>
+<string name="Soulpatch bump">Soulpatch bump</string>
+<string name="Sparse">Sparse</string>
+<string name="Spiked Hair">Spiked Hair</string>
+<string name="Spine">Spine</string>
+<string name="Square">Square</string>
+<string name="Square Toe">Square Toe</string>
+<string name="Squash Head">Squash Head</string>
+<string name="Squash/Stretch Head">Squash/Stretch Head</string>
+<string name="Stomach">Stomach</string>
+<string name="Stretch Head">Stretch Head</string>
+<string name="Sunken">Sunken</string>
+<string name="Sunken Chest">Sunken Chest</string>
+<string name="Sunken Eyes">Sunken Eyes</string>
+<string name="Sweep Back">Sweep Back</string>
+<string name="Sweep Forward">Sweep Forward</string>
+<string name="Swept Back">Swept Back</string>
+<string name="Swept Back Hair">Swept Back Hair</string>
+<string name="Swept Forward">Swept Forward</string>
+<string name="Swept Forward Hair">Swept Forward Hair</string>
+<string name="Tall">Tall</string>
+<string name="Taper Back">Taper Back</string>
+<string name="Taper Front">Taper Front</string>
+<string name="Thick Heels">Thick Heels</string>
+<string name="Thick Neck">Thick Neck</string>
+<string name="Thick Toe">Thick Toe</string>
+<string name="Thickness">Thickness</string>
+<string name="Thin">Thin</string>
+<string name="Thin Eyebrows">Thin Eyebrows</string>
+<string name="Thin Lips">Thin Lips</string>
+<string name="Thin Nose">Thin Nose</string>
+<string name="Tight Chin">Tight Chin</string>
+<string name="Tight Cuffs">Tight Cuffs</string>
+<string name="Tight Pants">Tight Pants</string>
+<string name="Tight Shirt">Tight Shirt</string>
+<string name="Tight Skirt">Tight Skirt</string>
+<string name="Tight Sleeves">Tight Sleeves</string>
+<string name="Tilt Left">Tilt Left</string>
+<string name="Tilt Right">Tilt Right</string>
+<string name="Toe Shape">Toe Shape</string>
+<string name="Toe Thickness">Toe Thickness</string>
+<string name="Top">Top</string>
+<string name="Top Left">Top Left</string>
+<string name="Top Right">Top Right</string>
+<string name="Torso Length">Torso Length</string>
+<string name="Torso Muscles">Torso Muscles</string>
+<string name="Torso Scrawny">Torso Scrawny</string>
+<string name="Unattached">Unattached</string>
+<string name="Uncreased">Uncreased</string>
+<string name="Underbite">Underbite</string>
+<string name="Unnatural">Unnatural</string>
+<string name="Upper Bridge">Upper Bridge</string>
+<string name="Upper Cheeks">Upper Cheeks</string>
+<string name="Upper Chin Cleft">Upper Chin Cleft</string>
+<string name="Upper Clothes Shading">Upper Clothes Shading</string>
+<string name="Upper Eyelid Fold">Upper Eyelid Fold</string>
+<string name="Upturned">Upturned</string>
+<string name="Very Red">Very Red</string>
+<string name="Waist Height">Waist Height</string>
+<string name="Waist Height Cloth">Waist Height Cloth</string>
+<string name="Waist Height Shadow">Waist Height Shadow</string>
+<string name="Well-Fed">Well-Fed</string>
+<string name="White Hair">White Hair</string>
+<string name="Wide">Wide</string>
+<string name="Wide Back">Wide Back</string>
+<string name="Wide Front">Wide Front</string>
+<string name="Wide Lips">Wide Lips</string>
+<string name="Wild">Wild</string>
+<string name="Wrinkles">Wrinkles</string>
<!-- Favorites Bar -->
<string name="location_ctrl_add_landmark">Add to My Landmarks</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
index d7369d0726..0dbca318b6 100644
--- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
@@ -20,7 +20,9 @@
image_unselected="DropDown_Off"
image_selected="DropDown_Selected"
image_disabled="DropDown_Disabled" />
- <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor" />
+ <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
+ background_visible="true"
+ />
<combo_box.combo_editor name="Combo Text Entry"
select_on_focus="true"
font="SansSerifSmall" />
diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
index bcfc2f6472..6381dce1d6 100644
--- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
@@ -2,6 +2,7 @@
<expandable_text
max_height="300" >
<textbox
+ more_label="More"
follows="left|top"
name="text"
use_ellipses="true"
@@ -9,16 +10,6 @@
tab_stop="true"
v_pad="2"
h_pad="3" >
- <expand_textbox
- name="expand"
- follows="bottom|right"
- visible="false"
- bg_visible="false"
- tab_stop="false"
- v_pad="0"
- h_pad="0"
- text="[http://www.DUMMY.com More]"
- tool_tip="Click to expand text"/>
</textbox>
<scroll
name="scroll"
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
index 824a815a99..4520768216 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
@@ -12,7 +12,7 @@
draw_stripes="true"
scroll_bar_bg_visible="false"
scroll_bar_bg_color="black"
- background_visible="false"
+ background_visible="true"
heading_height="23"
draw_border="false"
draw_heading="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 7d78a8fa20..5914c21b2b 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<text allow_html="true"
clip_to_rect="false"
+ mouse_opaque="false"
name="text_box"
font="SansSerifSmall"
font_shadow="soft"
@@ -17,4 +18,5 @@
border_visible="false"
hover="false"
text_color="LabelTextColor"
- v_pad="-1"/>
+ v_pad="-1"
+ max_length="4096"/>
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index 0246f0d440..3aeb4e5771 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move floater" title="">
- <string name="rotate_tooltip">
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
Girar la cámara alrededor de lo enfocado
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Hacer zoom con la cámara en lo enfocado
- </string>
- <string name="move_tooltip">
- Mover la cámara arriba y abajo, izquierda y derecha.
- </string>
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Mover la cámara arriba y abajo, izquierda y derecha
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Mover la cámara arriba y abajo, izquierda y derecha"/>
+ <joystick_zoom name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_color_picker.xml b/indra/newview/skins/default/xui/es/floater_color_picker.xml
index c220c48cb0..616c373d18 100644
--- a/indra/newview/skins/default/xui/es/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/es/floater_color_picker.xml
@@ -26,6 +26,6 @@
</text>
<text name="(Drag below to save.)">
(Arrástrelo abajo
- para guardarlo.)
+ para guardarlo)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 9f280b7265..8ea640853f 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="move floater">
- <string name="rotate_tooltip">
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
Faire tourner la caméra autour du point central
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Zoomer en direction du point central
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
Déplacer la caméra vers le haut et le bas, la gauche et la droite
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
+ <joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index adab86dac0..94bcad070e 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -27,6 +27,6 @@
</text>
<text left="8" name="(Drag below to save.)" width="114">
(Faire glisser dessous
-pour enregistrer.)
+pour enregistrer)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_camera.xml b/indra/newview/skins/default/xui/it/floater_camera.xml
index 9655ed2211..823be8f4a1 100644
--- a/indra/newview/skins/default/xui/it/floater_camera.xml
+++ b/indra/newview/skins/default/xui/it/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move floater" title="">
- <string name="rotate_tooltip">
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
Ruota la telecamera Intorno all&apos;Inquadratura
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Avvicina la telecamera nell&apos;inquadratura
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
Muovi la telecamera su e giù e a sinistra e destra
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Muovi la telecamera su e giù e a sinistra e destra"/>
+ <joystick_zoom name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_color_picker.xml b/indra/newview/skins/default/xui/it/floater_color_picker.xml
index 93188c29ac..1e6d7bc3f0 100644
--- a/indra/newview/skins/default/xui/it/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_color_picker.xml
@@ -33,6 +33,6 @@
</text>
<text name="(Drag below to save.)">
(Trascina qui sotto
- per salvare.)
+ per salvare)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index 46e7b1990d..bb87b194a4 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="move floater">
- <string name="rotate_tooltip">
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
フォーカスを中心にカメラを回転
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
フォーカスに向けてカメラをズーム
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
カメラを上下左右に移動
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="カメラを上下左右に移動"/>
+ <joystick_zoom name="zoom" tool_tip="フォーカスに向けてカメラをズーム"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_camera.xml b/indra/newview/skins/default/xui/nl/floater_camera.xml
index a6b843a0a2..81a3ed8a58 100644
--- a/indra/newview/skins/default/xui/nl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/nl/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move floater" title="">
- <string name="rotate_tooltip">
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
Roteer camera rond focus
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Zoom camera naar focus
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
Beweeg camera omhoog en omlaag, links en rechts
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Beweeg camera omhoog en omlaag, links en rechts"/>
+ <joystick_zoom name="zoom" tool_tip="Zoom camera naar focus"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_color_picker.xml b/indra/newview/skins/default/xui/nl/floater_color_picker.xml
index 25294e17e2..a357e874f7 100644
--- a/indra/newview/skins/default/xui/nl/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/nl/floater_color_picker.xml
@@ -26,6 +26,6 @@
</text>
<text name="(Drag below to save.)">
(Sleep naar beneden
- om op te slaan.)
+ om op te slaan)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml
index 24da91c081..5957018144 100755
--- a/indra/newview/skins/default/xui/pl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="move floater" title="">
- <string name="rotate_tooltip">
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
Obracaj kamerę wokół obiektu
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Najedź kamerą w kierunku obiektu
- </string>
- <string name="move_tooltip">
+ </floater.string>
+ <floater.string name="move_tooltip">
Poruszaj kamerą w dół/górę oraz w prawo/lewo
- </string>
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w dół/górę oraz w prawo/lewo"/>
+ <joystick_zoom name="zoom" tool_tip="Najedź kamerą w kierunku obiektu"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_color_picker.xml b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
index a380423cdf..d6ffe1837a 100755
--- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
@@ -26,6 +26,6 @@
Obecny Kolor:
</text>
<text name="(Drag below to save.)">
- (Przeciągnij tutaj.)
+ (Przeciągnij tutaj)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml
index 4dc6997606..b61e261148 100644
--- a/indra/newview/skins/default/xui/pt/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pt/floater_camera.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move floater" title="">
- <string name="rotate_tooltip">
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
Girar a Câmera ao redor do Foco
- </string>
- <string name="zoom_tooltip">
+ </floater.string>
+ <floater.string name="zoom_tooltip">
Aproximar a Câmera in direção ao Foco
- </string>
- <string name="move_tooltip">
- Mover a Câmera Para Cima e Para Baixo, Para a Esquerda e Para a Direita
- </string>
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
+ </floater.string>
+ <panel name="controls">
+ <joystick_track name="cam_track_stick" tool_tip="Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita"/>
+ <joystick_zoom name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_color_picker.xml b/indra/newview/skins/default/xui/pt/floater_color_picker.xml
index 95dd53ccd4..76da972b5d 100644
--- a/indra/newview/skins/default/xui/pt/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pt/floater_color_picker.xml
@@ -27,6 +27,6 @@
</text>
<text name="(Drag below to save.)">
(Arraste abaixo
- para salvar.)
+ para salvar)
</text>
</floater>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 4ce7c953ed..a670db699e 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -249,12 +249,10 @@ class WindowsManifest(ViewerManifest):
# Vivox runtimes
if self.prefix(src="vivox-runtime/i686-win32", dst=""):
self.path("SLVoice.exe")
- self.path("libsndfile-1.dll")
- self.path("zlib1.dll")
+ self.path("alut.dll")
self.path("vivoxsdk.dll")
- self.path("vivoxplatform.dll")
self.path("ortp.dll")
- self.path("vivoxoal.dll")
+ self.path("wrap_oal.dll")
self.end_prefix()
# pull in the crash logger and updater from other projects
@@ -466,11 +464,10 @@ class DarwinManifest(ViewerManifest):
self.path("zh-Hans.lproj")
# SLVoice and vivox lols
- self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib")
- self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib")
+ self.path("vivox-runtime/universal-darwin/libalut.dylib", "libalut.dylib")
+ self.path("vivox-runtime/universal-darwin/libopenal.dylib", "libopenal.dylib")
self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")
self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib")
- self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib")
self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")
# need to get the kdu dll from any of the build directories as well
@@ -543,7 +540,7 @@ class DarwinManifest(ViewerManifest):
# make sure we don't have stale files laying about
self.remove(sparsename, finalname)
- self.run_command('hdiutil create "%(sparse)s" -volname "%(vol)s" -fs HFS+ -type SPARSE -megabytes 400 -layout SPUD' % {
+ self.run_command('hdiutil create "%(sparse)s" -volname "%(vol)s" -fs HFS+ -type SPARSE -megabytes 500 -layout SPUD' % {
'sparse':sparsename,
'vol':volname})
@@ -723,10 +720,7 @@ class Linux_i686Manifest(LinuxManifest):
self.end_prefix()
if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
self.path("libortp.so")
- self.path("libsndfile.so.1")
- self.path("libvivoxoal.so.1")
self.path("libvivoxsdk.so")
- self.path("libvivoxplatform.so")
self.end_prefix("lib")
class Linux_x86_64Manifest(LinuxManifest):