Merge with tip of http://hg.secondlife.com/viewer-development (rev 14798)
commit
aac70bccad
1
.hgtags
1
.hgtags
|
|
@ -70,3 +70,4 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
|
|||
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
|
||||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
|
||||
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
|
||||
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ Aleric Inglewood
|
|||
VWR-24320
|
||||
VWR-24321
|
||||
VWR-24354
|
||||
VWR-24366
|
||||
VWR-24519
|
||||
SNOW-84
|
||||
SNOW-477
|
||||
|
|
@ -155,6 +156,7 @@ Ann Congrejo
|
|||
CT-193
|
||||
Ardy Lay
|
||||
VWR-19499
|
||||
VWR-24917
|
||||
Argent Stonecutter
|
||||
VWR-68
|
||||
Armin Weatherwax
|
||||
|
|
@ -189,6 +191,7 @@ Blakar Ogre
|
|||
blino Nakamura
|
||||
VWR-17
|
||||
Boroondas Gupte
|
||||
OPEN-29
|
||||
SNOW-278
|
||||
SNOW-503
|
||||
SNOW-510
|
||||
|
|
@ -391,10 +394,19 @@ Jonathan Yap
|
|||
STORM-812
|
||||
STORM-829
|
||||
STORM-844
|
||||
STORM-953
|
||||
STORM-954
|
||||
STORM-960
|
||||
STORM-869
|
||||
STORM-974
|
||||
STORM-975
|
||||
STORM-977
|
||||
STORM-979
|
||||
STORM-980
|
||||
STORM-1040
|
||||
VWR-17801
|
||||
VWR-24347
|
||||
STORM-975
|
||||
STORM-990
|
||||
Kage Pixel
|
||||
VWR-11
|
||||
Ken March
|
||||
|
|
@ -781,6 +793,7 @@ Twisted Laws
|
|||
STORM-467
|
||||
STORM-844
|
||||
STORM-643
|
||||
STORM-954
|
||||
Vadim Bigbear
|
||||
VWR-2681
|
||||
Vector Hastings
|
||||
|
|
@ -821,6 +834,7 @@ WolfPup Lowenhar
|
|||
STORM-102
|
||||
STORM-103
|
||||
STORM-143
|
||||
STORM-236
|
||||
STORM-255
|
||||
STORM-256
|
||||
STORM-288
|
||||
|
|
|
|||
|
|
@ -72,9 +72,9 @@ if (VIEWER)
|
|||
add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
|
||||
|
||||
# llplugin testbed code (is this the right way to include it?)
|
||||
if (NOT LINUX)
|
||||
if (LL_TESTS AND NOT LINUX)
|
||||
add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest)
|
||||
endif (NOT LINUX)
|
||||
endif (LL_TESTS AND NOT LINUX)
|
||||
|
||||
if (LINUX)
|
||||
add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)
|
||||
|
|
|
|||
|
|
@ -8,9 +8,10 @@ set(GOOGLEMOCK_INCLUDE_DIRS
|
|||
${LIBS_PREBUILT_DIR}/include)
|
||||
|
||||
if (LINUX)
|
||||
# VWR-24366: gmock is underlinked, it needs gtest.
|
||||
set(GOOGLEMOCK_LIBRARIES
|
||||
gmock
|
||||
gtest)
|
||||
gmock -Wl,--no-as-needed
|
||||
gtest -Wl,--as-needed)
|
||||
elseif(WINDOWS)
|
||||
set(GOOGLEMOCK_LIBRARIES
|
||||
gmock)
|
||||
|
|
|
|||
|
|
@ -57,11 +57,6 @@ INCLUDE(GoogleMock)
|
|||
${CMAKE_SOURCE_DIR}/test/test.h
|
||||
)
|
||||
|
||||
# Use the default flags
|
||||
if (LINUX)
|
||||
SET(CMAKE_EXE_LINKER_FLAGS "")
|
||||
endif (LINUX)
|
||||
|
||||
# start the source test executable definitions
|
||||
SET(${project}_TEST_OUTPUT "")
|
||||
FOREACH (source ${sources})
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file run_build_test.py
|
||||
@author Nat Goodspeed
|
||||
|
|
|
|||
|
|
@ -1,4 +1,28 @@
|
|||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file start-client.py
|
||||
|
||||
$LicenseInfo:firstyear=2010&license=viewerlgpl$
|
||||
Second Life Viewer Source Code
|
||||
Copyright (C) 2010-2011, Linden Research, Inc.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation;
|
||||
version 2.1 of the License only.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
import sys, getopt
|
||||
import os
|
||||
import llstart
|
||||
|
|
|
|||
|
|
@ -1,29 +1,30 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# @file develop.py
|
||||
# @authors Bryan O'Sullivan, Mark Palange, Aaron Brashears
|
||||
# @brief Fire and forget script to appropriately configure cmake for SL.
|
||||
#
|
||||
# $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
# Second Life Viewer Source Code
|
||||
# Copyright (C) 2010, Linden Research, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation;
|
||||
# version 2.1 of the License only.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
# $/LicenseInfo$
|
||||
"""\
|
||||
@file develop.py
|
||||
@authors Bryan O'Sullivan, Mark Palange, Aaron Brashears
|
||||
@brief Fire and forget script to appropriately configure cmake for SL.
|
||||
|
||||
$LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
Second Life Viewer Source Code
|
||||
Copyright (C) 2007-2011, Linden Research, Inc.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation;
|
||||
version 2.1 of the License only.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
|
||||
|
||||
import errno
|
||||
|
|
|
|||
|
|
@ -1,4 +1,28 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file llperformance.py
|
||||
|
||||
$LicenseInfo:firstyear=2010&license=viewerlgpl$
|
||||
Second Life Viewer Source Code
|
||||
Copyright (C) 2010-2011, Linden Research, Inc.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation;
|
||||
version 2.1 of the License only.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
|
||||
# ------------------------------------------------
|
||||
# Sim metrics utility functions.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
"""@file llversion.py
|
||||
@brief Utility for parsing llcommon/llversion${server}.h
|
||||
for the version string and channel string
|
||||
Utility that parses hg or svn info for branch and revision
|
||||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file llversion.py
|
||||
@brief Parses llcommon/llversionserver.h and llcommon/llversionviewer.h
|
||||
for the version string and channel string.
|
||||
Parses hg info for branch and revision.
|
||||
|
||||
$LicenseInfo:firstyear=2006&license=mit$
|
||||
|
||||
|
|
@ -27,7 +29,7 @@ THE SOFTWARE.
|
|||
$/LicenseInfo$
|
||||
"""
|
||||
|
||||
import re, sys, os, commands
|
||||
import re, sys, os, subprocess
|
||||
|
||||
# Methods for gathering version information from
|
||||
# llversionviewer.h and llversionserver.h
|
||||
|
|
@ -73,29 +75,13 @@ def get_viewer_channel():
|
|||
def get_server_channel():
|
||||
return get_channel('server')
|
||||
|
||||
# Methods for gathering subversion information
|
||||
def get_svn_status_matching(regular_expression):
|
||||
# Get the subversion info from the working source tree
|
||||
status, output = commands.getstatusoutput('svn info %s' % get_src_root())
|
||||
m = regular_expression.search(output)
|
||||
if not m:
|
||||
print >> sys.stderr, "Failed to parse svn info output, result follows:"
|
||||
print >> sys.stderr, output
|
||||
raise Exception, "No matching svn status in "+src_root
|
||||
return m.group(1)
|
||||
|
||||
def get_svn_branch():
|
||||
branch_re = re.compile('URL: (\S+)')
|
||||
return get_svn_status_matching(branch_re)
|
||||
|
||||
def get_svn_revision():
|
||||
last_rev_re = re.compile('Last Changed Rev: (\d+)')
|
||||
return get_svn_status_matching(last_rev_re)
|
||||
|
||||
# Methods for gathering hg information
|
||||
def get_hg_repo():
|
||||
status, output = commands.getstatusoutput('hg showconfig paths.default')
|
||||
child = subprocess.Popen(["hg","showconfig","paths.default"], stdout=subprocess.PIPE)
|
||||
output, error = child.communicate()
|
||||
status = child.returncode
|
||||
if status:
|
||||
print >> sys.stderr, output
|
||||
print >> sys.stderr, error
|
||||
sys.exit(1)
|
||||
if not output:
|
||||
print >> sys.stderr, 'ERROR: cannot find repo we cloned from'
|
||||
|
|
@ -103,24 +89,19 @@ def get_hg_repo():
|
|||
return output
|
||||
|
||||
def get_hg_changeset():
|
||||
# The right thing to do:
|
||||
# status, output = commands.getstatusoutput('hg id -i')
|
||||
# if status:
|
||||
# print >> sys.stderr, output
|
||||
# sys.exit(1)
|
||||
|
||||
# The temporary hack:
|
||||
status, output = commands.getstatusoutput('hg parents --template "{rev}"')
|
||||
# The right thing to do would be to use the *global* revision id:
|
||||
# "hg id -i"
|
||||
# For the moment though, we use the parent revision:
|
||||
child = subprocess.Popen(["hg","parents","--template","{rev}"], stdout=subprocess.PIPE)
|
||||
output, error = child.communicate()
|
||||
status = child.returncode
|
||||
if status:
|
||||
print >> sys.stderr, output
|
||||
print >> sys.stderr, error
|
||||
sys.exit(1)
|
||||
lines = output.splitlines()
|
||||
if len(lines) > 1:
|
||||
print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines)
|
||||
return lines[0]
|
||||
|
||||
def using_svn():
|
||||
return os.path.isdir(os.path.join(get_src_root(), '.svn'))
|
||||
|
||||
def using_hg():
|
||||
return os.path.isdir(os.path.join(get_src_root(), '.hg'))
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file simperf_proc_interface.py
|
||||
@brief Utility to extract log messages from *.<pid>.llsd files containing performance statistics.
|
||||
|
|
|
|||
|
|
@ -1,28 +1,29 @@
|
|||
#!/usr/bin/env python
|
||||
# @file test_win32_manifest.py
|
||||
# @brief Test an assembly binding version and uniqueness in a windows dll or exe.
|
||||
#
|
||||
# $LicenseInfo:firstyear=2009&license=viewerlgpl$
|
||||
# Second Life Viewer Source Code
|
||||
# Copyright (C) 2010, Linden Research, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation;
|
||||
# version 2.1 of the License only.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
# $/LicenseInfo$
|
||||
"""\
|
||||
@file test_win32_manifest.py
|
||||
@brief Test an assembly binding version and uniqueness in a windows dll or exe.
|
||||
|
||||
$LicenseInfo:firstyear=2009&license=viewerlgpl$
|
||||
Second Life Viewer Source Code
|
||||
Copyright (C) 2009-2011, Linden Research, Inc.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation;
|
||||
version 2.1 of the License only.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
import sys, os
|
||||
import tempfile
|
||||
from xml.dom.minidom import parse
|
||||
|
|
|
|||
|
|
@ -90,14 +90,16 @@ void LLAvatarName::fromLLSD(const LLSD& sd)
|
|||
std::string LLAvatarName::getCompleteName() const
|
||||
{
|
||||
std::string name;
|
||||
if (!mUsername.empty())
|
||||
if (mUsername.empty() || mIsDisplayNameDefault)
|
||||
// If the display name feature is off
|
||||
// OR this particular display name is defaulted (i.e. based on user name),
|
||||
// then display only the easier to read instance of the person's name.
|
||||
{
|
||||
name = mDisplayName + " (" + mUsername + ")";
|
||||
name = mDisplayName;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ...display names are off, legacy name is in mDisplayName
|
||||
name = mDisplayName;
|
||||
name = mDisplayName + " (" + mUsername + ")";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@
|
|||
#define LL_LLVERSIONVIEWER_H
|
||||
|
||||
const S32 LL_VERSION_MAJOR = 2;
|
||||
const S32 LL_VERSION_MINOR = 7;
|
||||
const S32 LL_VERSION_PATCH = 0;
|
||||
const S32 LL_VERSION_MINOR = 5;
|
||||
const S32 LL_VERSION_PATCH = 2;
|
||||
const S32 LL_VERSION_BUILD = 0;
|
||||
|
||||
const char * const LL_CHANNEL = "Second Life Developer";
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ static const std::string PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] =
|
|||
"shopping",
|
||||
"stage",
|
||||
"other",
|
||||
"rental"
|
||||
};
|
||||
static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
|
||||
{
|
||||
|
|
@ -89,6 +90,7 @@ static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
|
|||
"Shopping",
|
||||
"Stage",
|
||||
"Other",
|
||||
"Rental",
|
||||
"Any", // valid string for parcel searches
|
||||
};
|
||||
|
||||
|
|
@ -188,8 +190,6 @@ void LLParcel::init(const LLUUID &owner_id,
|
|||
mMediaID.setNull();
|
||||
mMediaAutoScale = 0;
|
||||
mMediaLoop = TRUE;
|
||||
mObscureMedia = 1;
|
||||
mObscureMusic = 1;
|
||||
mMediaWidth = 0;
|
||||
mMediaHeight = 0;
|
||||
setMediaCurrentURL(LLStringUtil::null);
|
||||
|
|
@ -685,8 +685,8 @@ void LLParcel::packMessage(LLSD& msg)
|
|||
msg["auto_scale"] = getMediaAutoScale();
|
||||
msg["media_loop"] = getMediaLoop();
|
||||
msg["media_current_url"] = getMediaCurrentURL();
|
||||
msg["obscure_media"] = getObscureMedia();
|
||||
msg["obscure_music"] = getObscureMusic();
|
||||
msg["obscure_media"] = false; // OBSOLETE - no longer used
|
||||
msg["obscure_music"] = false; // OBSOLETE - no longer used
|
||||
msg["media_id"] = getMediaID();
|
||||
msg["media_allow_navigate"] = getMediaAllowNavigate();
|
||||
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
|
||||
|
|
@ -750,16 +750,13 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
|
|||
msg->getS32("MediaData", "MediaWidth", mMediaWidth);
|
||||
msg->getS32("MediaData", "MediaHeight", mMediaHeight);
|
||||
msg->getU8 ( "MediaData", "MediaLoop", mMediaLoop );
|
||||
msg->getU8 ( "MediaData", "ObscureMedia", mObscureMedia );
|
||||
msg->getU8 ( "MediaData", "ObscureMusic", mObscureMusic );
|
||||
// the ObscureMedia and ObscureMusic flags previously set here are no longer used
|
||||
}
|
||||
else
|
||||
{
|
||||
setMediaType(std::string("video/vnd.secondlife.qt.legacy"));
|
||||
setMediaDesc(std::string("No Description available without Server Upgrade"));
|
||||
mMediaLoop = true;
|
||||
mObscureMedia = true;
|
||||
mObscureMusic = true;
|
||||
}
|
||||
|
||||
if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
|
||||
|
|
@ -1225,8 +1222,6 @@ void LLParcel::clearParcel()
|
|||
setMediaDesc(LLStringUtil::null);
|
||||
setMediaAutoScale(0);
|
||||
setMediaLoop(TRUE);
|
||||
mObscureMedia = 1;
|
||||
mObscureMusic = 1;
|
||||
mMediaWidth = 0;
|
||||
mMediaHeight = 0;
|
||||
setMediaCurrentURL(LLStringUtil::null);
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ public:
|
|||
C_SHOPPING,
|
||||
C_STAGE,
|
||||
C_OTHER,
|
||||
C_RENTAL,
|
||||
C_COUNT,
|
||||
C_ANY = -1 // only useful in queries
|
||||
};
|
||||
|
|
@ -238,8 +239,6 @@ public:
|
|||
void setMediaID(const LLUUID& id) { mMediaID = id; }
|
||||
void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
|
||||
void setMediaLoop (U8 loop) { mMediaLoop = loop; }
|
||||
void setObscureMedia( U8 flagIn ) { mObscureMedia = flagIn; }
|
||||
void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
|
||||
void setMediaWidth(S32 width);
|
||||
void setMediaHeight(S32 height);
|
||||
void setMediaCurrentURL(const std::string& url);
|
||||
|
|
@ -346,8 +345,6 @@ public:
|
|||
U8 getMediaAutoScale() const { return mMediaAutoScale; }
|
||||
U8 getMediaLoop() const { return mMediaLoop; }
|
||||
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
|
||||
U8 getObscureMedia() const { return mObscureMedia; }
|
||||
U8 getObscureMusic() const { return mObscureMusic; }
|
||||
U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
|
||||
LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
|
||||
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
|
||||
|
|
@ -636,8 +633,6 @@ protected:
|
|||
U8 mMediaAutoScale;
|
||||
U8 mMediaLoop;
|
||||
std::string mMediaCurrentURL;
|
||||
U8 mObscureMedia;
|
||||
U8 mObscureMusic;
|
||||
LLUUID mMediaID;
|
||||
U8 mMediaURLFilterEnable;
|
||||
LLSD mMediaURLFilterList;
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ namespace tut
|
|||
void host_object::test<9>()
|
||||
{
|
||||
// skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\"");
|
||||
std::string hostStr = "linux.org";
|
||||
std::string hostStr = "lindenlab.com";
|
||||
LLHost host;
|
||||
host.setHostByName(hostStr);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file test_llsdmessage_peer.py
|
||||
@author Nat Goodspeed
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
"""\
|
||||
@file testrunner.py
|
||||
@author Nat Goodspeed
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ U32 LLVertexBuffer::sSetCount = 0;
|
|||
S32 LLVertexBuffer::sCount = 0;
|
||||
S32 LLVertexBuffer::sGLCount = 0;
|
||||
S32 LLVertexBuffer::sMappedCount = 0;
|
||||
BOOL LLVertexBuffer::sDisableVBOMapping = FALSE ;
|
||||
BOOL LLVertexBuffer::sEnableVBOs = TRUE;
|
||||
U32 LLVertexBuffer::sGLRenderBuffer = 0;
|
||||
U32 LLVertexBuffer::sGLRenderIndices = 0;
|
||||
|
|
@ -251,6 +252,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
|
|||
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
|
||||
{
|
||||
llassert(mRequestedNumIndices >= 0);
|
||||
|
||||
if (indices_offset >= (U32) mRequestedNumIndices ||
|
||||
indices_offset + count > (U32) mRequestedNumIndices)
|
||||
{
|
||||
|
|
@ -282,6 +284,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
|
|||
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
|
||||
{
|
||||
llassert(mRequestedNumVerts >= 0);
|
||||
|
||||
if (first >= (U32) mRequestedNumVerts ||
|
||||
first + count > (U32) mRequestedNumVerts)
|
||||
{
|
||||
|
|
@ -305,9 +308,21 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
|
|||
}
|
||||
|
||||
//static
|
||||
void LLVertexBuffer::initClass(bool use_vbo)
|
||||
void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
|
||||
{
|
||||
sEnableVBOs = use_vbo;
|
||||
sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject ;
|
||||
if(sEnableVBOs)
|
||||
{
|
||||
//llassert_always(glBindBufferARB) ; //double check the extention for VBO is loaded.
|
||||
|
||||
llinfos << "VBO is enabled." << llendl ;
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "VBO is disabled." << llendl ;
|
||||
}
|
||||
|
||||
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
|
||||
LLGLNamePool::registerPool(&sDynamicVBOPool);
|
||||
LLGLNamePool::registerPool(&sDynamicIBOPool);
|
||||
LLGLNamePool::registerPool(&sStreamVBOPool);
|
||||
|
|
@ -364,7 +379,9 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
|
|||
mGLBuffer(0),
|
||||
mGLIndices(0),
|
||||
mMappedData(NULL),
|
||||
mMappedIndexData(NULL), mLocked(FALSE),
|
||||
mMappedIndexData(NULL),
|
||||
mVertexLocked(FALSE),
|
||||
mIndexLocked(FALSE),
|
||||
mFinal(FALSE),
|
||||
mFilthy(FALSE),
|
||||
mEmpty(TRUE),
|
||||
|
|
@ -422,6 +439,8 @@ LLVertexBuffer::~LLVertexBuffer()
|
|||
destroyGLBuffer();
|
||||
destroyGLIndices();
|
||||
sCount--;
|
||||
|
||||
llassert_always(!mMappedData && !mMappedIndexData) ;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
@ -567,6 +586,8 @@ void LLVertexBuffer::destroyGLBuffer()
|
|||
{
|
||||
if (useVBOs())
|
||||
{
|
||||
freeClientBuffer() ;
|
||||
|
||||
if (mMappedData || mMappedIndexData)
|
||||
{
|
||||
llerrs << "Vertex buffer destroyed while mapped!" << llendl;
|
||||
|
|
@ -594,11 +615,13 @@ void LLVertexBuffer::destroyGLIndices()
|
|||
{
|
||||
if (useVBOs())
|
||||
{
|
||||
freeClientBuffer() ;
|
||||
|
||||
if (mMappedData || mMappedIndexData)
|
||||
{
|
||||
llerrs << "Vertex buffer destroyed while mapped." << llendl;
|
||||
}
|
||||
releaseIndices();
|
||||
releaseIndices();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -799,6 +822,7 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
|
|||
|
||||
if (mResized && useVBOs())
|
||||
{
|
||||
freeClientBuffer() ;
|
||||
setBuffer(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -822,36 +846,69 @@ BOOL LLVertexBuffer::useVBOs() const
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void LLVertexBuffer::freeClientBuffer()
|
||||
{
|
||||
if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData))
|
||||
{
|
||||
delete[] mMappedData ;
|
||||
delete[] mMappedIndexData ;
|
||||
mMappedData = NULL ;
|
||||
mMappedIndexData = NULL ;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVertexBuffer::allocateClientVertexBuffer()
|
||||
{
|
||||
if(!mMappedData)
|
||||
{
|
||||
U32 size = getSize() ;
|
||||
mMappedData = new U8[size];
|
||||
memset(mMappedData, 0, size);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVertexBuffer::allocateClientIndexBuffer()
|
||||
{
|
||||
if(!mMappedIndexData)
|
||||
{
|
||||
U32 size = getIndicesSize();
|
||||
mMappedIndexData = new U8[size];
|
||||
memset(mMappedIndexData, 0, size);
|
||||
}
|
||||
}
|
||||
|
||||
// Map for data access
|
||||
U8* LLVertexBuffer::mapBuffer(S32 access)
|
||||
U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
|
||||
{
|
||||
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
|
||||
if (mFinal)
|
||||
{
|
||||
llerrs << "LLVertexBuffer::mapBuffer() called on a finalized buffer." << llendl;
|
||||
llerrs << "LLVertexBuffer::mapVeretxBuffer() called on a finalized buffer." << llendl;
|
||||
}
|
||||
if (!useVBOs() && !mMappedData && !mMappedIndexData)
|
||||
{
|
||||
llerrs << "LLVertexBuffer::mapBuffer() called on unallocated buffer." << llendl;
|
||||
llerrs << "LLVertexBuffer::mapVertexBuffer() called on unallocated buffer." << llendl;
|
||||
}
|
||||
|
||||
if (!mLocked && useVBOs())
|
||||
if (!mVertexLocked && useVBOs())
|
||||
{
|
||||
{
|
||||
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
|
||||
setBuffer(0);
|
||||
mLocked = TRUE;
|
||||
setBuffer(0, type);
|
||||
mVertexLocked = TRUE;
|
||||
stop_glerror();
|
||||
mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
stop_glerror();
|
||||
}
|
||||
{
|
||||
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
|
||||
mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
if(sDisableVBOMapping)
|
||||
{
|
||||
allocateClientVertexBuffer() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
}
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
if (!mMappedData)
|
||||
{
|
||||
log_glerror();
|
||||
|
|
@ -862,80 +919,166 @@ U8* LLVertexBuffer::mapBuffer(S32 access)
|
|||
llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ;
|
||||
llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl;
|
||||
|
||||
//--------------------
|
||||
//print out more debug info before crash
|
||||
llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
|
||||
GLint size ;
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
|
||||
llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
|
||||
//--------------------
|
||||
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
if ((GLuint)buff != mGLBuffer)
|
||||
if(!sDisableVBOMapping)
|
||||
{
|
||||
llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
|
||||
//--------------------
|
||||
//print out more debug info before crash
|
||||
llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
|
||||
GLint size ;
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
|
||||
llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
|
||||
//--------------------
|
||||
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
if ((GLuint)buff != mGLBuffer)
|
||||
{
|
||||
llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
|
||||
}
|
||||
|
||||
|
||||
llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
|
||||
}
|
||||
|
||||
|
||||
llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
|
||||
}
|
||||
|
||||
if (!mMappedIndexData)
|
||||
{
|
||||
log_glerror();
|
||||
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
if ((GLuint)buff != mGLIndices)
|
||||
else
|
||||
{
|
||||
llerrs << "Invalid GL index buffer bound: " << buff << llendl;
|
||||
llerrs << "memory allocation for vertex data failed." << llendl ;
|
||||
}
|
||||
|
||||
llerrs << "glMapBuffer returned NULL (no index data)" << llendl;
|
||||
}
|
||||
|
||||
sMappedCount++;
|
||||
}
|
||||
|
||||
return mMappedData;
|
||||
}
|
||||
|
||||
void LLVertexBuffer::unmapBuffer()
|
||||
U8* LLVertexBuffer::mapIndexBuffer(S32 access)
|
||||
{
|
||||
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
|
||||
if (mFinal)
|
||||
{
|
||||
llerrs << "LLVertexBuffer::mapIndexBuffer() called on a finalized buffer." << llendl;
|
||||
}
|
||||
if (!useVBOs() && !mMappedData && !mMappedIndexData)
|
||||
{
|
||||
llerrs << "LLVertexBuffer::mapIndexBuffer() called on unallocated buffer." << llendl;
|
||||
}
|
||||
|
||||
if (!mIndexLocked && useVBOs())
|
||||
{
|
||||
{
|
||||
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
|
||||
|
||||
setBuffer(0, TYPE_INDEX);
|
||||
mIndexLocked = TRUE;
|
||||
stop_glerror();
|
||||
|
||||
if(sDisableVBOMapping)
|
||||
{
|
||||
allocateClientIndexBuffer() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
}
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
if (!mMappedIndexData)
|
||||
{
|
||||
log_glerror();
|
||||
|
||||
if(!sDisableVBOMapping)
|
||||
{
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
if ((GLuint)buff != mGLIndices)
|
||||
{
|
||||
llerrs << "Invalid GL index buffer bound: " << buff << llendl;
|
||||
}
|
||||
|
||||
llerrs << "glMapBuffer returned NULL (no index data)" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "memory allocation for Index data failed. " << llendl ;
|
||||
}
|
||||
}
|
||||
|
||||
sMappedCount++;
|
||||
}
|
||||
|
||||
return mMappedIndexData ;
|
||||
}
|
||||
|
||||
void LLVertexBuffer::unmapBuffer(S32 type)
|
||||
{
|
||||
LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER);
|
||||
if (mMappedData || mMappedIndexData)
|
||||
if (!useVBOs())
|
||||
{
|
||||
if (useVBOs() && mLocked)
|
||||
return ; //nothing to unmap
|
||||
}
|
||||
|
||||
bool updated_all = false ;
|
||||
if (mMappedData && mVertexLocked && type != TYPE_INDEX)
|
||||
{
|
||||
updated_all = (mIndexLocked && type < 0) ; //both vertex and index buffers done updating
|
||||
|
||||
if(sDisableVBOMapping)
|
||||
{
|
||||
stop_glerror();
|
||||
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData);
|
||||
stop_glerror();
|
||||
}
|
||||
else
|
||||
{
|
||||
stop_glerror();
|
||||
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
|
||||
stop_glerror();
|
||||
|
||||
mMappedData = NULL;
|
||||
}
|
||||
|
||||
mVertexLocked = FALSE ;
|
||||
sMappedCount--;
|
||||
}
|
||||
|
||||
if(mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX))
|
||||
{
|
||||
if(sDisableVBOMapping)
|
||||
{
|
||||
stop_glerror();
|
||||
glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData);
|
||||
stop_glerror();
|
||||
}
|
||||
else
|
||||
{
|
||||
stop_glerror();
|
||||
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
|
||||
stop_glerror();
|
||||
|
||||
/*if (!sMapped)
|
||||
{
|
||||
llerrs << "Redundantly unmapped VBO!" << llendl;
|
||||
}
|
||||
sMapped = FALSE;*/
|
||||
sMappedCount--;
|
||||
mMappedIndexData = NULL ;
|
||||
}
|
||||
|
||||
if (mUsage == GL_STATIC_DRAW_ARB)
|
||||
{ //static draw buffers can only be mapped a single time
|
||||
//throw out client data (we won't be using it again)
|
||||
mEmpty = TRUE;
|
||||
mFinal = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEmpty = FALSE;
|
||||
}
|
||||
mIndexLocked = FALSE ;
|
||||
sMappedCount--;
|
||||
}
|
||||
|
||||
mMappedIndexData = NULL;
|
||||
mMappedData = NULL;
|
||||
|
||||
mLocked = FALSE;
|
||||
if(updated_all)
|
||||
{
|
||||
if(mUsage == GL_STATIC_DRAW_ARB)
|
||||
{
|
||||
//static draw buffers can only be mapped a single time
|
||||
//throw out client data (we won't be using it again)
|
||||
mEmpty = TRUE;
|
||||
mFinal = TRUE;
|
||||
|
||||
if(sDisableVBOMapping)
|
||||
{
|
||||
freeClientBuffer() ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mEmpty = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -949,15 +1092,16 @@ template <class T,S32 type> struct VertexBufferStrider
|
|||
strider_t& strider,
|
||||
S32 index)
|
||||
{
|
||||
if (vbo.mapBuffer() == NULL)
|
||||
{
|
||||
llwarns << "mapBuffer failed!" << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (type == LLVertexBuffer::TYPE_INDEX)
|
||||
{
|
||||
S32 stride = sizeof(T);
|
||||
|
||||
if (vbo.mapIndexBuffer() == NULL)
|
||||
{
|
||||
llwarns << "mapIndexBuffer failed!" << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
strider = (T*)(vbo.getMappedIndices() + index*stride);
|
||||
strider.setStride(0);
|
||||
return TRUE;
|
||||
|
|
@ -965,6 +1109,13 @@ template <class T,S32 type> struct VertexBufferStrider
|
|||
else if (vbo.hasDataType(type))
|
||||
{
|
||||
S32 stride = vbo.getStride();
|
||||
|
||||
if (vbo.mapVertexBuffer(type) == NULL)
|
||||
{
|
||||
llwarns << "mapVertexBuffer failed!" << llendl;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
strider = (T*)(vbo.getMappedData() + vbo.getOffset(type) + index*stride);
|
||||
strider.setStride(stride);
|
||||
return TRUE;
|
||||
|
|
@ -1045,7 +1196,7 @@ void LLVertexBuffer::setStride(S32 type, S32 new_stride)
|
|||
//----------------------------------------------------------------------------
|
||||
|
||||
// Set for rendering
|
||||
void LLVertexBuffer::setBuffer(U32 data_mask)
|
||||
void LLVertexBuffer::setBuffer(U32 data_mask, S32 type)
|
||||
{
|
||||
LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_BUFFER);
|
||||
//set up pointers if the data mask is different ...
|
||||
|
|
@ -1186,7 +1337,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
|
|||
{
|
||||
ll_fail("LLVertexBuffer::mapBuffer failed");
|
||||
}
|
||||
unmapBuffer();
|
||||
unmapBuffer(type);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ public:
|
|||
|
||||
static BOOL sUseStreamDraw;
|
||||
|
||||
static void initClass(bool use_vbo);
|
||||
static void initClass(bool use_vbo, bool no_vbo_mapping);
|
||||
static void cleanupClass();
|
||||
static void setupClientArrays(U32 data_mask);
|
||||
static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
|
||||
|
|
@ -139,19 +139,24 @@ protected:
|
|||
void updateNumVerts(S32 nverts);
|
||||
void updateNumIndices(S32 nindices);
|
||||
virtual BOOL useVBOs() const;
|
||||
void unmapBuffer();
|
||||
|
||||
void unmapBuffer(S32 type);
|
||||
void freeClientBuffer() ;
|
||||
void allocateClientVertexBuffer() ;
|
||||
void allocateClientIndexBuffer() ;
|
||||
|
||||
public:
|
||||
LLVertexBuffer(U32 typemask, S32 usage);
|
||||
|
||||
// map for data access
|
||||
U8* mapBuffer(S32 access = -1);
|
||||
U8* mapVertexBuffer(S32 type = -1, S32 access = -1);
|
||||
U8* mapIndexBuffer(S32 access = -1);
|
||||
|
||||
// set for rendering
|
||||
virtual void setBuffer(U32 data_mask); // calls setupVertexBuffer() if data_mask is not 0
|
||||
virtual void setBuffer(U32 data_mask, S32 type = -1); // calls setupVertexBuffer() if data_mask is not 0
|
||||
// allocate buffer
|
||||
void allocateBuffer(S32 nverts, S32 nindices, bool create);
|
||||
virtual void resizeBuffer(S32 newnverts, S32 newnindices);
|
||||
|
||||
|
||||
// Only call each getVertexPointer, etc, once before calling unmapBuffer()
|
||||
// call unmapBuffer() after calls to getXXXStrider() before any cals to setBuffer()
|
||||
// example:
|
||||
|
|
@ -170,7 +175,7 @@ public:
|
|||
bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0);
|
||||
|
||||
BOOL isEmpty() const { return mEmpty; }
|
||||
BOOL isLocked() const { return mLocked; }
|
||||
BOOL isLocked() const { return mVertexLocked || mIndexLocked; }
|
||||
S32 getNumVerts() const { return mNumVerts; }
|
||||
S32 getNumIndices() const { return mNumIndices; }
|
||||
S32 getRequestedVerts() const { return mRequestedNumVerts; }
|
||||
|
|
@ -209,13 +214,14 @@ protected:
|
|||
U32 mGLIndices; // GL IBO handle
|
||||
U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
|
||||
U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
|
||||
BOOL mLocked; // if TRUE, buffer is being or has been written to in client memory
|
||||
BOOL mVertexLocked; // if TRUE, vertex buffer is being or has been written to in client memory
|
||||
BOOL mIndexLocked; // if TRUE, index buffer is being or has been written to in client memory
|
||||
BOOL mFinal; // if TRUE, buffer can not be mapped again
|
||||
BOOL mFilthy; // if TRUE, entire buffer must be copied (used to prevent redundant dirty flags)
|
||||
BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
|
||||
S32 mOffsets[TYPE_MAX];
|
||||
BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
|
||||
BOOL mResized; // if TRUE, client buffer has been resized and GL buffer has not
|
||||
BOOL mDynamicSize; // if TRUE, buffer has been resized at least once (and should be padded)
|
||||
S32 mOffsets[TYPE_MAX];
|
||||
|
||||
class DirtyRegion
|
||||
{
|
||||
|
|
@ -240,13 +246,14 @@ public:
|
|||
static std::vector<U32> sDeleteList;
|
||||
typedef std::list<LLVertexBuffer*> buffer_list_t;
|
||||
|
||||
static BOOL sDisableVBOMapping; //disable glMapBufferARB
|
||||
static BOOL sEnableVBOs;
|
||||
static BOOL sVBOActive;
|
||||
static BOOL sIBOActive;
|
||||
static S32 sTypeOffsets[TYPE_MAX];
|
||||
static U32 sGLMode[LLRender::NUM_MODES];
|
||||
static U32 sGLRenderBuffer;
|
||||
static U32 sGLRenderIndices;
|
||||
static BOOL sVBOActive;
|
||||
static BOOL sIBOActive;
|
||||
static U32 sGLRenderIndices;
|
||||
static U32 sLastMask;
|
||||
static U32 sAllocatedBytes;
|
||||
static U32 sBindCount;
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ void LLComboBox::setValue(const LLSD& value)
|
|||
LLScrollListItem* item = mList->getFirstSelected();
|
||||
if (item)
|
||||
{
|
||||
setLabel(getSelectedItemLabel());
|
||||
updateLabel();
|
||||
}
|
||||
mLastSelectedIndex = mList->getFirstSelectedIndex();
|
||||
}
|
||||
|
|
@ -384,6 +384,23 @@ void LLComboBox::setLabel(const LLStringExplicit& name)
|
|||
}
|
||||
}
|
||||
|
||||
void LLComboBox::updateLabel()
|
||||
{
|
||||
// Update the combo editor with the selected
|
||||
// item label.
|
||||
if (mTextEntry)
|
||||
{
|
||||
mTextEntry->setText(getSelectedItemLabel());
|
||||
mTextEntry->setTentative(FALSE);
|
||||
}
|
||||
|
||||
// If combo box doesn't allow text entry update
|
||||
// the combo button label.
|
||||
if (!mAllowTextEntry)
|
||||
{
|
||||
mButton->setLabel(getSelectedItemLabel());
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLComboBox::remove(const std::string& name)
|
||||
{
|
||||
|
|
@ -701,13 +718,13 @@ void LLComboBox::onItemSelected(const LLSD& data)
|
|||
mLastSelectedIndex = getCurrentIndex();
|
||||
if (mLastSelectedIndex != -1)
|
||||
{
|
||||
setLabel(getSelectedItemLabel());
|
||||
updateLabel();
|
||||
|
||||
if (mAllowTextEntry)
|
||||
{
|
||||
gFocusMgr.setKeyboardFocus(mTextEntry);
|
||||
mTextEntry->selectAll();
|
||||
}
|
||||
{
|
||||
gFocusMgr.setKeyboardFocus(mTextEntry);
|
||||
mTextEntry->selectAll();
|
||||
}
|
||||
}
|
||||
// hiding the list reasserts the old value stored in the text editor/dropdown button
|
||||
hideList();
|
||||
|
|
|
|||
|
|
@ -148,6 +148,9 @@ public:
|
|||
// This is probably a UI abuse.
|
||||
void setLabel(const LLStringExplicit& name);
|
||||
|
||||
// Updates the combobox label to match the selected list item.
|
||||
void updateLabel();
|
||||
|
||||
BOOL remove(const std::string& name); // remove item "name", return TRUE if found and removed
|
||||
|
||||
BOOL setCurrentByIndex( S32 index );
|
||||
|
|
|
|||
|
|
@ -1,359 +1,361 @@
|
|||
/**
|
||||
* @file lldockcontrol.cpp
|
||||
* @brief Creates a panel of a specific kind for a toast
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#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) :
|
||||
mDockWidget(dockWidget),
|
||||
mDockableFloater(dockableFloater),
|
||||
mDockTongue(dockTongue),
|
||||
mDockTongueX(0),
|
||||
mDockTongueY(0)
|
||||
{
|
||||
mDockAt = dockAt;
|
||||
|
||||
if (dockableFloater->isDocked())
|
||||
{
|
||||
on();
|
||||
}
|
||||
else
|
||||
{
|
||||
off();
|
||||
}
|
||||
|
||||
if (!(get_allowed_rect_callback))
|
||||
{
|
||||
mGetAllowedRectCallback = boost::bind(&LLDockControl::getAllowedRect, this, _1);
|
||||
}
|
||||
else
|
||||
{
|
||||
mGetAllowedRectCallback = get_allowed_rect_callback;
|
||||
}
|
||||
|
||||
if (dockWidget != NULL)
|
||||
{
|
||||
repositionDockable();
|
||||
}
|
||||
|
||||
if (mDockWidget != NULL)
|
||||
{
|
||||
mDockWidgetVisible = isDockVisible();
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockWidgetVisible = false;
|
||||
}
|
||||
}
|
||||
|
||||
LLDockControl::~LLDockControl()
|
||||
{
|
||||
}
|
||||
|
||||
void LLDockControl::setDock(LLView* dockWidget)
|
||||
{
|
||||
mDockWidget = dockWidget;
|
||||
if (mDockWidget != NULL)
|
||||
{
|
||||
repositionDockable();
|
||||
mDockWidgetVisible = isDockVisible();
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockWidgetVisible = false;
|
||||
}
|
||||
}
|
||||
|
||||
void LLDockControl::getAllowedRect(LLRect& rect)
|
||||
{
|
||||
rect = mDockableFloater->getRootView()->getRect();
|
||||
}
|
||||
|
||||
void LLDockControl::repositionDockable()
|
||||
{
|
||||
LLRect dockRect = mDockWidget->calcScreenRect();
|
||||
LLRect rootRect;
|
||||
mGetAllowedRectCallback(rootRect);
|
||||
|
||||
// recalculate dockable position if dock position changed, dock visibility changed,
|
||||
// root view rect changed or recalculation is forced
|
||||
if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible()
|
||||
|| mRootRect != rootRect || mRecalculateDocablePosition)
|
||||
{
|
||||
// undock dockable and off() if dock not visible
|
||||
if (!isDockVisible())
|
||||
{
|
||||
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
|
||||
{
|
||||
if(mEnabled)
|
||||
{
|
||||
moveDockable();
|
||||
}
|
||||
LLDockableFloater* dockable_floater =
|
||||
dynamic_cast<LLDockableFloater*> (mDockableFloater);
|
||||
if(dockable_floater != NULL)
|
||||
{
|
||||
dockable_floater->onDockShown();
|
||||
}
|
||||
}
|
||||
|
||||
mPrevDockRect = dockRect;
|
||||
mRootRect = rootRect;
|
||||
mRecalculateDocablePosition = false;
|
||||
mDockWidgetVisible = isDockVisible();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLDockControl::isDockVisible()
|
||||
{
|
||||
bool res = true;
|
||||
|
||||
if (mDockWidget != NULL)
|
||||
{
|
||||
//we should check all hierarchy
|
||||
res = mDockWidget->isInVisibleChain();
|
||||
if (res)
|
||||
{
|
||||
LLRect dockRect = mDockWidget->calcScreenRect();
|
||||
|
||||
switch (mDockAt)
|
||||
{
|
||||
case LEFT: // to keep compiler happy
|
||||
break;
|
||||
case BOTTOM:
|
||||
case TOP:
|
||||
{
|
||||
// check is dock inside parent rect
|
||||
LLRect dockParentRect =
|
||||
mDockWidget->getParent()->calcScreenRect();
|
||||
if (dockRect.mRight <= dockParentRect.mLeft
|
||||
|| dockRect.mLeft >= dockParentRect.mRight)
|
||||
{
|
||||
res = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void LLDockControl::moveDockable()
|
||||
{
|
||||
// calculate new dockable position
|
||||
LLRect dockRect = mDockWidget->calcScreenRect();
|
||||
LLRect rootRect;
|
||||
mGetAllowedRectCallback(rootRect);
|
||||
|
||||
bool use_tongue = false;
|
||||
LLDockableFloater* dockable_floater =
|
||||
dynamic_cast<LLDockableFloater*> (mDockableFloater);
|
||||
if (dockable_floater != NULL)
|
||||
{
|
||||
use_tongue = dockable_floater->getUseTongue();
|
||||
}
|
||||
|
||||
LLRect dockableRect = mDockableFloater->calcScreenRect();
|
||||
S32 x = 0;
|
||||
S32 y = 0;
|
||||
LLRect dockParentRect;
|
||||
switch (mDockAt)
|
||||
{
|
||||
case LEFT:
|
||||
x = dockRect.mLeft;
|
||||
y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
|
||||
// check is dockable inside root view rect
|
||||
if (x < rootRect.mLeft)
|
||||
{
|
||||
x = rootRect.mLeft;
|
||||
}
|
||||
if (x + dockableRect.getWidth() > rootRect.mRight)
|
||||
{
|
||||
x = rootRect.mRight - dockableRect.getWidth();
|
||||
}
|
||||
|
||||
mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
|
||||
|
||||
mDockTongueY = dockRect.mTop;
|
||||
break;
|
||||
|
||||
case TOP:
|
||||
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
|
||||
y = dockRect.mTop + dockableRect.getHeight();
|
||||
// unique docking used with dock tongue, so add tongue height to the Y coordinate
|
||||
if (use_tongue)
|
||||
{
|
||||
y += mDockTongue->getHeight();
|
||||
|
||||
if ( y > rootRect.mTop)
|
||||
{
|
||||
y = rootRect.mTop;
|
||||
}
|
||||
}
|
||||
|
||||
// check is dockable inside root view rect
|
||||
if (x < rootRect.mLeft)
|
||||
{
|
||||
x = rootRect.mLeft;
|
||||
}
|
||||
if (x + dockableRect.getWidth() > rootRect.mRight)
|
||||
{
|
||||
x = rootRect.mRight - dockableRect.getWidth();
|
||||
}
|
||||
|
||||
|
||||
// calculate dock tongue position
|
||||
dockParentRect = mDockWidget->getParent()->calcScreenRect();
|
||||
if (dockRect.getCenterX() < dockParentRect.mLeft)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
else if (dockRect.getCenterX() > dockParentRect.mRight)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
mDockTongueY = dockRect.mTop;
|
||||
|
||||
break;
|
||||
case BOTTOM:
|
||||
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
|
||||
y = dockRect.mBottom;
|
||||
// unique docking used with dock tongue, so add tongue height to the Y coordinate
|
||||
if (use_tongue)
|
||||
{
|
||||
y -= mDockTongue->getHeight();
|
||||
}
|
||||
|
||||
// check is dockable inside root view rect
|
||||
if (x < rootRect.mLeft)
|
||||
{
|
||||
x = rootRect.mLeft;
|
||||
}
|
||||
if (x + dockableRect.getWidth() > rootRect.mRight)
|
||||
{
|
||||
x = rootRect.mRight - dockableRect.getWidth();
|
||||
}
|
||||
|
||||
// calculate dock tongue position
|
||||
dockParentRect = mDockWidget->getParent()->calcScreenRect();
|
||||
if (dockRect.getCenterX() < dockParentRect.mLeft)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
else if (dockRect.getCenterX() > dockParentRect.mRight)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
mDockTongueY = dockRect.mBottom - mDockTongue->getHeight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
|
||||
|
||||
// A floater should be shrunk so it doesn't cover a part of its docking tongue and
|
||||
// there is a space between a dockable floater and a control to which it is docked.
|
||||
if (use_tongue && dockableRect.getHeight() >= max_available_height)
|
||||
{
|
||||
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), max_available_height);
|
||||
mDockableFloater->reshape(dockableRect.getWidth(), dockableRect.getHeight());
|
||||
}
|
||||
else
|
||||
{
|
||||
// move dockable
|
||||
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
|
||||
dockableRect.getHeight());
|
||||
}
|
||||
LLRect localDocableParentRect;
|
||||
mDockableFloater->getParent()->screenRectToLocal(dockableRect,
|
||||
&localDocableParentRect);
|
||||
mDockableFloater->setRect(localDocableParentRect);
|
||||
|
||||
mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY,
|
||||
&mDockTongueX, &mDockTongueY);
|
||||
|
||||
}
|
||||
|
||||
void LLDockControl::on()
|
||||
{
|
||||
if (isDockVisible())
|
||||
{
|
||||
mEnabled = true;
|
||||
mRecalculateDocablePosition = true;
|
||||
}
|
||||
}
|
||||
|
||||
void LLDockControl::off()
|
||||
{
|
||||
mEnabled = false;
|
||||
}
|
||||
|
||||
void LLDockControl::forceRecalculatePosition()
|
||||
{
|
||||
mRecalculateDocablePosition = true;
|
||||
}
|
||||
|
||||
void LLDockControl::drawToungue()
|
||||
{
|
||||
bool use_tongue = false;
|
||||
LLDockableFloater* dockable_floater =
|
||||
dynamic_cast<LLDockableFloater*> (mDockableFloater);
|
||||
if (dockable_floater != NULL)
|
||||
{
|
||||
use_tongue = dockable_floater->getUseTongue();
|
||||
}
|
||||
|
||||
if (mEnabled && use_tongue)
|
||||
{
|
||||
mDockTongue->draw(mDockTongueX, mDockTongueY);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @file lldockcontrol.cpp
|
||||
* @brief Creates a panel of a specific kind for a toast
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#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) :
|
||||
mDockWidget(dockWidget),
|
||||
mDockableFloater(dockableFloater),
|
||||
mDockTongue(dockTongue),
|
||||
mDockTongueX(0),
|
||||
mDockTongueY(0)
|
||||
{
|
||||
mDockAt = dockAt;
|
||||
|
||||
if (dockableFloater->isDocked())
|
||||
{
|
||||
on();
|
||||
}
|
||||
else
|
||||
{
|
||||
off();
|
||||
}
|
||||
|
||||
if (!(get_allowed_rect_callback))
|
||||
{
|
||||
mGetAllowedRectCallback = boost::bind(&LLDockControl::getAllowedRect, this, _1);
|
||||
}
|
||||
else
|
||||
{
|
||||
mGetAllowedRectCallback = get_allowed_rect_callback;
|
||||
}
|
||||
|
||||
if (dockWidget != NULL)
|
||||
{
|
||||
repositionDockable();
|
||||
}
|
||||
|
||||
if (mDockWidget != NULL)
|
||||
{
|
||||
mDockWidgetVisible = isDockVisible();
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockWidgetVisible = false;
|
||||
}
|
||||
}
|
||||
|
||||
LLDockControl::~LLDockControl()
|
||||
{
|
||||
}
|
||||
|
||||
void LLDockControl::setDock(LLView* dockWidget)
|
||||
{
|
||||
mDockWidget = dockWidget;
|
||||
if (mDockWidget != NULL)
|
||||
{
|
||||
repositionDockable();
|
||||
mDockWidgetVisible = isDockVisible();
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockWidgetVisible = false;
|
||||
}
|
||||
}
|
||||
|
||||
void LLDockControl::getAllowedRect(LLRect& rect)
|
||||
{
|
||||
rect = mDockableFloater->getRootView()->getRect();
|
||||
}
|
||||
|
||||
void LLDockControl::repositionDockable()
|
||||
{
|
||||
LLRect dockRect = mDockWidget->calcScreenRect();
|
||||
LLRect rootRect;
|
||||
mGetAllowedRectCallback(rootRect);
|
||||
|
||||
// recalculate dockable position if dock position changed, dock visibility changed,
|
||||
// root view rect changed or recalculation is forced
|
||||
if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible()
|
||||
|| mRootRect != rootRect || mRecalculateDocablePosition)
|
||||
{
|
||||
// undock dockable and off() if dock not visible
|
||||
if (!isDockVisible())
|
||||
{
|
||||
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
|
||||
{
|
||||
if(mEnabled)
|
||||
{
|
||||
moveDockable();
|
||||
}
|
||||
LLDockableFloater* dockable_floater =
|
||||
dynamic_cast<LLDockableFloater*> (mDockableFloater);
|
||||
if(dockable_floater != NULL)
|
||||
{
|
||||
dockable_floater->onDockShown();
|
||||
}
|
||||
}
|
||||
|
||||
mPrevDockRect = dockRect;
|
||||
mRootRect = rootRect;
|
||||
mRecalculateDocablePosition = false;
|
||||
mDockWidgetVisible = isDockVisible();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLDockControl::isDockVisible()
|
||||
{
|
||||
bool res = true;
|
||||
|
||||
if (mDockWidget != NULL)
|
||||
{
|
||||
//we should check all hierarchy
|
||||
res = mDockWidget->isInVisibleChain();
|
||||
if (res)
|
||||
{
|
||||
LLRect dockRect = mDockWidget->calcScreenRect();
|
||||
|
||||
switch (mDockAt)
|
||||
{
|
||||
case LEFT: // to keep compiler happy
|
||||
break;
|
||||
case BOTTOM:
|
||||
case TOP:
|
||||
{
|
||||
// check is dock inside parent rect
|
||||
// assume that parent for all dockable flaoters
|
||||
// is the root view
|
||||
LLRect dockParentRect =
|
||||
mDockWidget->getRootView()->calcScreenRect();
|
||||
if (dockRect.mRight <= dockParentRect.mLeft
|
||||
|| dockRect.mLeft >= dockParentRect.mRight)
|
||||
{
|
||||
res = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void LLDockControl::moveDockable()
|
||||
{
|
||||
// calculate new dockable position
|
||||
LLRect dockRect = mDockWidget->calcScreenRect();
|
||||
LLRect rootRect;
|
||||
mGetAllowedRectCallback(rootRect);
|
||||
|
||||
bool use_tongue = false;
|
||||
LLDockableFloater* dockable_floater =
|
||||
dynamic_cast<LLDockableFloater*> (mDockableFloater);
|
||||
if (dockable_floater != NULL)
|
||||
{
|
||||
use_tongue = dockable_floater->getUseTongue();
|
||||
}
|
||||
|
||||
LLRect dockableRect = mDockableFloater->calcScreenRect();
|
||||
S32 x = 0;
|
||||
S32 y = 0;
|
||||
LLRect dockParentRect;
|
||||
switch (mDockAt)
|
||||
{
|
||||
case LEFT:
|
||||
x = dockRect.mLeft;
|
||||
y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
|
||||
// check is dockable inside root view rect
|
||||
if (x < rootRect.mLeft)
|
||||
{
|
||||
x = rootRect.mLeft;
|
||||
}
|
||||
if (x + dockableRect.getWidth() > rootRect.mRight)
|
||||
{
|
||||
x = rootRect.mRight - dockableRect.getWidth();
|
||||
}
|
||||
|
||||
mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
|
||||
|
||||
mDockTongueY = dockRect.mTop;
|
||||
break;
|
||||
|
||||
case TOP:
|
||||
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
|
||||
y = dockRect.mTop + dockableRect.getHeight();
|
||||
// unique docking used with dock tongue, so add tongue height to the Y coordinate
|
||||
if (use_tongue)
|
||||
{
|
||||
y += mDockTongue->getHeight();
|
||||
|
||||
if ( y > rootRect.mTop)
|
||||
{
|
||||
y = rootRect.mTop;
|
||||
}
|
||||
}
|
||||
|
||||
// check is dockable inside root view rect
|
||||
if (x < rootRect.mLeft)
|
||||
{
|
||||
x = rootRect.mLeft;
|
||||
}
|
||||
if (x + dockableRect.getWidth() > rootRect.mRight)
|
||||
{
|
||||
x = rootRect.mRight - dockableRect.getWidth();
|
||||
}
|
||||
|
||||
|
||||
// calculate dock tongue position
|
||||
dockParentRect = mDockWidget->getParent()->calcScreenRect();
|
||||
if (dockRect.getCenterX() < dockParentRect.mLeft)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
else if (dockRect.getCenterX() > dockParentRect.mRight)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
mDockTongueY = dockRect.mTop;
|
||||
|
||||
break;
|
||||
case BOTTOM:
|
||||
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
|
||||
y = dockRect.mBottom;
|
||||
// unique docking used with dock tongue, so add tongue height to the Y coordinate
|
||||
if (use_tongue)
|
||||
{
|
||||
y -= mDockTongue->getHeight();
|
||||
}
|
||||
|
||||
// check is dockable inside root view rect
|
||||
if (x < rootRect.mLeft)
|
||||
{
|
||||
x = rootRect.mLeft;
|
||||
}
|
||||
if (x + dockableRect.getWidth() > rootRect.mRight)
|
||||
{
|
||||
x = rootRect.mRight - dockableRect.getWidth();
|
||||
}
|
||||
|
||||
// calculate dock tongue position
|
||||
dockParentRect = mDockWidget->getParent()->calcScreenRect();
|
||||
if (dockRect.getCenterX() < dockParentRect.mLeft)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
else if (dockRect.getCenterX() > dockParentRect.mRight)
|
||||
{
|
||||
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
|
||||
}
|
||||
mDockTongueY = dockRect.mBottom - mDockTongue->getHeight();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
|
||||
|
||||
// A floater should be shrunk so it doesn't cover a part of its docking tongue and
|
||||
// there is a space between a dockable floater and a control to which it is docked.
|
||||
if (use_tongue && dockableRect.getHeight() >= max_available_height)
|
||||
{
|
||||
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), max_available_height);
|
||||
mDockableFloater->reshape(dockableRect.getWidth(), dockableRect.getHeight());
|
||||
}
|
||||
else
|
||||
{
|
||||
// move dockable
|
||||
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
|
||||
dockableRect.getHeight());
|
||||
}
|
||||
LLRect localDocableParentRect;
|
||||
mDockableFloater->getParent()->screenRectToLocal(dockableRect,
|
||||
&localDocableParentRect);
|
||||
mDockableFloater->setRect(localDocableParentRect);
|
||||
|
||||
mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY,
|
||||
&mDockTongueX, &mDockTongueY);
|
||||
|
||||
}
|
||||
|
||||
void LLDockControl::on()
|
||||
{
|
||||
if (isDockVisible())
|
||||
{
|
||||
mEnabled = true;
|
||||
mRecalculateDocablePosition = true;
|
||||
}
|
||||
}
|
||||
|
||||
void LLDockControl::off()
|
||||
{
|
||||
mEnabled = false;
|
||||
}
|
||||
|
||||
void LLDockControl::forceRecalculatePosition()
|
||||
{
|
||||
mRecalculateDocablePosition = true;
|
||||
}
|
||||
|
||||
void LLDockControl::drawToungue()
|
||||
{
|
||||
bool use_tongue = false;
|
||||
LLDockableFloater* dockable_floater =
|
||||
dynamic_cast<LLDockableFloater*> (mDockableFloater);
|
||||
if (dockable_floater != NULL)
|
||||
{
|
||||
use_tongue = dockable_floater->getUseTongue();
|
||||
}
|
||||
|
||||
if (mEnabled && use_tongue)
|
||||
{
|
||||
mDockTongue->draw(mDockTongueX, mDockTongueY);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -563,7 +563,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
|
|||
}
|
||||
|
||||
// update resize bars with new limits
|
||||
LLResizeBar* last_resize_bar = NULL;
|
||||
LLLayoutPanel* last_resizeable_panel = NULL;
|
||||
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
|
||||
{
|
||||
LLPanel* panelp = (*panel_it);
|
||||
|
|
@ -585,17 +585,17 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
|
|||
BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
|
||||
(*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
|
||||
|
||||
if (resize_bar_enabled)
|
||||
if ((*panel_it)->mUserResize || (*panel_it)->mAutoResize)
|
||||
{
|
||||
last_resize_bar = (*panel_it)->mResizeBar;
|
||||
last_resizeable_panel = (*panel_it);
|
||||
}
|
||||
}
|
||||
|
||||
// hide last resize bar as there is nothing past it
|
||||
// resize bars need to be in between two resizable panels
|
||||
if (last_resize_bar)
|
||||
if (last_resizeable_panel)
|
||||
{
|
||||
last_resize_bar->setVisible(FALSE);
|
||||
last_resizeable_panel->mResizeBar->setVisible(FALSE);
|
||||
}
|
||||
|
||||
// not enough room to fit existing contents
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/**
|
||||
* @file lldir_linux.h
|
||||
* @brief Definition of directory utilities class for linux
|
||||
* @brief Definition of directory utilities class for linux
|
||||
*
|
||||
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
|
|
@ -24,6 +24,10 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if !LL_LINUX
|
||||
#error This header must not be included when compiling for any target other than Linux. Consider including lldir.h instead.
|
||||
#endif // !LL_LINUX
|
||||
|
||||
#ifndef LL_LLDIR_LINUX_H
|
||||
#define LL_LLDIR_LINUX_H
|
||||
|
||||
|
|
@ -40,7 +44,7 @@ public:
|
|||
|
||||
/*virtual*/ void initAppDirs(const std::string &app_name,
|
||||
const std::string& app_read_only_data_dir);
|
||||
public:
|
||||
|
||||
virtual std::string getCurPath();
|
||||
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
|
||||
|
|
@ -53,7 +57,7 @@ private:
|
|||
DIR *mDirp;
|
||||
int mCurrentDirIndex;
|
||||
int mCurrentDirCount;
|
||||
std::string mCurrentDir;
|
||||
std::string mCurrentDir;
|
||||
};
|
||||
|
||||
#endif // LL_LLDIR_LINUX_H
|
||||
|
|
|
|||
|
|
@ -24,6 +24,10 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if !LL_DARWIN
|
||||
#error This header must not be included when compiling for any target other than Mac OS. Consider including lldir.h instead.
|
||||
#endif // !LL_DARWIN
|
||||
|
||||
#ifndef LL_LLDIR_MAC_H
|
||||
#define LL_LLDIR_MAC_H
|
||||
|
||||
|
|
@ -39,7 +43,7 @@ public:
|
|||
|
||||
/*virtual*/ void initAppDirs(const std::string &app_name,
|
||||
const std::string& app_read_only_data_dir);
|
||||
public:
|
||||
|
||||
virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual std::string getCurPath();
|
||||
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,10 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if !LL_SOLARIS
|
||||
#error This header must not be included when compiling for any target other than Solaris. Consider including lldir.h instead.
|
||||
#endif // !LL_SOLARIS
|
||||
|
||||
#ifndef LL_LLDIR_SOLARIS_H
|
||||
#define LL_LLDIR_SOLARIS_H
|
||||
|
||||
|
|
@ -40,7 +44,7 @@ public:
|
|||
|
||||
/*virtual*/ void initAppDirs(const std::string &app_name,
|
||||
const std::string& app_read_only_data_dir);
|
||||
public:
|
||||
|
||||
virtual std::string getCurPath();
|
||||
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
|
||||
|
|
@ -50,7 +54,7 @@ private:
|
|||
DIR *mDirp;
|
||||
int mCurrentDirIndex;
|
||||
int mCurrentDirCount;
|
||||
std::string mCurrentDir;
|
||||
std::string mCurrentDir;
|
||||
};
|
||||
|
||||
#endif // LL_LLDIR_SOLARIS_H
|
||||
|
|
|
|||
|
|
@ -24,6 +24,10 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#if !LL_WINDOWS
|
||||
#error This header must not be included when compiling for any target other than Windows. Consider including lldir.h instead.
|
||||
#endif // !LL_WINDOWS
|
||||
|
||||
#ifndef LL_LLDIR_WIN32_H
|
||||
#define LL_LLDIR_WIN32_H
|
||||
|
||||
|
|
@ -47,8 +51,8 @@ public:
|
|||
/*virtual*/ std::string getLLPluginFilename(std::string base_name);
|
||||
|
||||
private:
|
||||
BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
|
||||
|
||||
BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
|
||||
|
||||
void* mDirSearch_h;
|
||||
llutf16string mCurrentDir;
|
||||
};
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,29 +1,31 @@
|
|||
#!/usr/bin/env python
|
||||
# @file generate_breakpad_symbols.py
|
||||
# @author Brad Kittenbrink <brad@lindenlab.com>
|
||||
# @brief Simple tool for generating google_breakpad symbol information
|
||||
# for the crash reporter.
|
||||
#
|
||||
# $LicenseInfo:firstyear=2010&license=viewerlgpl$
|
||||
# Second Life Viewer Source Code
|
||||
# Copyright (C) 2010, Linden Research, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation;
|
||||
# version 2.1 of the License only.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#
|
||||
# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
# $/LicenseInfo$
|
||||
"""\
|
||||
@file generate_breakpad_symbols.py
|
||||
@author Brad Kittenbrink <brad@lindenlab.com>
|
||||
@brief Simple tool for generating google_breakpad symbol information
|
||||
for the crash reporter.
|
||||
|
||||
$LicenseInfo:firstyear=2010&license=viewerlgpl$
|
||||
Second Life Viewer Source Code
|
||||
Copyright (C) 2010-2011, Linden Research, Inc.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation;
|
||||
version 2.1 of the License only.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
$/LicenseInfo$
|
||||
"""
|
||||
|
||||
|
||||
import collections
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -240,6 +240,9 @@ void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_i
|
|||
LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);
|
||||
item->setAvatarId(item_id, session_id, true, false);
|
||||
item->setName(item_name);
|
||||
item->showLastInteractionTime(mShowLastInteractionTime);
|
||||
item->showSpeakingIndicator(mShowSpeakingIndicator);
|
||||
item->setOnline(false);
|
||||
|
||||
addItem(item, item_id);
|
||||
mIDs.push_back(item_id);
|
||||
|
|
@ -286,9 +289,18 @@ void LLAvatarList::refresh()
|
|||
{
|
||||
// *NOTE: If you change the UI to show a different string,
|
||||
// be sure to change the filter code below.
|
||||
addNewItem(buddy_id,
|
||||
av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
if (LLRecentPeople::instance().isAvalineCaller(buddy_id))
|
||||
{
|
||||
const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id);
|
||||
addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
addNewItem(buddy_id,
|
||||
av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
}
|
||||
|
||||
modified = true;
|
||||
nadded++;
|
||||
}
|
||||
|
|
@ -440,7 +452,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
|
|||
BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
|
||||
if ( mContextMenu )
|
||||
if ( mContextMenu && !isAvalineItemSelected())
|
||||
{
|
||||
uuid_vec_t selected_uuids;
|
||||
getSelectedUUIDs(selected_uuids);
|
||||
|
|
@ -449,6 +461,21 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
return handled;
|
||||
}
|
||||
|
||||
bool LLAvatarList::isAvalineItemSelected()
|
||||
{
|
||||
std::vector<LLPanel*> selected_items;
|
||||
getSelectedItems(selected_items);
|
||||
std::vector<LLPanel*>::iterator it = selected_items.begin();
|
||||
|
||||
for(; it != selected_items.end(); ++it)
|
||||
{
|
||||
if (dynamic_cast<LLAvalineListItem*>(*it))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLAvatarList::setVisible(BOOL visible)
|
||||
{
|
||||
if ( visible == FALSE && mContextMenu )
|
||||
|
|
|
|||
|
|
@ -112,6 +112,8 @@ protected:
|
|||
|
||||
private:
|
||||
|
||||
bool isAvalineItemSelected();
|
||||
|
||||
bool mIgnoreOnlineStatus;
|
||||
bool mShowLastInteractionTime;
|
||||
bool mDirty;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -116,6 +116,7 @@ public:
|
|||
void showMoveButton(BOOL visible);
|
||||
void showCameraButton(BOOL visible);
|
||||
void showSnapshotButton(BOOL visible);
|
||||
void showSpeakButton(bool visible);
|
||||
|
||||
void toggleMovementControls();
|
||||
void toggleCameraControls();
|
||||
|
|
@ -390,6 +391,13 @@ private:
|
|||
*/
|
||||
bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
|
||||
|
||||
/**
|
||||
* Get panel containing the given button.
|
||||
*
|
||||
* @see mStateProcessedObjectMap
|
||||
*/
|
||||
LLPanel* getButtonPanel(EResizeState button_type);
|
||||
|
||||
/**
|
||||
* Shows/hides panel with specified well button (IM or Notification)
|
||||
*
|
||||
|
|
@ -409,12 +417,21 @@ private:
|
|||
*/
|
||||
void processChatbarCustomization(S32 new_width);
|
||||
|
||||
/// Get button name for debugging.
|
||||
static std::string resizeStateToString(EResizeState state);
|
||||
|
||||
/// Buttons automatically hidden due to lack of space.
|
||||
MASK mResizeState;
|
||||
|
||||
/**
|
||||
* Mapping of button types to the layout panels the buttons are wrapped in.
|
||||
*
|
||||
* Used by getButtonPanel().
|
||||
*/
|
||||
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
|
||||
state_object_map_t mStateProcessedObjectMap;
|
||||
|
||||
/// Default (maximum) widths of the layout panels.
|
||||
typedef std::map<EResizeState, S32> state_object_width_map_t;
|
||||
state_object_width_map_t mObjectDefaultWidthMap;
|
||||
|
||||
|
|
@ -424,6 +441,7 @@ private:
|
|||
* Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
|
||||
*/
|
||||
resize_state_vec_t mButtonsProcessOrder;
|
||||
|
||||
/**
|
||||
* Contains order in which child buttons are shown.
|
||||
* It traces order of all bottomtray buttons that may change place via drag'n'drop and should
|
||||
|
|
@ -451,6 +469,7 @@ protected:
|
|||
LLSpeakButton* mSpeakBtn;
|
||||
LLNearbyChatBar* mNearbyChatBar;
|
||||
LLLayoutPanel* mChatBarContainer;
|
||||
LLPanel* mNearbyCharResizeHandlePanel;
|
||||
LLLayoutStack* mToolbarStack;
|
||||
LLMenuGL* mBottomTrayContextMenu;
|
||||
LLButton* mCamButton;
|
||||
|
|
|
|||
|
|
@ -351,8 +351,8 @@ void LLFloaterAuction::doResetParcel()
|
|||
body["media_height"] = (S32) 0;
|
||||
body["auto_scale"] = (S32) 0;
|
||||
body["media_loop"] = (S32) 0;
|
||||
body["obscure_media"] = (S32) 0;
|
||||
body["obscure_music"] = (S32) 0;
|
||||
body["obscure_media"] = (S32) 0; // OBSOLETE - no longer used
|
||||
body["obscure_music"] = (S32) 0; // OBSOLETE - no longer used
|
||||
body["media_id"] = LLUUID::null;
|
||||
body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group
|
||||
body["pass_price"] = (S32) 10; // Defaults to $10
|
||||
|
|
|
|||
|
|
@ -220,6 +220,8 @@ BOOL LLFloaterTools::postBuild()
|
|||
mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
|
||||
mBtnGridOptions = getChild<LLButton>("Options...");
|
||||
mTitleMedia = getChild<LLMediaCtrl>("title_media");
|
||||
mBtnLink = getChild<LLButton>("link_btn");
|
||||
mBtnUnlink = getChild<LLButton>("unlink_btn");
|
||||
|
||||
mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
|
||||
getChild<LLUICtrl>("checkbox edit linked parts")->setValue((BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
|
||||
|
|
@ -315,6 +317,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mBtnRotateReset(NULL),
|
||||
mBtnRotateRight(NULL),
|
||||
|
||||
mBtnLink(NULL),
|
||||
mBtnUnlink(NULL),
|
||||
|
||||
mBtnDelete(NULL),
|
||||
mBtnDuplicate(NULL),
|
||||
mBtnDuplicateInPlace(NULL),
|
||||
|
|
@ -341,7 +346,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mNeedMediaTitle(TRUE)
|
||||
{
|
||||
gFloaterTools = this;
|
||||
|
||||
|
||||
setAutoFocus(FALSE);
|
||||
mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
|
||||
mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
|
||||
|
|
@ -366,6 +371,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
|
||||
|
||||
mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
|
||||
mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
|
||||
|
||||
}
|
||||
|
||||
LLFloaterTools::~LLFloaterTools()
|
||||
|
|
@ -566,6 +574,12 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
|
|||
bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
|
||||
getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
|
||||
|
||||
mBtnLink->setVisible(edit_visible);
|
||||
mBtnUnlink->setVisible(edit_visible);
|
||||
|
||||
mBtnLink->setEnabled(LLSelectMgr::instance().enableLinkObjects());
|
||||
mBtnUnlink->setEnabled(LLSelectMgr::instance().enableUnlinkObjects());
|
||||
|
||||
if (mCheckSelectIndividual)
|
||||
{
|
||||
mCheckSelectIndividual->setVisible(edit_visible);
|
||||
|
|
|
|||
|
|
@ -135,6 +135,8 @@ public:
|
|||
LLRadioGroup* mRadioGroupEdit;
|
||||
|
||||
LLCheckBoxCtrl *mCheckSelectIndividual;
|
||||
LLButton* mBtnLink;
|
||||
LLButton* mBtnUnlink;
|
||||
|
||||
LLCheckBoxCtrl* mCheckSnapToGrid;
|
||||
LLButton* mBtnGridOptions;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "llfriendcard.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llinventory.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
|
|
@ -290,58 +291,6 @@ void LLFriendCardsManager::syncFriendCardsFolders()
|
|||
boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
|
||||
}
|
||||
|
||||
void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
|
||||
{
|
||||
folderBuddiesMap.clear();
|
||||
|
||||
static bool syncronize_friends_folders = true;
|
||||
if (syncronize_friends_folders)
|
||||
{
|
||||
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
|
||||
// fetches their contents if needed and synchronizes it with buddies list.
|
||||
// If the folders are not found they are created.
|
||||
LLFriendCardsManager::instance().syncFriendCardsFolders();
|
||||
syncronize_friends_folders = false;
|
||||
}
|
||||
|
||||
|
||||
LLInventoryModel::cat_array_t* listFolders;
|
||||
LLInventoryModel::item_array_t* items;
|
||||
|
||||
// get folders in the Friend folder. Items should be NULL due to Cards should be in lists.
|
||||
gInventory.getDirectDescendentsOf(findFriendFolderUUIDImpl(), listFolders, items);
|
||||
|
||||
if (NULL == listFolders)
|
||||
return;
|
||||
|
||||
LLInventoryModel::cat_array_t::const_iterator itCats; // to iterate Friend Lists (categories)
|
||||
LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
|
||||
LLInventoryModel::cat_array_t* fakeCatsArg;
|
||||
for (itCats = listFolders->begin(); itCats != listFolders->end(); ++itCats)
|
||||
{
|
||||
if (items)
|
||||
items->clear();
|
||||
|
||||
// *HACK: Only Friends/All content will be shown for now
|
||||
// *TODO: Remove this hack, implement sorting if it will be needded by spec.
|
||||
if ((*itCats)->getUUID() != findFriendAllSubfolderUUIDImpl())
|
||||
continue;
|
||||
|
||||
gInventory.getDirectDescendentsOf((*itCats)->getUUID(), fakeCatsArg, items);
|
||||
|
||||
if (NULL == items)
|
||||
continue;
|
||||
|
||||
uuid_vec_t buddyUUIDs;
|
||||
for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
|
||||
{
|
||||
buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
|
||||
}
|
||||
|
||||
folderBuddiesMap.insert(make_pair((*itCats)->getUUID(), buddyUUIDs));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* Private Methods */
|
||||
|
|
@ -499,23 +448,43 @@ void LLFriendCardsManager::syncFriendsFolder()
|
|||
LLAvatarTracker::buddy_map_t all_buddies;
|
||||
LLAvatarTracker::instance().copyBuddyList(all_buddies);
|
||||
|
||||
// 1. Remove Friend Cards for non-friends
|
||||
// 1. Check if own calling card exists
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
LLInventoryModel::item_array_t items;
|
||||
|
||||
gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
|
||||
LLUUID friends_all_folder_id = findFriendAllSubfolderUUIDImpl();
|
||||
gInventory.collectDescendents(friends_all_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
|
||||
|
||||
bool own_callingcard_found = false;
|
||||
LLInventoryModel::item_array_t::const_iterator it;
|
||||
for (it = items.begin(); it != items.end(); ++it)
|
||||
{
|
||||
lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
|
||||
if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
|
||||
if ((*it)->getCreatorUUID() == gAgentID)
|
||||
{
|
||||
lldebugs << "NONEXISTS, so remove it" << llendl;
|
||||
removeFriendCardFromInventory((*it)->getCreatorUUID());
|
||||
own_callingcard_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Create own calling card if it was not found in Friends/All folder
|
||||
if (!own_callingcard_found)
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get( gAgentID, &av_name );
|
||||
|
||||
create_inventory_item(gAgentID,
|
||||
gAgent.getSessionID(),
|
||||
friends_all_folder_id,
|
||||
LLTransactionID::tnull,
|
||||
av_name.getCompleteName(),
|
||||
gAgentID.asString(),
|
||||
LLAssetType::AT_CALLINGCARD,
|
||||
LLInventoryType::IT_CALLINGCARD,
|
||||
NOT_WEARABLE,
|
||||
PERM_MOVE | PERM_TRANSFER,
|
||||
NULL);
|
||||
}
|
||||
|
||||
// 2. Add missing Friend Cards for friends
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
|
||||
llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
|
||||
|
|
|
|||
|
|
@ -79,19 +79,6 @@ public:
|
|||
*/
|
||||
void syncFriendCardsFolders();
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
* Collects folders' IDs with the buddies' IDs in the Inventory Calling Card/Friends folder.
|
||||
*
|
||||
* \param folderBuddiesMap
|
||||
* map into collected data will be put. It will be cleared before adding new data.
|
||||
*
|
||||
* Each item in the out map is a pair where first is an LLViewerInventoryCategory UUID,
|
||||
* second is a vector with UUID of Avatars from this folder.
|
||||
*
|
||||
*/
|
||||
void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
|
||||
|
||||
private:
|
||||
typedef boost::function<void()> callback_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -483,9 +483,6 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
|
|||
|
||||
switch(item->getType())
|
||||
{
|
||||
case LLAssetType::AT_CALLINGCARD:
|
||||
return false;
|
||||
break;
|
||||
case LLAssetType::AT_OBJECT:
|
||||
case LLAssetType::AT_BODYPART:
|
||||
case LLAssetType::AT_CLOTHING:
|
||||
|
|
|
|||
|
|
@ -373,17 +373,19 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags)
|
|||
// Must be after erase.
|
||||
setLoaded(); // why is this here? -MG
|
||||
}
|
||||
|
||||
// Clean up any legacy mutes
|
||||
string_set_t::iterator legacy_it = mLegacyMutes.find(mute.mName);
|
||||
if (legacy_it != mLegacyMutes.end())
|
||||
else
|
||||
{
|
||||
// Database representation of legacy mute is UUID null.
|
||||
LLMute mute(LLUUID::null, *legacy_it, LLMute::BY_NAME);
|
||||
updateRemove(mute);
|
||||
mLegacyMutes.erase(legacy_it);
|
||||
// Must be after erase.
|
||||
setLoaded(); // why is this here? -MG
|
||||
// Clean up any legacy mutes
|
||||
string_set_t::iterator legacy_it = mLegacyMutes.find(mute.mName);
|
||||
if (legacy_it != mLegacyMutes.end())
|
||||
{
|
||||
// Database representation of legacy mute is UUID null.
|
||||
LLMute mute(LLUUID::null, *legacy_it, LLMute::BY_NAME);
|
||||
updateRemove(mute);
|
||||
mLegacyMutes.erase(legacy_it);
|
||||
// Must be after erase.
|
||||
setLoaded(); // why is this here? -MG
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
|
|
@ -607,7 +609,8 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
|
|||
}
|
||||
|
||||
// empty names can't be legacy-muted
|
||||
if (name.empty()) return FALSE;
|
||||
bool avatar = mute_object && mute_object->isAvatar();
|
||||
if (name.empty() || avatar) return FALSE;
|
||||
|
||||
// Look in legacy pile
|
||||
string_set_t::const_iterator legacy_it = mLegacyMutes.find(name);
|
||||
|
|
|
|||
|
|
@ -91,9 +91,6 @@ BOOL LLPanelLandAudio::postBuild()
|
|||
mMusicURLEdit = getChild<LLLineEditor>("music_url");
|
||||
childSetCommitCallback("music_url", onCommitAny, this);
|
||||
|
||||
mMusicUrlCheck = getChild<LLCheckBoxCtrl>("hide_music_url");
|
||||
childSetCommitCallback("hide_music_url", onCommitAny, this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -117,9 +114,6 @@ void LLPanelLandAudio::refresh()
|
|||
mCheckSoundLocal->set( parcel->getSoundLocal() );
|
||||
mCheckSoundLocal->setEnabled( can_change_media );
|
||||
|
||||
mMusicUrlCheck->set( parcel->getObscureMusic() );
|
||||
mMusicUrlCheck->setEnabled( can_change_media );
|
||||
|
||||
bool allow_voice = parcel->getParcelFlagAllowVoice();
|
||||
|
||||
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
|
||||
|
|
@ -148,13 +142,6 @@ void LLPanelLandAudio::refresh()
|
|||
mCheckParcelEnableVoice->set(allow_voice);
|
||||
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
|
||||
|
||||
// don't display urls if you're not able to change it
|
||||
// much requested change in forums so people can't 'steal' urls
|
||||
// NOTE: bug#2009 means this is still vunerable - however, bug
|
||||
// should be closed since this bug opens up major security issues elsewhere.
|
||||
bool obscure_music = ! can_change_media && parcel->getObscureMusic();
|
||||
|
||||
mMusicURLEdit->setDrawAsterixes(obscure_music);
|
||||
mMusicURLEdit->setText(parcel->getMusicURL());
|
||||
mMusicURLEdit->setEnabled( can_change_media );
|
||||
}
|
||||
|
|
@ -173,7 +160,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
|
|||
// Extract data from UI
|
||||
BOOL sound_local = self->mCheckSoundLocal->get();
|
||||
std::string music_url = self->mMusicURLEdit->getText();
|
||||
U8 obscure_music = self->mMusicUrlCheck->get();
|
||||
|
||||
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
|
||||
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
|
||||
|
|
@ -186,7 +172,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
|
|||
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
|
||||
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
|
||||
parcel->setMusicURL(music_url);
|
||||
parcel->setObscureMusic(obscure_music);
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
|
||||
|
|
|
|||
|
|
@ -68,8 +68,7 @@ LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
|
|||
mMediaSizeCtrlLabel(NULL),
|
||||
mMediaTextureCtrl(NULL),
|
||||
mMediaAutoScaleCheck(NULL),
|
||||
mMediaLoopCheck(NULL),
|
||||
mMediaUrlCheck(NULL)
|
||||
mMediaLoopCheck(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -94,9 +93,6 @@ BOOL LLPanelLandMedia::postBuild()
|
|||
mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
|
||||
childSetCommitCallback("media_loop", onCommitAny, this );
|
||||
|
||||
mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
|
||||
childSetCommitCallback("hide_media_url", onCommitAny, this );
|
||||
|
||||
mMediaURLEdit = getChild<LLLineEditor>("media_url");
|
||||
childSetCommitCallback("media_url", onCommitAny, this );
|
||||
|
||||
|
|
@ -153,25 +149,6 @@ void LLPanelLandMedia::refresh()
|
|||
mMediaTypeCombo->setEnabled( can_change_media );
|
||||
getChild<LLUICtrl>("mime_type")->setValue(mime_type);
|
||||
|
||||
mMediaUrlCheck->set( parcel->getObscureMedia() );
|
||||
mMediaUrlCheck->setEnabled( can_change_media );
|
||||
|
||||
// don't display urls if you're not able to change it
|
||||
// much requested change in forums so people can't 'steal' urls
|
||||
// NOTE: bug#2009 means this is still vunerable - however, bug
|
||||
// should be closed since this bug opens up major security issues elsewhere.
|
||||
bool obscure_media = ! can_change_media && parcel->getObscureMedia();
|
||||
|
||||
// Special code to disable asterixes for html type
|
||||
if(mime_type == "text/html")
|
||||
{
|
||||
obscure_media = false;
|
||||
mMediaUrlCheck->set( 0 );
|
||||
mMediaUrlCheck->setEnabled( false );
|
||||
}
|
||||
|
||||
mMediaURLEdit->setDrawAsterixes( obscure_media );
|
||||
|
||||
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
|
||||
mMediaAutoScaleCheck->setEnabled ( can_change_media );
|
||||
|
||||
|
|
@ -301,7 +278,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
|
|||
std::string mime_type = self->getChild<LLUICtrl>("mime_type")->getValue().asString();
|
||||
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
|
||||
U8 media_loop = self->mMediaLoopCheck->get();
|
||||
U8 obscure_media = self->mMediaUrlCheck->get();
|
||||
S32 media_width = (S32)self->mMediaWidthCtrl->get();
|
||||
S32 media_height = (S32)self->mMediaHeightCtrl->get();
|
||||
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
|
||||
|
|
@ -321,7 +297,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
|
|||
parcel->setMediaID(media_id);
|
||||
parcel->setMediaAutoScale ( media_auto_scale );
|
||||
parcel->setMediaLoop ( media_loop );
|
||||
parcel->setObscureMedia( obscure_media );
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -564,16 +564,14 @@ void LLPanelNearByMedia::refreshParcelItems()
|
|||
if (NULL != mParcelMediaItem)
|
||||
{
|
||||
std::string name, url, tooltip;
|
||||
if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia())
|
||||
getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
|
||||
if (name.empty() || name == url)
|
||||
{
|
||||
getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
|
||||
if (name.empty() || name == url)
|
||||
{
|
||||
tooltip = url;
|
||||
}
|
||||
else {
|
||||
tooltip = name + " : " + url;
|
||||
}
|
||||
tooltip = url;
|
||||
}
|
||||
else
|
||||
{
|
||||
tooltip = name + " : " + url;
|
||||
}
|
||||
LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
|
||||
updateListItem(mParcelMediaItem,
|
||||
|
|
@ -611,10 +609,8 @@ void LLPanelNearByMedia::refreshParcelItems()
|
|||
bool is_playing = LLViewerMedia::isParcelAudioPlaying();
|
||||
|
||||
std::string url;
|
||||
if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic())
|
||||
{
|
||||
url = LLViewerMedia::getParcelAudioURL();
|
||||
}
|
||||
url = LLViewerMedia::getParcelAudioURL();
|
||||
|
||||
updateListItem(mParcelAudioItem,
|
||||
mParcelAudioName,
|
||||
url,
|
||||
|
|
|
|||
|
|
@ -384,6 +384,16 @@ private:
|
|||
{
|
||||
lldebugs << "Inventory changed: " << mask << llendl;
|
||||
|
||||
static bool synchronize_friends_folders = true;
|
||||
if (synchronize_friends_folders)
|
||||
{
|
||||
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
|
||||
// fetches their contents if needed and synchronizes it with buddies list.
|
||||
// If the folders are not found they are created.
|
||||
LLFriendCardsManager::instance().syncFriendCardsFolders();
|
||||
synchronize_friends_folders = false;
|
||||
}
|
||||
|
||||
// *NOTE: deleting of InventoryItem is performed via moving to Trash.
|
||||
// That means LLInventoryObserver::STRUCTURE is present in MASK instead of LLInventoryObserver::REMOVE
|
||||
if ((CALLINGCARD_ADDED & mask) == CALLINGCARD_ADDED)
|
||||
|
|
@ -750,18 +760,23 @@ void LLPanelPeople::updateFriendList()
|
|||
all_friendsp.clear();
|
||||
online_friendsp.clear();
|
||||
|
||||
LLFriendCardsManager::folderid_buddies_map_t listMap;
|
||||
uuid_vec_t buddies_uuids;
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddies_iter;
|
||||
|
||||
// *NOTE: For now collectFriendsLists returns data only for Friends/All folder. EXT-694.
|
||||
LLFriendCardsManager::instance().collectFriendsLists(listMap);
|
||||
if (listMap.size() > 0)
|
||||
// Fill the avatar list with friends UUIDs
|
||||
for (buddies_iter = all_buddies.begin(); buddies_iter != all_buddies.end(); ++buddies_iter)
|
||||
{
|
||||
lldebugs << "Friends Cards were found, count: " << listMap.begin()->second.size() << llendl;
|
||||
all_friendsp = listMap.begin()->second;
|
||||
buddies_uuids.push_back(buddies_iter->first);
|
||||
}
|
||||
|
||||
if (buddies_uuids.size() > 0)
|
||||
{
|
||||
lldebugs << "Friends added to the list: " << buddies_uuids.size() << llendl;
|
||||
all_friendsp = buddies_uuids;
|
||||
}
|
||||
else
|
||||
{
|
||||
lldebugs << "Friends Cards were not found" << llendl;
|
||||
lldebugs << "No friends found" << llendl;
|
||||
}
|
||||
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
using namespace LLOldEvents;
|
||||
|
||||
bool LLRecentPeople::add(const LLUUID& id)
|
||||
bool LLRecentPeople::add(const LLUUID& id, const LLSD& userdata)
|
||||
{
|
||||
if (id == gAgent.getID())
|
||||
return false;
|
||||
|
|
@ -42,10 +42,16 @@ bool LLRecentPeople::add(const LLUUID& id)
|
|||
|
||||
if (is_not_group_id)
|
||||
{
|
||||
LLDate date_added = LLDate::now();
|
||||
// For each avaline call the id of caller is different even if
|
||||
// the phone number is the same.
|
||||
// To avoid duplication of avaline list items in the recent list
|
||||
// of panel People, deleting id's with similar phone number.
|
||||
const LLUUID& caller_id = getIDByPhoneNumber(userdata);
|
||||
if (caller_id.notNull())
|
||||
mPeople.erase(caller_id);
|
||||
|
||||
//[] instead of insert to replace existing id->date with new date value
|
||||
mPeople[id] = date_added;
|
||||
//[] instead of insert to replace existing id->llsd["date"] with new date value
|
||||
mPeople[id] = userdata;
|
||||
mChangedSignal();
|
||||
}
|
||||
|
||||
|
|
@ -64,15 +70,55 @@ void LLRecentPeople::get(uuid_vec_t& result) const
|
|||
result.push_back((*pos).first);
|
||||
}
|
||||
|
||||
const LLDate& LLRecentPeople::getDate(const LLUUID& id) const
|
||||
const LLDate LLRecentPeople::getDate(const LLUUID& id) const
|
||||
{
|
||||
recent_people_t::const_iterator it = mPeople.find(id);
|
||||
if (it!= mPeople.end()) return (*it).second;
|
||||
if (it!= mPeople.end()) return it->second["date"].asDate();
|
||||
|
||||
static LLDate no_date = LLDate();
|
||||
return no_date;
|
||||
}
|
||||
|
||||
const LLSD& LLRecentPeople::getData(const LLUUID& id) const
|
||||
{
|
||||
recent_people_t::const_iterator it = mPeople.find(id);
|
||||
|
||||
if (it != mPeople.end())
|
||||
return it->second;
|
||||
|
||||
static LLSD no_data = LLSD();
|
||||
return no_data;
|
||||
}
|
||||
|
||||
bool LLRecentPeople::isAvalineCaller(const LLUUID& id) const
|
||||
{
|
||||
recent_people_t::const_iterator it = mPeople.find(id);
|
||||
|
||||
if (it != mPeople.end())
|
||||
{
|
||||
const LLSD& user = it->second;
|
||||
return user["avaline_call"].asBoolean();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const LLUUID& LLRecentPeople::getIDByPhoneNumber(const LLSD& userdata)
|
||||
{
|
||||
if (!userdata["avaline_call"].asBoolean())
|
||||
return LLUUID::null;
|
||||
|
||||
for (recent_people_t::const_iterator it = mPeople.begin(); it != mPeople.end(); ++it)
|
||||
{
|
||||
const LLSD& user_info = it->second;
|
||||
|
||||
if (user_info["call_number"].asString() == userdata["call_number"].asString())
|
||||
return it->first;
|
||||
}
|
||||
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -58,9 +58,15 @@ public:
|
|||
* Add specified avatar to the list if it's not there already.
|
||||
*
|
||||
* @param id avatar to add.
|
||||
*
|
||||
* @param userdata additional information about last interaction party.
|
||||
* For example when last interaction party is not an avatar
|
||||
* but an avaline caller, additional info (such as phone
|
||||
* number, session id and etc.) should be added.
|
||||
*
|
||||
* @return false if the avatar is in the list already, true otherwise
|
||||
*/
|
||||
bool add(const LLUUID& id);
|
||||
bool add(const LLUUID& id, const LLSD& userdata = LLSD().with("date", LLDate::now()));
|
||||
|
||||
/**
|
||||
* @param id avatar to search.
|
||||
|
|
@ -75,7 +81,25 @@ public:
|
|||
*/
|
||||
void get(uuid_vec_t& result) const;
|
||||
|
||||
const LLDate& getDate(const LLUUID& id) const;
|
||||
/**
|
||||
* Returns last interaction time with specified participant
|
||||
*
|
||||
*/
|
||||
const LLDate getDate(const LLUUID& id) const;
|
||||
|
||||
/**
|
||||
* Returns data about specified participant
|
||||
*
|
||||
* @param id identifier of specific participant
|
||||
*/
|
||||
const LLSD& getData(const LLUUID& id) const;
|
||||
|
||||
/**
|
||||
* Checks whether specific participant is an avaline caller
|
||||
*
|
||||
* @param id identifier of specific participant
|
||||
*/
|
||||
bool isAvalineCaller(const LLUUID& id) const;
|
||||
|
||||
/**
|
||||
* Set callback to be called when the list changed.
|
||||
|
|
@ -92,7 +116,10 @@ public:
|
|||
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
|
||||
|
||||
private:
|
||||
typedef std::map<LLUUID, LLDate> recent_people_t;
|
||||
|
||||
const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
|
||||
|
||||
typedef std::map<LLUUID, LLSD> recent_people_t;
|
||||
recent_people_t mPeople;
|
||||
signal_t mChangedSignal;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@
|
|||
#include "llinventorymodel.h"
|
||||
#include "llmenugl.h"
|
||||
#include "llmutelist.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llsidepaneltaskinfo.h"
|
||||
#include "llslurl.h"
|
||||
#include "llstatusbar.h"
|
||||
|
|
@ -562,6 +563,103 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
|
|||
return object_found;
|
||||
}
|
||||
|
||||
bool LLSelectMgr::linkObjects()
|
||||
{
|
||||
if (!LLSelectMgr::getInstance()->selectGetAllRootsValid())
|
||||
{
|
||||
LLNotificationsUtil::add("UnableToLinkWhileDownloading");
|
||||
return true;
|
||||
}
|
||||
|
||||
S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
|
||||
if (object_count > MAX_CHILDREN_PER_TASK + 1)
|
||||
{
|
||||
LLSD args;
|
||||
args["COUNT"] = llformat("%d", object_count);
|
||||
int max = MAX_CHILDREN_PER_TASK+1;
|
||||
args["MAX"] = llformat("%d", max);
|
||||
LLNotificationsUtil::add("UnableToLinkObjects", args);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
|
||||
{
|
||||
LLNotificationsUtil::add("CannotLinkIncompleteSet");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!LLSelectMgr::getInstance()->selectGetRootsModify())
|
||||
{
|
||||
LLNotificationsUtil::add("CannotLinkModify");
|
||||
return true;
|
||||
}
|
||||
|
||||
LLUUID owner_id;
|
||||
std::string owner_name;
|
||||
if (!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
|
||||
{
|
||||
// we don't actually care if you're the owner, but novices are
|
||||
// the most likely to be stumped by this one, so offer the
|
||||
// easiest and most likely solution.
|
||||
LLNotificationsUtil::add("CannotLinkDifferentOwners");
|
||||
return true;
|
||||
}
|
||||
|
||||
LLSelectMgr::getInstance()->sendLink();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LLSelectMgr::unlinkObjects()
|
||||
{
|
||||
LLSelectMgr::getInstance()->sendDelink();
|
||||
return true;
|
||||
}
|
||||
|
||||
// in order to link, all objects must have the same owner, and the
|
||||
// agent must have the ability to modify all of the objects. However,
|
||||
// we're not answering that question with this method. The question
|
||||
// we're answering is: does the user have a reasonable expectation
|
||||
// that a link operation should work? If so, return true, false
|
||||
// otherwise. this allows the handle_link method to more finely check
|
||||
// the selection and give an error message when the uer has a
|
||||
// reasonable expectation for the link to work, but it will fail.
|
||||
bool LLSelectMgr::enableLinkObjects()
|
||||
{
|
||||
bool new_value = false;
|
||||
// check if there are at least 2 objects selected, and that the
|
||||
// user can modify at least one of the selected objects.
|
||||
|
||||
// in component mode, can't link
|
||||
if (!gSavedSettings.getBOOL("EditLinkedParts"))
|
||||
{
|
||||
if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2)
|
||||
{
|
||||
struct f : public LLSelectedObjectFunctor
|
||||
{
|
||||
virtual bool apply(LLViewerObject* object)
|
||||
{
|
||||
return object->permModify();
|
||||
}
|
||||
} func;
|
||||
const bool firstonly = true;
|
||||
new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
|
||||
}
|
||||
}
|
||||
return new_value;
|
||||
}
|
||||
|
||||
bool LLSelectMgr::enableUnlinkObjects()
|
||||
{
|
||||
LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
|
||||
|
||||
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
|
||||
first_editable_object &&
|
||||
!first_editable_object->isAttachment();
|
||||
|
||||
return new_value;
|
||||
}
|
||||
|
||||
void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object)
|
||||
{
|
||||
// bail if nothing selected or if object wasn't selected in the first place
|
||||
|
|
|
|||
|
|
@ -439,6 +439,17 @@ public:
|
|||
|
||||
BOOL removeObjectFromSelections(const LLUUID &id);
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Selection editing
|
||||
////////////////////////////////////////////////////////////////
|
||||
bool linkObjects();
|
||||
|
||||
bool unlinkObjects();
|
||||
|
||||
bool enableLinkObjects();
|
||||
|
||||
bool enableUnlinkObjects();
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Selection accessors
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -309,6 +309,15 @@ static bool handleRenderUseVBOChanged(const LLSD& newvalue)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool handleRenderUseVBOMappingChanged(const LLSD& newvalue)
|
||||
{
|
||||
if (gPipeline.isInit())
|
||||
{
|
||||
gPipeline.setDisableVBOMapping(newvalue.asBoolean());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool handleWLSkyDetailChanged(const LLSD&)
|
||||
{
|
||||
if (gSky.mVOWLSkyp.notNull())
|
||||
|
|
@ -589,6 +598,7 @@ void settings_setup_listeners()
|
|||
gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleRenderUseVBOChanged, _2));
|
||||
gSavedSettings.getControl("RenderVBOMappingDisable")->getSignal()->connect(boost::bind(&handleRenderUseVBOMappingChanged, _2));
|
||||
gSavedSettings.getControl("RenderUseStreamVBO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
|
||||
gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _2));
|
||||
gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _2));
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -884,13 +884,14 @@ void LLViewerObjectList::clearDebugText()
|
|||
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
|
||||
{
|
||||
LLMemType mt(LLMemType::MTYPE_OBJECT);
|
||||
if (mDeadObjects.count(objectp->mID))
|
||||
if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
|
||||
{
|
||||
llinfos << "Object " << objectp->mID << " already on dead list, ignoring cleanup!" << llendl;
|
||||
return;
|
||||
llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
mDeadObjects.insert(objectp->mID);
|
||||
}
|
||||
|
||||
mDeadObjects.insert(std::pair<LLUUID, LLPointer<LLViewerObject> >(objectp->mID, objectp));
|
||||
|
||||
// Cleanup any references we have to this object
|
||||
// Remove from object map so noone can look it up.
|
||||
|
|
@ -1140,6 +1141,45 @@ bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp)
|
|||
return false ;
|
||||
}
|
||||
|
||||
//make sure the region is cleaned up.
|
||||
void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
|
||||
{
|
||||
std::set<LLViewerObject*> dead_object_list ;
|
||||
std::set<LLViewerObject*> region_object_list ;
|
||||
for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
|
||||
{
|
||||
LLViewerObject* objectp = *iter;
|
||||
|
||||
if(objectp->isDead())
|
||||
{
|
||||
dead_object_list.insert(objectp) ;
|
||||
}
|
||||
else if(objectp->getRegion() == regionp)
|
||||
{
|
||||
region_object_list.insert(objectp) ;
|
||||
}
|
||||
}
|
||||
|
||||
if(dead_object_list.size() > 0)
|
||||
{
|
||||
llwarns << "There are " << dead_object_list.size() << " dead objects on the map!" << llendl ;
|
||||
|
||||
for(std::set<LLViewerObject*>::iterator iter = dead_object_list.begin(); iter != dead_object_list.end(); ++iter)
|
||||
{
|
||||
cleanupReferences(*iter) ;
|
||||
}
|
||||
}
|
||||
if(region_object_list.size() > 0)
|
||||
{
|
||||
llwarns << "There are " << region_object_list.size() << " objects not removed from the deleted region!" << llendl ;
|
||||
|
||||
for(std::set<LLViewerObject*>::iterator iter = region_object_list.begin(); iter != region_object_list.end(); ++iter)
|
||||
{
|
||||
(*iter)->markDead() ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
|
||||
{
|
||||
LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
|
||||
|
|
@ -1159,7 +1199,11 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
|
|||
{
|
||||
LLViewerObject* objectp = *iter;
|
||||
|
||||
llassert_always(!objectp->isDead());
|
||||
//llassert_always(!objectp->isDead());
|
||||
if(objectp->isDead())//some dead objects somehow not cleaned.
|
||||
{
|
||||
continue ;
|
||||
}
|
||||
|
||||
if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ public:
|
|||
void shiftObjects(const LLVector3 &offset);
|
||||
|
||||
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
|
||||
void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
|
||||
void renderObjectsForMap(LLNetMap &netmap);
|
||||
void renderObjectBounds(const LLVector3 ¢er);
|
||||
|
||||
|
|
@ -181,8 +182,7 @@ protected:
|
|||
|
||||
vobj_list_t mMapObjects;
|
||||
|
||||
typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
|
||||
vo_map mDeadObjects; // Need to keep multiple entries per UUID
|
||||
std::set<LLUUID> mDeadObjects;
|
||||
|
||||
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
|
||||
|
||||
|
|
|
|||
|
|
@ -2691,12 +2691,10 @@ void LLViewerFetchedTexture::saveRawImage()
|
|||
mLastReferencedSavedRawImageTime = sCurrentTime ;
|
||||
}
|
||||
|
||||
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_callback)
|
||||
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
|
||||
{
|
||||
if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
|
||||
{
|
||||
llassert_always(from_callback || mBoostLevel == LLViewerTexture::BOOST_PREVIEW) ;
|
||||
|
||||
mForceToSaveRawImage = TRUE ;
|
||||
mDesiredSavedRawDiscardLevel = desired_discard ;
|
||||
|
||||
|
|
|
|||
|
|
@ -465,7 +465,7 @@ public:
|
|||
S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
|
||||
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
|
||||
BOOL isRawImageValid()const { return mIsRawImageValid ; }
|
||||
void forceToSaveRawImage(S32 desired_discard = 0, bool from_callback = false) ;
|
||||
void forceToSaveRawImage(S32 desired_discard = 0) ;
|
||||
/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
|
||||
void destroySavedRawImage() ;
|
||||
LLImageRaw* getSavedRawImage() ;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -71,6 +71,7 @@ LLVOCacheEntry::LLVOCacheEntry()
|
|||
}
|
||||
|
||||
LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
|
||||
: mBuffer(NULL)
|
||||
{
|
||||
S32 size = -1;
|
||||
BOOL success;
|
||||
|
|
@ -135,7 +136,10 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
|
|||
|
||||
LLVOCacheEntry::~LLVOCacheEntry()
|
||||
{
|
||||
delete [] mBuffer;
|
||||
if(mBuffer)
|
||||
{
|
||||
delete[] mBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -853,7 +853,7 @@ void LLVoiceChannelP2P::activate()
|
|||
}
|
||||
|
||||
// Add the party to the list of people with which we've recently interacted.
|
||||
LLRecentPeople::instance().add(mOtherUserID);
|
||||
addToTheRecentPeopleList();
|
||||
|
||||
//Default mic is ON on initiating/joining P2P calls
|
||||
if (!LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle())
|
||||
|
|
@ -938,3 +938,25 @@ void LLVoiceChannelP2P::setState(EState state)
|
|||
|
||||
LLVoiceChannel::setState(state);
|
||||
}
|
||||
|
||||
void LLVoiceChannelP2P::addToTheRecentPeopleList()
|
||||
{
|
||||
bool avaline_call = LLIMModel::getInstance()->findIMSession(mSessionID)->isAvalineSessionType();
|
||||
|
||||
if (avaline_call)
|
||||
{
|
||||
LLSD call_data;
|
||||
std::string call_number = LLVoiceChannel::getSessionName();
|
||||
|
||||
call_data["avaline_call"] = true;
|
||||
call_data["session_id"] = mSessionID;
|
||||
call_data["call_number"] = call_number;
|
||||
call_data["date"] = LLDate::now();
|
||||
|
||||
LLRecentPeople::instance().add(mOtherUserID, call_data);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLRecentPeople::instance().add(mOtherUserID);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -191,6 +191,13 @@ protected:
|
|||
virtual void setState(EState state);
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* Add the caller to the list of people with which we've recently interacted
|
||||
*
|
||||
**/
|
||||
void addToTheRecentPeopleList();
|
||||
|
||||
std::string mSessionHandle;
|
||||
LLUUID mOtherUserID;
|
||||
BOOL mReceivedCall;
|
||||
|
|
|
|||
|
|
@ -282,7 +282,9 @@ void LLWorld::removeRegion(const LLHost &host)
|
|||
|
||||
updateWaterObjects();
|
||||
|
||||
llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
|
||||
//double check all objects of this region are removed.
|
||||
gObjectList.clearAllMapObjectsInRegion(regionp) ;
|
||||
//llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1474,6 +1476,42 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
|
|||
}
|
||||
}
|
||||
}
|
||||
// retrieve the list of close avatars from viewer objects as well
|
||||
// for when we are above 1000m, only do this when we are retrieving
|
||||
// uuid's too as there could be duplicates
|
||||
if(avatar_ids != NULL)
|
||||
{
|
||||
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
|
||||
iter != LLCharacter::sInstances.end(); ++iter)
|
||||
{
|
||||
LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
|
||||
if(pVOAvatar->isDead() || pVOAvatar->isSelf())
|
||||
continue;
|
||||
LLUUID uuid = pVOAvatar->getID();
|
||||
if(uuid.isNull())
|
||||
continue;
|
||||
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
|
||||
if(dist_vec(pos_global, relative_to) <= radius)
|
||||
{
|
||||
bool found = false;
|
||||
uuid_vec_t::iterator sel_iter = avatar_ids->begin();
|
||||
for (; sel_iter != avatar_ids->end(); sel_iter++)
|
||||
{
|
||||
if(*sel_iter == uuid)
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found)
|
||||
{
|
||||
if(positions != NULL)
|
||||
positions->push_back(pos_global);
|
||||
avatar_ids->push_back(uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -111,6 +111,7 @@ public:
|
|||
|
||||
void resetVertexBuffers(LLDrawable* drawable);
|
||||
void setUseVBO(BOOL use_vbo);
|
||||
void setDisableVBOMapping(BOOL no_vbo_mapping);
|
||||
void generateImpostor(LLVOAvatar* avatar);
|
||||
void bindScreenToTexture();
|
||||
void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
|
|
@ -115,6 +115,7 @@ with the same filename but different name
|
|||
|
||||
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
|
||||
|
||||
<texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
|
||||
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
|
||||
<texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
|
||||
<texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
|
||||
|
|
|
|||
|
|
@ -87,15 +87,9 @@ Gå til 'Verden' > 'Om land' eller vælg en anden parcel
|
|||
<text name="Owner:">
|
||||
Ejer:
|
||||
</text>
|
||||
<text name="OwnerText">
|
||||
Leyla Linden
|
||||
</text>
|
||||
<text name="Group:">
|
||||
Gruppe:
|
||||
</text>
|
||||
<text name="GroupText">
|
||||
Leyla Linden
|
||||
</text>
|
||||
<button label="Vælg" name="Set..."/>
|
||||
<check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen's jord tildeling."/>
|
||||
<button label="Dedikér" name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/>
|
||||
|
|
@ -396,7 +390,6 @@ Kun større parceller kan vises i søgning.
|
|||
Hjemmeside:
|
||||
</text>
|
||||
<button label="Vælg" name="set_media_url"/>
|
||||
<check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
|
||||
<text left="4" name="Description:">
|
||||
Beskrivelse:
|
||||
</text>
|
||||
|
|
@ -424,7 +417,6 @@ Kun større parceller kan vises i søgning.
|
|||
<check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
|
||||
</panel>
|
||||
<panel label="LYD" name="land_audio_panel">
|
||||
<check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/>
|
||||
<check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/>
|
||||
<check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
|
||||
<check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/>
|
||||
|
|
|
|||
|
|
@ -24,16 +24,10 @@
|
|||
<text name="LabelCreatorTitle">
|
||||
Skaber:
|
||||
</text>
|
||||
<text name="LabelCreatorName">
|
||||
Nicole Linden
|
||||
</text>
|
||||
<button label="Profil..." label_selected="" name="BtnCreator"/>
|
||||
<text name="LabelOwnerTitle">
|
||||
Ejer:
|
||||
</text>
|
||||
<text name="LabelOwnerName">
|
||||
Thrax Linden
|
||||
</text>
|
||||
<button label="Profil..." label_selected="" name="BtnOwner"/>
|
||||
<text name="LabelAcquiredTitle">
|
||||
Erhvervet:
|
||||
|
|
|
|||
|
|
@ -167,15 +167,9 @@
|
|||
<text name="Creator:">
|
||||
Skaber:
|
||||
</text>
|
||||
<text name="Creator Name">
|
||||
Mrs. Esbee Linden (esbee.linden)
|
||||
</text>
|
||||
<text name="Owner:">
|
||||
Ejer:
|
||||
</text>
|
||||
<text name="Owner Name">
|
||||
Mrs. Erica "Moose" Linden (erica.linden)
|
||||
</text>
|
||||
<text name="Group:">
|
||||
Gruppe:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@
|
|||
<string name="Details">
|
||||
[SL_PROFILE]
|
||||
</string>
|
||||
<text name="user_name_small" value="Grumpity ProductEngine med et langt navn"/>
|
||||
<text name="user_slid" value="james.linden"/>
|
||||
<text name="user_details">
|
||||
Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -26,11 +26,7 @@
|
|||
<text name="display_name_label" value="Visningsnavn:"/>
|
||||
<text name="solo_username_label" value="Bugernavn:"/>
|
||||
<button name="set_name" tool_tip="Sæt visningsnavn"/>
|
||||
<text name="solo_user_name" value="Hamilton Hitchings"/>
|
||||
<text name="user_name" value="Hamilton Hitchings"/>
|
||||
<text name="user_name_small" value="Hamilton Hitchings"/>
|
||||
<text name="user_label" value="Brugernavn:"/>
|
||||
<text name="user_slid" value="hamilton.linden"/>
|
||||
<panel name="lifes_images_panel">
|
||||
<icon label="" name="2nd_life_edit_icon" tool_tip="Klik for at vælge et billede"/>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -10,10 +10,8 @@
|
|||
<text name="solo_username_label" value="Brugernavn:"/>
|
||||
<text name="status" value="Online"/>
|
||||
<text name="user_name_small" value="Se på mig med dette enormt ekstremt super lange navn"/>
|
||||
<text name="user_name" value="Jack Linden"/>
|
||||
<button name="copy_to_clipboard" tool_tip="Kopiér til udskriftsholder"/>
|
||||
<text name="user_label" value="Brugernavn:"/>
|
||||
<text name="user_slid" value="jack.linden"/>
|
||||
<tab_container name="tabs">
|
||||
<panel label="PROFIL" name="panel_profile"/>
|
||||
<panel label="FAVORITTER" name="panel_picks"/>
|
||||
|
|
|
|||
|
|
@ -48,15 +48,9 @@
|
|||
<text name="CreatorNameLabel">
|
||||
Skaber:
|
||||
</text>
|
||||
<text name="Creator Name">
|
||||
Erica Linden
|
||||
</text>
|
||||
<text name="Owner:">
|
||||
Ejer:
|
||||
</text>
|
||||
<text name="Owner Name">
|
||||
Erica Linden
|
||||
</text>
|
||||
<text name="Group_label">
|
||||
Gruppe:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -86,15 +86,9 @@
|
|||
<text name="Owner:">
|
||||
Eigentümer:
|
||||
</text>
|
||||
<text name="OwnerText">
|
||||
Leyla Linden
|
||||
</text>
|
||||
<text name="Group:">
|
||||
Gruppe:
|
||||
</text>
|
||||
<text name="GroupText">
|
||||
Leyla Linden
|
||||
</text>
|
||||
<button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/>
|
||||
<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
|
||||
<button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
|
||||
|
|
@ -398,7 +392,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
|
|||
Homepage:
|
||||
</text>
|
||||
<button label="Festlegen" name="set_media_url"/>
|
||||
<check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
|
||||
<text name="Description:">
|
||||
Inhalt:
|
||||
</text>
|
||||
|
|
@ -428,7 +421,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
|
|||
<text name="MusicURL:">
|
||||
Musik-URL:
|
||||
</text>
|
||||
<check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/>
|
||||
<text name="Sound:">
|
||||
Sound:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -24,16 +24,10 @@
|
|||
<text name="LabelCreatorTitle">
|
||||
Ersteller:
|
||||
</text>
|
||||
<text name="LabelCreatorName">
|
||||
Nicole Linden
|
||||
</text>
|
||||
<button label="Profil..." label_selected="" name="BtnCreator"/>
|
||||
<text name="LabelOwnerTitle">
|
||||
Eigentümer:
|
||||
</text>
|
||||
<text name="LabelOwnerName">
|
||||
Thrax Linden
|
||||
</text>
|
||||
<button label="Profil..." label_selected="" name="BtnOwner"/>
|
||||
<text name="LabelAcquiredTitle">
|
||||
Erworben:
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="script search" title="SKRIPT-SUCHE">
|
||||
<check_box label="Groß-/Kleinschreibung irrelevant" name="case_text"/>
|
||||
<check_box label="Groß-/Kleinschreibung ignorieren" name="case_text"/>
|
||||
<button label="Suchen" label_selected="Suchen" name="search_btn"/>
|
||||
<button label="Ersetzen" label_selected="Ersetzen" name="replace_btn"/>
|
||||
<button label="Alle ersetzen" label_selected="Alle ersetzen" name="replace_all_btn"/>
|
||||
|
|
|
|||
|
|
@ -170,15 +170,9 @@
|
|||
<text name="Creator:">
|
||||
Ersteller:
|
||||
</text>
|
||||
<text name="Creator Name">
|
||||
Frau Esbee Linden (esbee.linden)
|
||||
</text>
|
||||
<text name="Owner:">
|
||||
Eigentümer:
|
||||
</text>
|
||||
<text name="Owner Name">
|
||||
Frau Erica "Elch" Linden (erica.linden)
|
||||
</text>
|
||||
<text name="Group:">
|
||||
Gruppe:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -10,9 +10,6 @@
|
|||
<string name="Details">
|
||||
[SL_PROFILE]
|
||||
</string>
|
||||
<text name="user_name_small" value="Launische Produktengine mit langem Namen"/>
|
||||
<text name="user_name" value="Grumpity ProductEngine"/>
|
||||
<text name="user_slid" value="james.linden"/>
|
||||
<text name="user_subtitle" value="11 Monate und 3 Tage alt"/>
|
||||
<text name="user_details">
|
||||
Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede.
|
||||
|
|
|
|||
|
|
@ -16,9 +16,6 @@
|
|||
<string name="YouAreMember">
|
||||
Sie sind Mitglied
|
||||
</string>
|
||||
<text name="group_name">
|
||||
Grumpitys schlecht gelaunte Elche
|
||||
</text>
|
||||
<text name="group_subtitle">
|
||||
123 Mitglieder
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_activeim_row">
|
||||
<text name="contact_name">
|
||||
Grumpity ProductEngine
|
||||
</text>
|
||||
</panel>
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel label="im_header" name="im_header">
|
||||
<text_editor name="user_name" value="Ericag Vader"/>
|
||||
<text name="time_box" value="23:30"/>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -29,11 +29,7 @@
|
|||
<text name="display_name_label" value="Anzeigename:"/>
|
||||
<text name="solo_username_label" value="Benutzername:"/>
|
||||
<button name="set_name" tool_tip="Anzeigenamen festlegen"/>
|
||||
<text name="solo_user_name" value="Hamilton Hitchings"/>
|
||||
<text name="user_name" value="Hamilton Hitchings"/>
|
||||
<text name="user_name_small" value="Hamilton Hitchings"/>
|
||||
<text name="user_label" value="Benutzername:"/>
|
||||
<text name="user_slid" value="hamilton.linden"/>
|
||||
<panel name="lifes_images_panel">
|
||||
<panel name="second_life_image_panel">
|
||||
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten.
|
||||
</panel.string>
|
||||
<text name="help_text">
|
||||
Sie können mehrere Einwohner Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
|
||||
Sie können mehrere Einwohner in Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
|
||||
</text>
|
||||
<button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
|
||||
<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
6
|
||||
</string>
|
||||
<panel label="im_header" name="im_header">
|
||||
<text name="user_name" value="Erica Vader"/>
|
||||
<text name="time_box" value="23:30"/>
|
||||
</panel>
|
||||
<button label="Antworten" name="reply"/>
|
||||
|
|
|
|||
|
|
@ -10,10 +10,8 @@
|
|||
<text name="solo_username_label" value="Benutzername:"/>
|
||||
<text name="status" value="Online"/>
|
||||
<text name="user_name_small" value="Dieser Name ist ein ganz außerordentlich langer Name"/>
|
||||
<text name="user_name" value="Jack Linden"/>
|
||||
<button name="copy_to_clipboard" tool_tip="In Zwischenablage kopieren"/>
|
||||
<text name="user_label" value="Benutzername:"/>
|
||||
<text name="user_slid" value="jack.linden"/>
|
||||
<tab_container name="tabs" tab_min_width="60">
|
||||
<panel label="PROFIL" name="panel_profile"/>
|
||||
<panel label="AUSWAHL" name="panel_picks"/>
|
||||
|
|
|
|||
|
|
@ -48,15 +48,9 @@
|
|||
<text name="CreatorNameLabel">
|
||||
Ersteller:
|
||||
</text>
|
||||
<text name="Creator Name">
|
||||
Erica Linden
|
||||
</text>
|
||||
<text name="Owner:">
|
||||
Eigentümer:
|
||||
</text>
|
||||
<text name="Owner Name">
|
||||
Erica Linden
|
||||
</text>
|
||||
<text name="Group_label">
|
||||
Gruppe:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -220,9 +220,10 @@
|
|||
layout="topleft"
|
||||
left_pad="2"
|
||||
name="OwnerText"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
width="360">
|
||||
Leyla Linden
|
||||
TestString PleaseIgnore
|
||||
</text>
|
||||
<button
|
||||
follows="right"
|
||||
|
|
@ -260,8 +261,10 @@
|
|||
left_pad="2"
|
||||
layout="topleft"
|
||||
name="GroupText"
|
||||
translate="false"
|
||||
width="240">
|
||||
Leyla Linden </text>
|
||||
TestString PleaseIgnore
|
||||
</text>
|
||||
<button
|
||||
follows="right"
|
||||
height="23"
|
||||
|
|
@ -1404,6 +1407,10 @@ Only large parcels can be listed in search.
|
|||
label="Shopping"
|
||||
name="item11"
|
||||
value="shopping" />
|
||||
<combo_box.item
|
||||
label="Rental"
|
||||
name="item13"
|
||||
value="rental" />
|
||||
<combo_box.item
|
||||
label="Other"
|
||||
name="item12"
|
||||
|
|
@ -1461,6 +1468,10 @@ Only large parcels can be listed in search.
|
|||
label="Shopping"
|
||||
name="item11"
|
||||
value="shopping" />
|
||||
<combo_box.item
|
||||
label="Rental"
|
||||
name="item13"
|
||||
value="rental" />
|
||||
<combo_box.item
|
||||
label="Other"
|
||||
name="item12"
|
||||
|
|
@ -1638,16 +1649,6 @@ Only large parcels can be listed in search.
|
|||
name="set_media_url"
|
||||
width="70"
|
||||
top_delta="0"/>
|
||||
<check_box
|
||||
follows="top|left"
|
||||
height="16"
|
||||
label="Hide URL"
|
||||
layout="topleft"
|
||||
left="110"
|
||||
name="hide_media_url"
|
||||
tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
|
||||
width="50"
|
||||
top_pad="5"/>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
@ -1825,15 +1826,6 @@ Only large parcels can be listed in search.
|
|||
top_delta="0"
|
||||
right="-15"
|
||||
select_on_focus="true" />
|
||||
<check_box
|
||||
height="16"
|
||||
label="Hide URL"
|
||||
layout="topleft"
|
||||
name="hide_music_url"
|
||||
tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
|
||||
left_delta="10"
|
||||
top_pad="5"
|
||||
width="292" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
@ -2078,7 +2070,7 @@ Only large parcels can be listed in search.
|
|||
layout="topleft"
|
||||
left_pad="10"
|
||||
name="remove_allowed"
|
||||
right="-1"
|
||||
right="-10"
|
||||
width="100" />
|
||||
</panel>
|
||||
<panel
|
||||
|
|
@ -2128,7 +2120,7 @@ Only large parcels can be listed in search.
|
|||
layout="topleft"
|
||||
left_pad="10"
|
||||
name="remove_banned"
|
||||
right="-1"
|
||||
right="-10"
|
||||
width="100" />
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@
|
|||
left="10"
|
||||
max_val="2"
|
||||
name="gamma"
|
||||
top_pad="7"
|
||||
top_pad="11"
|
||||
width="262" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
|
|||
|
|
@ -106,9 +106,10 @@
|
|||
left_delta="78"
|
||||
name="LabelCreatorName"
|
||||
top_delta="0"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
width="170">
|
||||
Nicole Linden
|
||||
TestString PleaseIgnore
|
||||
</text>
|
||||
<button
|
||||
follows="top|right"
|
||||
|
|
@ -140,9 +141,10 @@
|
|||
left_delta="78"
|
||||
name="LabelOwnerName"
|
||||
top_delta="0"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
width="170">
|
||||
Thrax Linden
|
||||
TestString PleaseIgnore
|
||||
</text>
|
||||
<button
|
||||
follows="top|right"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
<floater
|
||||
name="region_debug_console"
|
||||
title="Region Debug"
|
||||
can_resize="true"
|
||||
layout="topleft"
|
||||
min_height="300"
|
||||
min_width="300"
|
||||
|
|
@ -12,7 +13,7 @@
|
|||
left="10"
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top|right|bottom"
|
||||
follows="left|right|bottom"
|
||||
font="Monospace"
|
||||
height="366"
|
||||
width="576"
|
||||
|
|
|
|||
|
|
@ -248,30 +248,53 @@
|
|||
function="BuildTool.commitRadioEdit"/>
|
||||
</radio_group>
|
||||
<check_box
|
||||
left="10"
|
||||
left="5"
|
||||
follows="left|top"
|
||||
height="28"
|
||||
control_name="EditLinkedParts"
|
||||
label="Edit linked"
|
||||
layout="topleft"
|
||||
name="checkbox edit linked parts"
|
||||
top_pad="2">
|
||||
top_pad="-10">
|
||||
<check_box.commit_callback
|
||||
function="BuildTool.selectComponent"/>
|
||||
</check_box>
|
||||
|
||||
<text
|
||||
text_color="LtGray_50"
|
||||
follows="top|left"
|
||||
halign="left"
|
||||
left="13"
|
||||
name="RenderingCost"
|
||||
tool_tip="Shows the rendering cost calculated for this object"
|
||||
top_pad="0"
|
||||
type="string"
|
||||
width="100">
|
||||
þ: [COUNT]
|
||||
</text>
|
||||
<button
|
||||
follows="left|top"
|
||||
height="23"
|
||||
label="Link"
|
||||
top_pad="2"
|
||||
layout="topleft"
|
||||
left="5"
|
||||
name="link_btn"
|
||||
width="50">
|
||||
<button.commit_callback
|
||||
function="BuildTool.LinkObjects"/>
|
||||
</button>
|
||||
<button
|
||||
follows="left|top"
|
||||
height="23"
|
||||
label="Unlink"
|
||||
layout="topleft"
|
||||
left_pad="2"
|
||||
name="unlink_btn"
|
||||
width="50">
|
||||
<button.commit_callback
|
||||
function="BuildTool.UnlinkObjects"/>
|
||||
</button>
|
||||
<text
|
||||
text_color="LtGray_50"
|
||||
follows="top|left"
|
||||
halign="left"
|
||||
left_pad="3"
|
||||
name="RenderingCost"
|
||||
tool_tip="Shows the rendering cost calculated for this object"
|
||||
top_delta="11"
|
||||
type="string"
|
||||
width="100">
|
||||
þ: [COUNT]
|
||||
</text>
|
||||
<check_box
|
||||
control_name="ScaleUniform"
|
||||
height="19"
|
||||
|
|
@ -299,7 +322,7 @@
|
|||
layout="topleft"
|
||||
left="143"
|
||||
name="checkbox stretch textures"
|
||||
top_pad="7"
|
||||
top_pad="-6"
|
||||
width="134" />
|
||||
<check_box
|
||||
control_name="SnapEnabled"
|
||||
|
|
@ -876,10 +899,11 @@
|
|||
layout="topleft"
|
||||
name="Creator Name"
|
||||
top_delta="0"
|
||||
translate="false"
|
||||
width="190"
|
||||
word_wrap="true"
|
||||
use_ellipses="true">
|
||||
Mrs. Esbee Linden (esbee.linden)
|
||||
TestString PleaseIgnore (please.ignore)
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -903,10 +927,11 @@
|
|||
name="Owner Name"
|
||||
left_pad="0"
|
||||
top_delta="0"
|
||||
translate="false"
|
||||
width="190"
|
||||
word_wrap="true"
|
||||
use_ellipses="true">
|
||||
Mrs. Erica "Moose" Linden (erica.linden)
|
||||
TestString PleaseIgnore (please.ignore)
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
|
|
|
|||
|
|
@ -40,10 +40,11 @@
|
|||
name="user_name_small"
|
||||
top="7"
|
||||
text_color="White"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
word_wrap="true"
|
||||
visible="false"
|
||||
value="Grumpity ProductEngine with a long name"
|
||||
value="TestString PleaseIgnore"
|
||||
width="185" />
|
||||
<text
|
||||
follows="top|left"
|
||||
|
|
@ -53,8 +54,9 @@
|
|||
name="user_name"
|
||||
top="10"
|
||||
text_color="White"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
value="Grumpity ProductEngine"
|
||||
value="TestString PleaseIgnore"
|
||||
width="190" />
|
||||
<text
|
||||
follows="top|left"
|
||||
|
|
@ -63,7 +65,8 @@
|
|||
name="user_slid"
|
||||
font="SansSerifSmallBold"
|
||||
text_color="EmphasisColor"
|
||||
value="james.linden"
|
||||
translate="false"
|
||||
value="teststring.pleaseignore"
|
||||
width="185"
|
||||
use_ellipses="true" />
|
||||
<text
|
||||
|
|
|
|||
|
|
@ -28,10 +28,11 @@
|
|||
name="group_name"
|
||||
top="10"
|
||||
text_color="White"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
width="175"
|
||||
word_wrap="false">
|
||||
Grumpity's Grumpy Group of Moose
|
||||
TestString PleaseIgnore
|
||||
</text>
|
||||
<text
|
||||
follows="all"
|
||||
|
|
|
|||
|
|
@ -8,6 +8,18 @@
|
|||
top="624"
|
||||
visible="false"
|
||||
width="128">
|
||||
<menu_item_check
|
||||
label="Voice Enabled"
|
||||
layout="topleft"
|
||||
name="EnableVoiceChat">
|
||||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="EnableVoiceChat" />
|
||||
<menu_item_check.on_check
|
||||
function="CheckControl"
|
||||
parameter="EnableVoiceChat" />
|
||||
</menu_item_check>
|
||||
<menu_item_separator/>
|
||||
<menu_item_check
|
||||
label="Gesture button"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@
|
|||
speaker.visible="false">
|
||||
</chiclet_im_adhoc>
|
||||
<text
|
||||
translate="false"
|
||||
type="string"
|
||||
name="contact_name"
|
||||
layout="topleft"
|
||||
|
|
@ -76,7 +77,7 @@
|
|||
follows="right|left"
|
||||
use_ellipses="true"
|
||||
font="SansSerifBold">
|
||||
Grumpity ProductEngine
|
||||
TestString PleaseIgnore
|
||||
</text>
|
||||
<button
|
||||
top="10"
|
||||
|
|
|
|||
|
|
@ -45,11 +45,11 @@
|
|||
min_width="214"
|
||||
height="28"
|
||||
mouse_opaque="false"
|
||||
name="chat_bar_layout_panel"
|
||||
name="chat_bar_layout_panel"
|
||||
user_resize="true"
|
||||
width="308" >
|
||||
width="310" >
|
||||
<panel
|
||||
name="chat_bar"
|
||||
name="chat_bar"
|
||||
filename="panel_nearby_chat_bar.xml"
|
||||
left="0"
|
||||
height="28"
|
||||
|
|
@ -60,11 +60,30 @@
|
|||
/>
|
||||
</layout_panel>
|
||||
<!--
|
||||
There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap)
|
||||
This 5px Panel is an indicator of where the resize handle is.
|
||||
The panel provides a gap between the resize handle icon and a button to the right.
|
||||
-->
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
follows="right"
|
||||
layout="topleft"
|
||||
max_width="5"
|
||||
min_width="5"
|
||||
name="chat_bar_resize_handle_panel"
|
||||
user_resize="false"
|
||||
width="5">
|
||||
<icon
|
||||
follows="top|right"
|
||||
height="25"
|
||||
image_name="ChatBarHandle"
|
||||
layout="topleft"
|
||||
left="-7"
|
||||
name="resize_handle"
|
||||
top="4"
|
||||
width="5" />
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
follows="left|right"
|
||||
height="28"
|
||||
layout="topleft"
|
||||
min_height="28"
|
||||
|
|
@ -72,13 +91,13 @@
|
|||
mouse_opaque="false"
|
||||
name="speak_panel"
|
||||
top_delta="0"
|
||||
user_resize="true"
|
||||
width="110">
|
||||
user_resize="false"
|
||||
width="108">
|
||||
<talk_button
|
||||
follows="left|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left="2"
|
||||
left="0"
|
||||
name="talk"
|
||||
top="5"
|
||||
width="105">
|
||||
|
|
|
|||
|
|
@ -35,9 +35,10 @@
|
|||
text_color="white"
|
||||
bg_readonly_color="black"
|
||||
top="0"
|
||||
translate="false"
|
||||
use_ellipses="true"
|
||||
valign="bottom"
|
||||
value="Ericag Vader" />
|
||||
value="TestString PleaseIgnore" />
|
||||
<text
|
||||
allow_scroll="false"
|
||||
font="SansSerifSmall"
|
||||
|
|
|
|||
|
|
@ -183,17 +183,17 @@
|
|||
left="8"
|
||||
name="bottom_panel"
|
||||
top_pad="5"
|
||||
width="303">
|
||||
width="315">
|
||||
|
||||
<layout_stack
|
||||
follows="bottom|left|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
name="layout_stack1"
|
||||
left="2"
|
||||
left="0"
|
||||
orientation="horizontal"
|
||||
top_pad="0"
|
||||
width="303">
|
||||
width="313">
|
||||
|
||||
<layout_panel
|
||||
follows="bottom|left|right"
|
||||
|
|
@ -223,7 +223,7 @@
|
|||
name="layout_panel1"
|
||||
user_resize="false"
|
||||
auto_resize="true"
|
||||
width="150">
|
||||
width="146">
|
||||
<button
|
||||
follows="bottom|left|right"
|
||||
height="23"
|
||||
|
|
@ -232,7 +232,7 @@
|
|||
name="cancel_btn"
|
||||
top="0"
|
||||
left="1"
|
||||
width="149" />
|
||||
width="145" />
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue