syncing up to viewer-development
commit
fb1facf13a
9
.hgtags
9
.hgtags
|
|
@ -73,3 +73,12 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
|
|||
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
|
||||
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
|
||||
f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
|
||||
f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
|
||||
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1
|
||||
9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1
|
||||
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
|
||||
|
|
|
|||
68
BuildParams
68
BuildParams
|
|
@ -48,6 +48,12 @@ viewer-beta.login_channel = "Second Life Beta Viewer"
|
|||
viewer-beta.build_debug_release_separately = true
|
||||
viewer-beta.build_viewer_update_version_manager = true
|
||||
|
||||
viewer-pre-beta.viewer_channel = "Second Life Beta Viewer"
|
||||
viewer-pre-beta.login_channel = "Second Life Beta Viewer"
|
||||
viewer-pre-beta.build_debug_release_separately = true
|
||||
viewer-pre-beta.build_viewer_update_version_manager = true
|
||||
|
||||
|
||||
# ========================================
|
||||
# Viewer Release
|
||||
# ========================================
|
||||
|
|
@ -63,14 +69,6 @@ viewer-pre-release.build_debug_release_separately = true
|
|||
viewer-pre-release.build_viewer_update_version_manager = true
|
||||
#viewer-pre-release.release-viewer.jira = DRTVWR-13
|
||||
|
||||
# ========================================
|
||||
# aimee
|
||||
# ========================================
|
||||
|
||||
viewer-development-import.build_debug_release_separately = true
|
||||
viewer-development-fixes.build_debug_release_separately = true
|
||||
viewer-development-tweaks.build_debug_release_separately = true
|
||||
|
||||
# =======================================
|
||||
# brad
|
||||
# ========================================
|
||||
|
|
@ -158,55 +156,11 @@ media.build_viewer_update_version_manager = false
|
|||
# oz
|
||||
# ================
|
||||
|
||||
oz_viewer-review1_coverity.coverity_product = viewer
|
||||
|
||||
oz_viewer-review1.build_Linux = true
|
||||
oz_viewer-review1_debug.build_Linux = false
|
||||
oz_viewer-review1_coverity.build_Linux = false
|
||||
|
||||
oz_viewer-review1.build_Darwin = true
|
||||
oz_viewer-review1_debug.build_Darwin = false
|
||||
oz_viewer-review1_coverity.build_Darwin = false
|
||||
|
||||
oz_viewer-review1.build_CYGWIN = true
|
||||
oz_viewer-review1.build_CYGWIN_Debug = false
|
||||
oz_viewer-review1.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review1.build_CYGWIN_Release = true
|
||||
oz_viewer-review1_debug.build_CYGWIN_Debug = true
|
||||
oz_viewer-review1_debug.build_CYGWIN_RelWithDebInfo = true
|
||||
oz_viewer-review1_debug.build_CYGWIN_Release = false
|
||||
oz_viewer-review1_coverity.build_coverity = true
|
||||
oz_viewer-review1_coverity.build_CYGWIN_Debug = false
|
||||
oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review1_coverity.build_CYGWIN_Release = false
|
||||
|
||||
oz_viewer-review2_coverity.coverity_product = viewer
|
||||
|
||||
oz_viewer-review2.build_Linux = true
|
||||
oz_viewer-review2_debug.build_Linux = false
|
||||
oz_viewer-review2_coverity.build_Linux = false
|
||||
|
||||
oz_viewer-review2.build_Darwin = true
|
||||
oz_viewer-review2_debug.build_Darwin = false
|
||||
oz_viewer-review2_coverity.build_Darwin = false
|
||||
|
||||
oz_viewer-review2.build_CYGWIN = true
|
||||
oz_viewer-review2.build_CYGWIN_Debug = false
|
||||
oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review2.build_CYGWIN_Release = true
|
||||
oz_viewer-review2_debug.build_CYGWIN_Debug = true
|
||||
oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true
|
||||
oz_viewer-review2_debug.build_CYGWIN_Release = false
|
||||
oz_viewer-review2_coverity.build_coverity = true
|
||||
oz_viewer-review2_coverity.build_CYGWIN_Debug = false
|
||||
oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review2_coverity.build_CYGWIN_Release = false
|
||||
|
||||
# ========================================
|
||||
# tofu
|
||||
# ========================================
|
||||
|
||||
tofu_viewer-development-staging.email = tofu.linden@lindenlab.com
|
||||
oz-viewer-devreview.build_debug_release_separately = true
|
||||
oz_viewer-poreview.build_debug_release_separately = true
|
||||
oz-project-1.build_debug_release_separately = true
|
||||
oz-project-2.build_debug_release_separately = true
|
||||
oz-project-3.build_debug_release_separately = true
|
||||
|
||||
# ========================================
|
||||
# enus
|
||||
|
|
|
|||
|
|
@ -412,6 +412,7 @@ Jonathan Yap
|
|||
STORM-975
|
||||
STORM-990
|
||||
STORM-1020
|
||||
STORM-1064
|
||||
Kage Pixel
|
||||
VWR-11
|
||||
Ken March
|
||||
|
|
|
|||
|
|
@ -88,9 +88,16 @@ bool translate_init(std::string comma_delim_path_list,
|
|||
std::vector<std::string> paths;
|
||||
LLStringUtil::getTokens(comma_delim_path_list, paths, ","); // split over ','
|
||||
|
||||
for(std::vector<std::string>::iterator it = paths.begin(), end_it = paths.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
(*it) = gDirUtilp->findSkinnedFilename(*it, base_xml_name);
|
||||
}
|
||||
|
||||
// suck the translation xml files into memory
|
||||
LLXMLNodePtr root;
|
||||
bool success = LLXMLNode::getLayeredXMLNode(base_xml_name, root, paths);
|
||||
bool success = LLXMLNode::getLayeredXMLNode(root, paths);
|
||||
if (!success)
|
||||
{
|
||||
// couldn't load string table XML
|
||||
|
|
|
|||
|
|
@ -103,10 +103,30 @@ int LLProcessLauncher::launch(void)
|
|||
char *args2 = new char[args.size() + 1];
|
||||
strcpy(args2, args.c_str());
|
||||
|
||||
if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo ) )
|
||||
const char * working_directory = 0;
|
||||
if(!mWorkingDir.empty()) working_directory = mWorkingDir.c_str();
|
||||
if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, working_directory, &sinfo, &pinfo ) )
|
||||
{
|
||||
// TODO: do better than returning the OS-specific error code on failure...
|
||||
result = GetLastError();
|
||||
|
||||
LPTSTR error_str = 0;
|
||||
if(
|
||||
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL,
|
||||
result,
|
||||
0,
|
||||
(LPTSTR)&error_str,
|
||||
0,
|
||||
NULL)
|
||||
!= 0)
|
||||
{
|
||||
char message[256];
|
||||
wcstombs(message, error_str, 256);
|
||||
message[255] = 0;
|
||||
llwarns << "CreateProcessA failed: " << message << llendl;
|
||||
LocalFree(error_str);
|
||||
}
|
||||
|
||||
if(result == 0)
|
||||
{
|
||||
// Make absolutely certain we return a non-zero value on failure.
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@
|
|||
#define LL_LLVERSIONVIEWER_H
|
||||
|
||||
const S32 LL_VERSION_MAJOR = 2;
|
||||
const S32 LL_VERSION_MINOR = 5;
|
||||
const S32 LL_VERSION_PATCH = 3;
|
||||
const S32 LL_VERSION_MINOR = 6;
|
||||
const S32 LL_VERSION_PATCH = 2;
|
||||
const S32 LL_VERSION_BUILD = 0;
|
||||
|
||||
const char * const LL_CHANNEL = "Second Life Developer";
|
||||
|
|
|
|||
|
|
@ -157,6 +157,8 @@ F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance betwe
|
|||
F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
|
||||
F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
|
||||
LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
|
||||
LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
|
||||
LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
|
||||
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
|
||||
|
||||
inline LLVector3::LLVector3(void)
|
||||
|
|
@ -491,6 +493,17 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
|
|||
return project_axis * (a * project_axis);
|
||||
}
|
||||
|
||||
inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
|
||||
{
|
||||
return projected_vec(a, b);
|
||||
}
|
||||
|
||||
inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b)
|
||||
{
|
||||
return a - projected_vec(a, b);
|
||||
}
|
||||
|
||||
|
||||
inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
|
||||
{
|
||||
return LLVector3(
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ void LLPluginProcessParent::errorState(void)
|
|||
void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
|
||||
{
|
||||
mProcess.setExecutable(launcher_filename);
|
||||
mProcess.setWorkingDirectory(plugin_dir);
|
||||
mPluginFile = plugin_filename;
|
||||
mPluginDir = plugin_dir;
|
||||
mCPUUsage = 0.0f;
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ void LLDockControl::moveDockable()
|
|||
break;
|
||||
}
|
||||
|
||||
S32 max_available_height = rootRect.getHeight() - mDockTongueY - mDockTongue->getHeight();
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -2590,9 +2590,13 @@ void LLFloaterView::draw()
|
|||
|
||||
LLRect LLFloaterView::getSnapRect() const
|
||||
{
|
||||
LLRect snap_rect = getRect();
|
||||
snap_rect.mBottom += mSnapOffsetBottom;
|
||||
snap_rect.mRight -= mSnapOffsetRight;
|
||||
LLRect snap_rect = getLocalRect();
|
||||
|
||||
LLView* snap_view = mSnapView.get();
|
||||
if (snap_view)
|
||||
{
|
||||
snap_view->localRectToOtherView(snap_view->getLocalRect(), &snap_rect, this);
|
||||
}
|
||||
|
||||
return snap_rect;
|
||||
}
|
||||
|
|
@ -2865,7 +2869,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
|
|||
// close callback
|
||||
if (p.close_callback.isProvided())
|
||||
{
|
||||
mCloseSignal.connect(initCommitCallback(p.close_callback));
|
||||
setCloseCallback(initCommitCallback(p.close_callback));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2875,6 +2879,11 @@ boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_
|
|||
return mMinimizeSignal->connect(cb);
|
||||
}
|
||||
|
||||
boost::signals2::connection LLFloater::setCloseCallback( const commit_signal_t::slot_type& cb )
|
||||
{
|
||||
return mCloseSignal.connect(cb);
|
||||
}
|
||||
|
||||
LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
|
||||
|
||||
bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node)
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ public:
|
|||
bool buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL);
|
||||
|
||||
boost::signals2::connection setMinimizeCallback( const commit_signal_t::slot_type& cb );
|
||||
boost::signals2::connection setCloseCallback( const commit_signal_t::slot_type& cb );
|
||||
|
||||
void initFromParams(const LLFloater::Params& p);
|
||||
bool initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node = NULL);
|
||||
|
|
@ -495,10 +496,10 @@ public:
|
|||
// value is not defined.
|
||||
S32 getZOrder(LLFloater* child);
|
||||
|
||||
void setSnapOffsetBottom(S32 offset) { mSnapOffsetBottom = offset; }
|
||||
void setSnapOffsetRight(S32 offset) { mSnapOffsetRight = offset; }
|
||||
void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }
|
||||
|
||||
private:
|
||||
LLHandle<LLView> mSnapView;
|
||||
BOOL mFocusCycleMode;
|
||||
S32 mSnapOffsetBottom;
|
||||
S32 mSnapOffsetRight;
|
||||
|
|
|
|||
|
|
@ -1936,9 +1936,15 @@ bool LLMenuGL::scrollItems(EScrollingDirection direction)
|
|||
{
|
||||
item_list_t::reverse_iterator first_visible_item_iter = mItems.rend();
|
||||
|
||||
// Need to scroll through number of actual existing items in menu.
|
||||
// Otherwise viewer will hang for a time needed to scroll U32_MAX
|
||||
// times in std::advance(). STORM-659.
|
||||
size_t nitems = mItems.size();
|
||||
U32 scrollable_items = nitems < mMaxScrollableItems ? nitems : mMaxScrollableItems;
|
||||
|
||||
// Advance by mMaxScrollableItems back from the end of the list
|
||||
// to make the last item visible.
|
||||
std::advance(first_visible_item_iter, mMaxScrollableItems);
|
||||
std::advance(first_visible_item_iter, scrollable_items);
|
||||
mFirstVisibleItem = *first_visible_item_iter;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1195,16 +1195,18 @@ bool LLNotifications::uniqueFilter(LLNotificationPtr pNotif)
|
|||
|
||||
bool LLNotifications::uniqueHandler(const LLSD& payload)
|
||||
{
|
||||
std::string cmd = payload["sigtype"];
|
||||
|
||||
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
|
||||
if (pNotif && pNotif->hasUniquenessConstraints())
|
||||
{
|
||||
if (payload["sigtype"].asString() == "add")
|
||||
if (cmd == "add")
|
||||
{
|
||||
// not a duplicate according to uniqueness criteria, so we keep it
|
||||
// and store it for future uniqueness checks
|
||||
mUniqueNotifications.insert(std::make_pair(pNotif->getName(), pNotif));
|
||||
}
|
||||
else if (payload["sigtype"].asString() == "delete")
|
||||
else if (cmd == "delete")
|
||||
{
|
||||
mUniqueNotifications.erase(pNotif->getName());
|
||||
}
|
||||
|
|
@ -1217,12 +1219,16 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
|
|||
{
|
||||
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
|
||||
|
||||
if (!pNotif || !pNotif->hasUniquenessConstraints())
|
||||
std::string cmd = payload["sigtype"];
|
||||
|
||||
if (!pNotif || cmd != "add")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// checks against existing unique notifications
|
||||
// Update the existing unique notification with the data from this particular instance...
|
||||
// This guarantees that duplicate notifications will be collapsed to the one
|
||||
// most recently triggered
|
||||
for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
|
||||
existing_it != mUniqueNotifications.end();
|
||||
++existing_it)
|
||||
|
|
@ -1235,7 +1241,7 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
|
|||
// of this unique notification and update it
|
||||
existing_notification->updateFrom(pNotif);
|
||||
// then delete the new one
|
||||
pNotif->cancel();
|
||||
cancel(pNotif);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1300,26 +1306,14 @@ void LLNotifications::createDefaultChannels()
|
|||
// usage LLStopWhenHandled combiner in LLStandardSignal
|
||||
LLNotifications::instance().getChannel("Unique")->
|
||||
connectAtFrontChanged(boost::bind(&LLNotifications::uniqueHandler, this, _1));
|
||||
// failedUniquenessTest slot isn't necessary
|
||||
// LLNotifications::instance().getChannel("Unique")->
|
||||
// connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
|
||||
LLNotifications::instance().getChannel("Unique")->
|
||||
connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
|
||||
LLNotifications::instance().getChannel("Ignore")->
|
||||
connectFailedFilter(&handleIgnoredNotification);
|
||||
LLNotifications::instance().getChannel("VisibilityRules")->
|
||||
connectFailedFilter(&visibilityRuleMached);
|
||||
}
|
||||
|
||||
bool LLNotifications::addTemplate(const std::string &name,
|
||||
LLNotificationTemplatePtr theTemplate)
|
||||
{
|
||||
if (mTemplates.count(name))
|
||||
{
|
||||
llwarns << "LLNotifications -- attempted to add template '" << name << "' twice." << llendl;
|
||||
return false;
|
||||
}
|
||||
mTemplates[name] = theTemplate;
|
||||
return true;
|
||||
}
|
||||
|
||||
LLNotificationTemplatePtr LLNotifications::getTemplate(const std::string& name)
|
||||
{
|
||||
|
|
@ -1416,27 +1410,45 @@ void replaceFormText(LLNotificationForm::Params& form, const std::string& patter
|
|||
}
|
||||
}
|
||||
|
||||
void addPathIfExists(const std::string& new_path, std::vector<std::string>& paths)
|
||||
{
|
||||
if (gDirUtilp->fileExists(new_path))
|
||||
{
|
||||
paths.push_back(new_path);
|
||||
}
|
||||
}
|
||||
|
||||
bool LLNotifications::loadTemplates()
|
||||
{
|
||||
const std::string xml_filename = "notifications.xml";
|
||||
std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
|
||||
std::vector<std::string> search_paths;
|
||||
|
||||
std::string skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
|
||||
std::string localized_skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
|
||||
|
||||
addPathIfExists(gDirUtilp->getDefaultSkinDir() + skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getDefaultSkinDir() + localized_skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getSkinDir() + skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getSkinDir() + localized_skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getUserSkinDir() + skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getUserSkinDir() + localized_skin_relative_path, search_paths);
|
||||
|
||||
std::string base_filename = search_paths.front();
|
||||
LLXMLNodePtr root;
|
||||
BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
|
||||
BOOL success = LLXMLNode::getLayeredXMLNode(root, search_paths);
|
||||
|
||||
if (!success || root.isNull() || !root->hasName( "notifications" ))
|
||||
{
|
||||
llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
|
||||
llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLNotificationTemplate::Notifications params;
|
||||
LLXUIParser parser;
|
||||
parser.readXUI(root, params, full_filename);
|
||||
parser.readXUI(root, params, base_filename);
|
||||
|
||||
if(!params.validateBlock())
|
||||
{
|
||||
llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
|
||||
llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1483,7 +1495,7 @@ bool LLNotifications::loadTemplates()
|
|||
replaceFormText(it->form_ref.form, "$ignoretext", it->form_ref.form_template.ignore_text);
|
||||
}
|
||||
}
|
||||
addTemplate(it->name, LLNotificationTemplatePtr(new LLNotificationTemplate(*it)));
|
||||
mTemplates[it->name] = LLNotificationTemplatePtr(new LLNotificationTemplate(*it));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -1578,7 +1590,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
|
|||
|
||||
void LLNotifications::cancel(LLNotificationPtr pNotif)
|
||||
{
|
||||
if (pNotif == NULL) return;
|
||||
if (pNotif == NULL || pNotif->isCancelled()) return;
|
||||
|
||||
LLNotificationSet::iterator it=mItems.find(pNotif);
|
||||
if (it == mItems.end())
|
||||
|
|
@ -1680,7 +1692,6 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
|
||||
{
|
||||
// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
|
||||
|
||||
lldebugs
|
||||
<< "notification \"" << n->getName() << "\" "
|
||||
<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
|
||||
|
|
@ -1728,7 +1739,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
// Response property is empty. Cancel this notification.
|
||||
lldebugs << "cancelling notification " << n->getName() << llendl;
|
||||
|
||||
n->cancel();
|
||||
cancel(n);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -863,10 +863,11 @@ class LLNotifications :
|
|||
|
||||
friend class LLSingleton<LLNotifications>;
|
||||
public:
|
||||
// load notification descriptions from file;
|
||||
// OK to call more than once because it will reload
|
||||
bool loadTemplates();
|
||||
|
||||
// load all notification descriptions from file
|
||||
// calling more than once will overwrite existing templates
|
||||
// but never delete a template
|
||||
bool loadTemplates();
|
||||
|
||||
// load visibility rules from file;
|
||||
// OK to call more than once because it will reload
|
||||
bool loadVisibilityRules();
|
||||
|
|
@ -950,8 +951,6 @@ private:
|
|||
LLNotificationChannelPtr pHistoryChannel;
|
||||
LLNotificationChannelPtr pExpirationChannel;
|
||||
|
||||
// put your template in
|
||||
bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate);
|
||||
TemplateMap mTemplates;
|
||||
|
||||
VisibilityRuleList mVisibilityRules;
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ void LLRadioGroup::setValue( const LLSD& value )
|
|||
}
|
||||
else
|
||||
{
|
||||
llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
|
||||
setSelectedIndex(-1, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,7 +152,27 @@ static LLFastTimer::DeclareTimer FTM_XML_PARSE("XML Reading/Parsing");
|
|||
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root)
|
||||
{
|
||||
LLFastTimer timer(FTM_XML_PARSE);
|
||||
return LLXMLNode::getLayeredXMLNode(xui_filename, root, LLUI::getXUIPaths());
|
||||
|
||||
std::vector<std::string> paths;
|
||||
std::string path = gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), xui_filename);
|
||||
if (!path.empty())
|
||||
{
|
||||
paths.push_back(path);
|
||||
}
|
||||
|
||||
std::string localize_path = gDirUtilp->findSkinnedFilename(LLUI::getLocalizedSkinPath(), xui_filename);
|
||||
if (!localize_path.empty() && localize_path != path)
|
||||
{
|
||||
paths.push_back(localize_path);
|
||||
}
|
||||
|
||||
if (paths.empty())
|
||||
{
|
||||
// sometimes whole path is passed in as filename
|
||||
paths.push_back(xui_filename);
|
||||
}
|
||||
|
||||
return LLXMLNode::getLayeredXMLNode(root, paths);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -214,7 +234,7 @@ LLView *LLUICtrlFactory::createFromXML(LLXMLNodePtr node, LLView* parent, const
|
|||
|
||||
std::string LLUICtrlFactory::getCurFileName()
|
||||
{
|
||||
return mFileNames.empty() ? "" : gDirUtilp->getWorkingDir() + gDirUtilp->getDirDelimiter() + mFileNames.back();
|
||||
return mFileNames.empty() ? "" : mFileNames.back();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ void LLView::removeChild(LLView* child)
|
|||
}
|
||||
else
|
||||
{
|
||||
llerrs << "LLView::removeChild called with non-child" << llendl;
|
||||
llwarns << child->getName() << "is not a child of " << getName() << llendl;
|
||||
}
|
||||
updateBoundingRect();
|
||||
}
|
||||
|
|
@ -1958,7 +1958,7 @@ void LLView::centerWithin(const LLRect& bounds)
|
|||
translate( left - getRect().mLeft, bottom - getRect().mBottom );
|
||||
}
|
||||
|
||||
BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const
|
||||
BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const
|
||||
{
|
||||
const LLView* cur_view = this;
|
||||
const LLView* root_view = NULL;
|
||||
|
|
@ -2001,7 +2001,7 @@ BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LL
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const
|
||||
BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const
|
||||
{
|
||||
LLRect cur_rect = local;
|
||||
const LLView* cur_view = this;
|
||||
|
|
|
|||
|
|
@ -406,8 +406,8 @@ public:
|
|||
BOOL blockMouseEvent(S32 x, S32 y) const;
|
||||
|
||||
// See LLMouseHandler virtuals for screenPointToLocal and localPointToScreen
|
||||
BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const;
|
||||
BOOL localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const;
|
||||
BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const;
|
||||
BOOL localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const;
|
||||
void screenRectToLocal( const LLRect& screen, LLRect* local ) const;
|
||||
void localRectToScreen( const LLRect& local, LLRect* screen ) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@ const std::string LLDir::findFile(const std::string& filename, const std::vector
|
|||
{
|
||||
if (!search_path_iter->empty())
|
||||
{
|
||||
std::string filename_and_path = (*search_path_iter) + getDirDelimiter() + filename;
|
||||
std::string filename_and_path = (*search_path_iter);
|
||||
if (!filename.empty())
|
||||
{
|
||||
filename_and_path += getDirDelimiter() + filename;
|
||||
}
|
||||
if (fileExists(filename_and_path))
|
||||
{
|
||||
return filename_and_path;
|
||||
|
|
|
|||
|
|
@ -835,7 +835,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
|
|||
return num_saved;
|
||||
}
|
||||
|
||||
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values)
|
||||
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values)
|
||||
{
|
||||
std::string name;
|
||||
LLSD settings;
|
||||
|
|
@ -908,8 +908,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
|
|||
}
|
||||
else if(existing_control->isPersisted())
|
||||
{
|
||||
|
||||
existing_control->setValue(control_map["Value"]);
|
||||
existing_control->setValue(control_map["Value"], save_values);
|
||||
}
|
||||
// *NOTE: If not persisted and not setting defaults,
|
||||
// the value should not get loaded.
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ public:
|
|||
// as the given type.
|
||||
U32 loadFromFileLegacy(const std::string& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
|
||||
U32 saveToFile(const std::string& filename, BOOL nondefault_only);
|
||||
U32 loadFromFile(const std::string& filename, bool default_values = false);
|
||||
U32 loadFromFile(const std::string& filename, bool default_values = false, bool save_values = true);
|
||||
void resetToDefaults();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -859,23 +859,21 @@ BOOL LLXMLNode::isFullyDefault()
|
|||
}
|
||||
|
||||
// static
|
||||
bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
|
||||
bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,
|
||||
const std::vector<std::string>& paths)
|
||||
{
|
||||
std::string full_filename = gDirUtilp->findSkinnedFilename(paths.front(), xui_filename);
|
||||
if (full_filename.empty())
|
||||
if (paths.empty()) return false;
|
||||
|
||||
std::string filename = paths.front();
|
||||
if (filename.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!LLXMLNode::parseFile(full_filename, root, NULL))
|
||||
|
||||
if (!LLXMLNode::parseFile(filename, root, NULL))
|
||||
{
|
||||
// try filename as passed in since sometimes we load an xml file from a user-supplied path
|
||||
if (!LLXMLNode::parseFile(xui_filename, root, NULL))
|
||||
{
|
||||
llwarns << "Problem reading UI description file: " << xui_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
llwarns << "Problem reading UI description file: " << filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLXMLNodePtr updateRoot;
|
||||
|
|
@ -887,7 +885,7 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
|
|||
std::string nodeName;
|
||||
std::string updateName;
|
||||
|
||||
std::string layer_filename = gDirUtilp->findSkinnedFilename((*itor), xui_filename);
|
||||
std::string layer_filename = *itor;
|
||||
if(layer_filename.empty())
|
||||
{
|
||||
// no localized version of this file, that's ok, keep looking
|
||||
|
|
@ -896,7 +894,7 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
|
|||
|
||||
if (!LLXMLNode::parseFile(layer_filename, updateRoot, NULL))
|
||||
{
|
||||
llwarns << "Problem reading localized UI description file: " << (*itor) + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
|
||||
llwarns << "Problem reading localized UI description file: " << layer_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -149,8 +149,7 @@ public:
|
|||
LLXMLNodePtr& update_node);
|
||||
static LLXMLNodePtr replaceNode(LLXMLNodePtr node, LLXMLNodePtr replacement_node);
|
||||
|
||||
static bool getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
|
||||
const std::vector<std::string>& paths);
|
||||
static bool getLayeredXMLNode(LLXMLNodePtr& root, const std::vector<std::string>& paths);
|
||||
|
||||
|
||||
// Write standard XML file header:
|
||||
|
|
|
|||
|
|
@ -255,3 +255,8 @@ std::string LLTrans::getCountString(const std::string& language, const std::stri
|
|||
std::string key = llformat("%s%s", xml_desc.c_str(), form);
|
||||
return getString(key, args);
|
||||
}
|
||||
|
||||
void LLTrans::setDefaultArg(const std::string& name, const std::string& value)
|
||||
{
|
||||
sDefaultArgs[name] = value;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ public:
|
|||
return sDefaultArgs;
|
||||
}
|
||||
|
||||
static void setDefaultArg(const std::string& name, const std::string& value);
|
||||
|
||||
// insert default args into an arg list
|
||||
static void getArgs(LLStringUtil::format_map_t& args)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3,6 +3,12 @@
|
|||
project(winmm_shim)
|
||||
|
||||
### winmm_shim
|
||||
# *HACK - override msvcrt implementation (intialized on 00-Common) to be
|
||||
# statically linked for winmm.dll this relies on vc taking the last flag on
|
||||
# the command line
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
|
||||
|
||||
set(winmm_shim_SOURCE_FILES
|
||||
forwarding_api.cpp
|
||||
|
|
|
|||
|
|
@ -247,6 +247,7 @@ set(viewer_SOURCE_FILES
|
|||
llhudeffectlookat.cpp
|
||||
llhudeffectpointat.cpp
|
||||
llhudeffecttrail.cpp
|
||||
llhudeffectblob.cpp
|
||||
llhudicon.cpp
|
||||
llhudmanager.cpp
|
||||
llhudnametag.cpp
|
||||
|
|
@ -788,6 +789,7 @@ set(viewer_HEADER_FILES
|
|||
llhudeffectlookat.h
|
||||
llhudeffectpointat.h
|
||||
llhudeffecttrail.h
|
||||
llhudeffectblob.h
|
||||
llhudicon.h
|
||||
llhudmanager.h
|
||||
llhudnametag.h
|
||||
|
|
@ -1300,22 +1302,20 @@ endif (WINDOWS)
|
|||
set(viewer_XUI_FILES
|
||||
skins/default/colors.xml
|
||||
skins/default/textures/textures.xml
|
||||
skins/minimal/colors.xml
|
||||
skins/minimal/textures/textures.xml
|
||||
|
||||
|
||||
|
||||
)
|
||||
file(GLOB DEFAULT_XUI_FILE_GLOB_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/*.xml)
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml)
|
||||
list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST})
|
||||
|
||||
file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/widgets/*.xml)
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/widgets/*.xml)
|
||||
list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST})
|
||||
|
||||
file(GLOB SILVER_XUI_FILE_GLOB_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/*.xml)
|
||||
list(APPEND viewer_XUI_FILES ${SILVER_XUI_FILE_GLOB_LIST})
|
||||
|
||||
# Cannot append empty lists in CMake, wait until we have files here.
|
||||
#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml)
|
||||
|
|
@ -1345,6 +1345,7 @@ set(viewer_APPSETTINGS_FILES
|
|||
app_settings/settings_crash_behavior.xml
|
||||
app_settings/settings_files.xml
|
||||
app_settings/settings_per_account.xml
|
||||
app_settings/settings_minimal.xml
|
||||
app_settings/std_bump.ini
|
||||
app_settings/trees.xml
|
||||
app_settings/ultra_graphics.xml
|
||||
|
|
|
|||
|
|
@ -3895,3 +3895,22 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
|
|||
e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
|
||||
glmQ1A==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
||||
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
|
||||
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
|
||||
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
|
||||
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
|
||||
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
|
||||
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
|
||||
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
|
||||
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
|
||||
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
|
||||
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
|
||||
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
|
||||
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
|
||||
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
||||
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
|
||||
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
|
||||
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
|
||||
-----END CERTIFICATE-----
|
||||
|
|
|
|||
|
|
@ -261,6 +261,24 @@
|
|||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
<key>sessionsettings</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
<string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
|
||||
<key>count</key>
|
||||
<integer>1</integer>
|
||||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
<key>usersessionsettings</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
<string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
|
||||
<key>count</key>
|
||||
<integer>1</integer>
|
||||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
<key>login</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
|
|
|
|||
|
|
@ -617,7 +617,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://interest.secondlife.com/viewer/avatar</string>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>AvatarBakedTextureUploadTimeout</key>
|
||||
<map>
|
||||
|
|
@ -2588,7 +2588,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://www.secondlife.com</string>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>DisableCameraConstraints</key>
|
||||
<map>
|
||||
|
|
@ -2832,6 +2832,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DoubleClickShowWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable double-click to show world map from mini map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>DragAndDropToolTipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -3209,7 +3220,7 @@
|
|||
<key>FirstRunThisInstall</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Specifies that you have not run the viewer since you installed the latest update</string>
|
||||
<string>Specifies that you have not run the viewer since you performed a clean install</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -3217,7 +3228,18 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FirstSelectedDisabledPopups</key>
|
||||
<key>FirstLoginThisInstall</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Specifies that you have not logged in with the viewer since you performed a clean install</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FirstSelectedDisabledPopups</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Return false if there is not disabled popup selected in the list of floater preferences popups</string>
|
||||
|
|
@ -3910,6 +3932,17 @@
|
|||
<key>Value</key>
|
||||
<string>https://my.secondlife.com/[AGENT_NAME]</string>
|
||||
</map>
|
||||
<key>WebProfileNonProductionURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL for Web Profiles on Non-Production grids</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>https://my-demo.secondlife.com/[AGENT_NAME]</string>
|
||||
</map>
|
||||
<key>HighResSnapshot</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -11517,7 +11550,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<integer>3.0</integer>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
<key>InterpolationPhaseOut</key>
|
||||
<map>
|
||||
|
|
@ -11528,7 +11561,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<integer>1.0</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>VerboseLogs</key>
|
||||
<map>
|
||||
|
|
@ -12377,17 +12410,6 @@
|
|||
<key>Value</key>
|
||||
<real>1200.0</real>
|
||||
</map>
|
||||
<key>AvatarPickerHintTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Number of seconds to wait before telling resident about avatar picker.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>600.0</real>
|
||||
</map>
|
||||
<key>SidePanelHintTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -12410,5 +12432,203 @@
|
|||
<key>Value</key>
|
||||
<string>name</string>
|
||||
</map>
|
||||
<key>SessionSettingsFile</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Settings that are a applied per session (not saved).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>UserSessionSettingsFile</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>User settings that are a applied per session (not saved).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string />
|
||||
</map>
|
||||
<key>OpenSidePanelsInFloaters</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If true, will always open side panel contents in a floater.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AvatarInspectorTooltipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Seconds before displaying avatar inspector tooltip</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.35</real>
|
||||
</map>
|
||||
<key>ObjectInspectorTooltipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Seconds before displaying object inspector tooltip</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.35</real>
|
||||
</map>
|
||||
<key>SLURLTeleportDirectly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableClassifieds</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable creation of new classified ads from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableGroupInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable viewing and editing of group info from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnablePicks</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable editing of picks from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable opening world map from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableAvatarPay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable paying other avatars from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableVoiceCall</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable voice calls from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableAvatarShare</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable sharing from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>SearchFromAddressBar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Can enter search queries into navigation address bar</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LogInventoryDecline</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Log in system chat whenever an inventory offer is declined</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>UseHTTPInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow use of http inventory transfers instead of UDP</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ClickToWalk</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Click in world to walk to location</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowOfferedInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -1,148 +1,64 @@
|
|||
<llsd>
|
||||
<map>
|
||||
<key>Locations</key>
|
||||
<map>
|
||||
<!--
|
||||
The Locations LLSD block specifies the usage pattern of
|
||||
the settings file types
|
||||
Each location is represented by a LLSD containing the following values:
|
||||
PathIndex = hard coded path indicies.
|
||||
Files = map of files to load
|
||||
Each file can have:
|
||||
Requirement = level of necessity for loading.
|
||||
0 ( or Req. no key) = do not load
|
||||
1 = required, fail if not found
|
||||
NameFromSetting = Use the given setting to specify the name. Not valid for
|
||||
"Default"
|
||||
-->
|
||||
<key>Comment</key>
|
||||
<string>List location from which to load files, and the rules about loading those files.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>LLSD</string>
|
||||
<key>Value</key>
|
||||
<map>
|
||||
<key>Default</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>2</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Global</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>PerAccount</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_per_account.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>CrashSettings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_crash_behavior.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>Warnings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>ignorable_dialogs.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>User</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>1</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Global</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>ClientSettingsFile</string>
|
||||
</map>
|
||||
<key>CrashSettings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_crash_behavior.xml</string>
|
||||
</map>
|
||||
<key>Warnings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>ignorable_dialogs.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>WarningSettingsFile</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>Account</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>3</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>PerAccount</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_per_account.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>PerAccountSettingsFile</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>DefaultSkin</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>17</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Skinning</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>colors.xml</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>CurrentSkin</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>10</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Skinning</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>colors.xml</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>UserSkin</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>14</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Skinning</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>colors.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>SkinningSettingsFile</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
<settings_files>
|
||||
<group name="Default"
|
||||
path_index="2">
|
||||
<file name="Global"
|
||||
file_name="settings.xml"
|
||||
required="true"/>
|
||||
<file name="PerAccount"
|
||||
file_name="settings_per_account.xml"
|
||||
required="true"/>
|
||||
<file name="CrashSettings"
|
||||
file_name="settings_crash_behavior.xml"
|
||||
required="true"/>
|
||||
<file name="Warnings"
|
||||
file_name="ignorable_dialogs.xml"
|
||||
required="true"/>
|
||||
</group>
|
||||
<group name="User"
|
||||
path_index="1">
|
||||
<file name="Global"
|
||||
file_name="settings.xml"
|
||||
file_name_setting="ClientSettingsFile"/>
|
||||
<file name="CrashSettings"
|
||||
file_name="settings_crash_behavior"/>
|
||||
<file name="Warnings"
|
||||
file_name="ignorable_dialogs.xml"
|
||||
file_name_setting="WarningSettingsFile"/>
|
||||
</group>
|
||||
<group name="Account"
|
||||
path_index="3">
|
||||
<file name="PerAccount"
|
||||
file_name="settings_per_account.xml"
|
||||
file_name_setting="PerAccountSettingsFile"/>
|
||||
</group>
|
||||
<group name="Session"
|
||||
path_index="2">
|
||||
<file name="Global"
|
||||
file_name="session.xml"
|
||||
file_name_setting="SessionSettingsFile"
|
||||
persistent="false"/>
|
||||
</group>
|
||||
<group name="UserSession"
|
||||
path_index="1">
|
||||
<file name="Global"
|
||||
file_name="session.xml"
|
||||
file_name_setting="UserSessionSettingsFile"
|
||||
persistent="false"/>
|
||||
</group>
|
||||
<group name="DefaultSkin"
|
||||
path_index="17">
|
||||
<file name="Skinning"
|
||||
file_name="colors.xml"/>
|
||||
</group>
|
||||
<group name="CurrentSkin"
|
||||
path_index="10">
|
||||
<file name="Skinning"
|
||||
file_name="colors.xml"/>
|
||||
</group>
|
||||
<group name="UserSkin"
|
||||
path_index="14">
|
||||
<file name="Skinning"
|
||||
file_name="colors.xml"
|
||||
file_name_setting="SkinningSettingsFile"/>
|
||||
</group>
|
||||
</settings_files>
|
||||
|
|
@ -0,0 +1,406 @@
|
|||
<llsd>
|
||||
<map>
|
||||
<key>ChannelBottomPanelMargin</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Space from a lower toast to the Bottom Tray</string>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>2</integer>
|
||||
</map>
|
||||
<key>ClickActionBuyEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable click to buy actions in tool pie menu</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ClickActionPayEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable click to pay actions in tool pie menu</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableGrab</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use Ctrl+mouse to grab and manipulate objects</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableMouselook</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow first person perspective and mouse control of camera</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableVoiceChat</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable talking to other residents with a microphone</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>HelpURLFormat</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/howto/index.html?topic=[TOPIC]</string>
|
||||
</map>
|
||||
<key>PreferredMaturity</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>21</integer>
|
||||
</map>
|
||||
<key>RenderTrackerBeacon</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Display tracking arrow and beacon to target avatar, teleport destination</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowScriptErrors</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show script errors</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowScriptErrorsLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show script error in chat or window</string>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>SkinCurrent</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The currently selected skin.</string>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>minimal</string>
|
||||
</map>
|
||||
<key>UseExternalBrowser</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use default browser when opening web pages instead of in-world browser.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceCallsRejectAll</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Silently reject all incoming voice calls.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>VoiceDisableMic</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Completely disable the ability to open the mic.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ScriptsCanShowUI</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ChatFontSize</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Size of chat text in chat console (0 = small, 1 = big, 2 = extra large)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AvatarPickerHintTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Number of seconds to wait before telling resident about avatar picker.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.0</real>
|
||||
</map>
|
||||
<key>RenderShowGroupTitleAll</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show group titles in name labels</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>OpenSidePanelsInFloaters</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If true, will always open side panel contents in a floater.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AvatarInspectorTooltipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Seconds before displaying avatar inspector tooltip</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.1</real>
|
||||
</map>
|
||||
<key>AFKTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>
|
||||
Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
|
||||
Valid values are: 0, 120, 300, 600, 1800
|
||||
</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<real>0</real>
|
||||
</map>
|
||||
<key>SLURLTeleportDirectly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableClassifieds</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable creation of new classified ads</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableGroupInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable viewing and editing of group info.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnablePicks</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable editing of picks</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable opening world map from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableAvatarPay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable paying other avatars from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableVoiceCall</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable voice calls from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableAvatarShare</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable sharing from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DoubleClickShowWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable double-click to show world map from mini map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableGroupChatPopups</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable Incoming Group Chat Popups</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>SearchFromAddressBar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Can enter search queries into navigation address bar</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DestinationGuideURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Destination guide contents</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/guide.html</string>
|
||||
</map>
|
||||
<key>AvatarPickerURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Avatar picker contents</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/avatars.html</string>
|
||||
</map>
|
||||
<key>LogInventoryDecline</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Log in system chat whenever an inventory offer is declined</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>UseHTTPInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow use of http inventory transfers instead of UDP</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ClickToWalk</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Click in world to walk to location</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ShowOfferedInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
@ -2979,6 +2979,9 @@ public:
|
|||
gAgent.setGenderChosen(TRUE);
|
||||
}
|
||||
|
||||
// release avatar picker keyboard focus
|
||||
gFocusMgr.setKeyboardFocus( NULL );
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/**
|
||||
* @file llappviewer.cpp
|
||||
* @brief The LLAppViewer class definitions
|
||||
*
|
||||
|
|
@ -337,6 +337,46 @@ void init_default_trans_args()
|
|||
const char *VFS_DATA_FILE_BASE = "data.db2.x.";
|
||||
const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
|
||||
|
||||
|
||||
struct SettingsFile : public LLInitParam::Block<SettingsFile>
|
||||
{
|
||||
Mandatory<std::string> name;
|
||||
Optional<std::string> file_name;
|
||||
Optional<bool> required,
|
||||
persistent;
|
||||
Optional<std::string> file_name_setting;
|
||||
|
||||
SettingsFile()
|
||||
: name("name"),
|
||||
file_name("file_name"),
|
||||
required("required", false),
|
||||
persistent("persistent", true),
|
||||
file_name_setting("file_name_setting")
|
||||
{}
|
||||
};
|
||||
|
||||
struct SettingsGroup : public LLInitParam::Block<SettingsGroup>
|
||||
{
|
||||
Mandatory<std::string> name;
|
||||
Mandatory<S32> path_index;
|
||||
Multiple<SettingsFile> files;
|
||||
|
||||
SettingsGroup()
|
||||
: name("name"),
|
||||
path_index("path_index"),
|
||||
files("file")
|
||||
{}
|
||||
};
|
||||
|
||||
struct SettingsFiles : public LLInitParam::Block<SettingsFiles>
|
||||
{
|
||||
Multiple<SettingsGroup> groups;
|
||||
|
||||
SettingsFiles()
|
||||
: groups("group")
|
||||
{}
|
||||
};
|
||||
|
||||
static std::string gWindowTitle;
|
||||
|
||||
LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
|
||||
|
|
@ -595,7 +635,8 @@ LLAppViewer::LLAppViewer() :
|
|||
mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)),
|
||||
mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
|
||||
mFastTimerLogThread(NULL),
|
||||
mUpdater(new LLUpdaterService())
|
||||
mUpdater(new LLUpdaterService()),
|
||||
mSettingsLocationList(NULL)
|
||||
{
|
||||
if(NULL != sInstance)
|
||||
{
|
||||
|
|
@ -611,6 +652,8 @@ LLAppViewer::LLAppViewer() :
|
|||
|
||||
LLAppViewer::~LLAppViewer()
|
||||
{
|
||||
delete mSettingsLocationList;
|
||||
|
||||
LLLoginInstance::instance().setUpdaterService(0);
|
||||
|
||||
destroyMainloopTimeout();
|
||||
|
|
@ -1880,85 +1923,80 @@ bool LLAppViewer::initLogging()
|
|||
bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
|
||||
bool set_defaults)
|
||||
{
|
||||
// Find and vet the location key.
|
||||
if(!mSettingsLocationList.has(location_key))
|
||||
if (!mSettingsLocationList)
|
||||
{
|
||||
llerrs << "Requested unknown location: " << location_key << llendl;
|
||||
return false;
|
||||
llerrs << "Invalid settings location list" << llendl;
|
||||
}
|
||||
|
||||
LLSD location = mSettingsLocationList.get(location_key);
|
||||
LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);
|
||||
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
// skip settings groups that aren't the one we requested
|
||||
if (it->name() != location_key) continue;
|
||||
|
||||
if(!location.has("PathIndex"))
|
||||
{
|
||||
llerrs << "Settings location is missing PathIndex value. Settings cannot be loaded." << llendl;
|
||||
return false;
|
||||
}
|
||||
ELLPath path_index = (ELLPath)(location.get("PathIndex").asInteger());
|
||||
if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
|
||||
{
|
||||
llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
|
||||
return false;
|
||||
}
|
||||
ELLPath path_index = (ELLPath)it->path_index();
|
||||
if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
|
||||
{
|
||||
llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Iterate through the locations list of files.
|
||||
LLSD files = location.get("Files");
|
||||
for(LLSD::map_iterator itr = files.beginMap(); itr != files.endMap(); ++itr)
|
||||
{
|
||||
std::string settings_group = (*itr).first;
|
||||
llinfos << "Attempting to load settings for the group " << settings_group
|
||||
LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
|
||||
for (file_it = it->files.begin(), end_file_it = it->files.end();
|
||||
file_it != end_file_it;
|
||||
++file_it)
|
||||
{
|
||||
llinfos << "Attempting to load settings for the group " << file_it->name()
|
||||
<< " - from location " << location_key << llendl;
|
||||
|
||||
if(!LLControlGroup::getInstance(settings_group))
|
||||
{
|
||||
llwarns << "No matching settings group for name " << settings_group << llendl;
|
||||
continue;
|
||||
}
|
||||
|
||||
LLSD file = (*itr).second;
|
||||
|
||||
std::string full_settings_path;
|
||||
if(file.has("NameFromSetting"))
|
||||
{
|
||||
std::string custom_name_setting = file.get("NameFromSetting");
|
||||
// *NOTE: Regardless of the group currently being lodaed,
|
||||
// this setting is always read from the Global settings.
|
||||
if(LLControlGroup::getInstance(sGlobalSettingsName)->controlExists(custom_name_setting))
|
||||
LLControlGroup* settings_group = LLControlGroup::getInstance(file_it->name);
|
||||
if(!settings_group)
|
||||
{
|
||||
std::string file_name =
|
||||
LLControlGroup::getInstance(sGlobalSettingsName)->getString(custom_name_setting);
|
||||
full_settings_path = file_name;
|
||||
llwarns << "No matching settings group for name " << file_it->name() << llendl;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(full_settings_path.empty())
|
||||
{
|
||||
std::string file_name = file.get("Name");
|
||||
full_settings_path = gDirUtilp->getExpandedFilename(path_index, file_name);
|
||||
}
|
||||
std::string full_settings_path;
|
||||
|
||||
int requirement = 0;
|
||||
if(file.has("Requirement"))
|
||||
{
|
||||
requirement = file.get("Requirement").asInteger();
|
||||
}
|
||||
|
||||
if(!LLControlGroup::getInstance(settings_group)->loadFromFile(full_settings_path, set_defaults))
|
||||
{
|
||||
if(requirement == 1)
|
||||
if (file_it->file_name_setting.isProvided()
|
||||
&& global_settings->controlExists(file_it->file_name_setting))
|
||||
{
|
||||
llwarns << "Error: Cannot load required settings file from: "
|
||||
<< full_settings_path << llendl;
|
||||
return false;
|
||||
// try to find filename stored in file_name_setting control
|
||||
full_settings_path = global_settings->getString(file_it->file_name_setting);
|
||||
if (!gDirUtilp->fileExists(full_settings_path))
|
||||
{
|
||||
// search in default path
|
||||
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
|
||||
// by default, use specified file name
|
||||
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file_it->file_name());
|
||||
}
|
||||
|
||||
if(settings_group->loadFromFile(full_settings_path, set_defaults, file_it->persistent))
|
||||
{ // success!
|
||||
llinfos << "Loaded settings file " << full_settings_path << llendl;
|
||||
}
|
||||
else
|
||||
{ // failed to load
|
||||
if(file_it->required)
|
||||
{
|
||||
llerrs << "Error: Cannot load required settings file from: " << full_settings_path << llendl;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// only complain if we actually have a filename at this point
|
||||
if (!full_settings_path.empty())
|
||||
{
|
||||
llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "Loaded settings file " << full_settings_path << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1968,18 +2006,25 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
|
|||
std::string LLAppViewer::getSettingsFilename(const std::string& location_key,
|
||||
const std::string& file)
|
||||
{
|
||||
if(mSettingsLocationList.has(location_key))
|
||||
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
LLSD location = mSettingsLocationList.get(location_key);
|
||||
if(location.has("Files"))
|
||||
if (it->name() == location_key)
|
||||
{
|
||||
LLSD files = location.get("Files");
|
||||
if(files.has(file) && files[file].has("Name"))
|
||||
LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
|
||||
for (file_it = it->files.begin(), end_file_it = it->files.end();
|
||||
file_it != end_file_it;
|
||||
++file_it)
|
||||
{
|
||||
return files.get(file).get("Name").asString();
|
||||
if (file_it->name() == file)
|
||||
{
|
||||
return file_it->file_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::string();
|
||||
}
|
||||
|
||||
|
|
@ -1992,14 +2037,29 @@ bool LLAppViewer::initConfiguration()
|
|||
{
|
||||
//Load settings files list
|
||||
std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
|
||||
LLControlGroup settings_control("SettingsFiles");
|
||||
llinfos << "Loading settings file list " << settings_file_list << llendl;
|
||||
if (0 == settings_control.loadFromFile(settings_file_list))
|
||||
//LLControlGroup settings_control("SettingsFiles");
|
||||
//llinfos << "Loading settings file list " << settings_file_list << llendl;
|
||||
//if (0 == settings_control.loadFromFile(settings_file_list))
|
||||
//{
|
||||
// llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
|
||||
//}
|
||||
|
||||
LLXMLNodePtr root;
|
||||
BOOL success = LLXMLNode::parseFile(settings_file_list, root, NULL);
|
||||
if (!success)
|
||||
{
|
||||
llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
|
||||
}
|
||||
|
||||
mSettingsLocationList = settings_control.getLLSD("Locations");
|
||||
mSettingsLocationList = new SettingsFiles();
|
||||
|
||||
LLXUIParser parser;
|
||||
parser.readXUI(root, *mSettingsLocationList, settings_file_list);
|
||||
|
||||
if (!mSettingsLocationList->validateBlock())
|
||||
{
|
||||
llerrs << "Invalid settings file list " << settings_file_list << llendl;
|
||||
}
|
||||
|
||||
// The settings and command line parsing have a fragile
|
||||
// order-of-operation:
|
||||
|
|
@ -2108,6 +2168,32 @@ bool LLAppViewer::initConfiguration()
|
|||
|
||||
// - load overrides from user_settings
|
||||
loadSettingsFromDirectory("User");
|
||||
|
||||
if (gSavedSettings.getBOOL("FirstRunThisInstall"))
|
||||
{
|
||||
gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml");
|
||||
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
|
||||
}
|
||||
|
||||
if (clp.hasOption("sessionsettings"))
|
||||
{
|
||||
std::string session_settings_filename = clp.getOption("sessionsettings")[0];
|
||||
gSavedSettings.setString("SessionSettingsFile", session_settings_filename);
|
||||
llinfos << "Using session settings filename: "
|
||||
<< session_settings_filename << llendl;
|
||||
}
|
||||
loadSettingsFromDirectory("Session");
|
||||
|
||||
if (clp.hasOption("usersessionsettings"))
|
||||
{
|
||||
std::string user_session_settings_filename = clp.getOption("usersessionsettings")[0];
|
||||
gSavedSettings.setString("UserSessionSettingsFile", user_session_settings_filename);
|
||||
llinfos << "Using user session settings filename: "
|
||||
<< user_session_settings_filename << llendl;
|
||||
|
||||
}
|
||||
loadSettingsFromDirectory("UserSession");
|
||||
|
||||
// - apply command line settings
|
||||
clp.notify();
|
||||
|
||||
|
|
@ -3227,6 +3313,20 @@ static bool finish_quit(const LLSD& notification, const LLSD& response)
|
|||
}
|
||||
static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_quit);
|
||||
|
||||
static bool switch_standard_skin_and_quit(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
||||
if (option == 0)
|
||||
{
|
||||
gSavedSettings.setString("SessionSettingsFile", "");
|
||||
LLAppViewer::instance()->requestQuit();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static LLNotificationFunctorRegistration standard_skin_quit_reg("SwitchToStandardSkinAndQuit", switch_standard_skin_and_quit);
|
||||
|
||||
void LLAppViewer::userQuit()
|
||||
{
|
||||
if (gDisconnected || gViewerWindow->getProgressView()->getVisible())
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ private:
|
|||
bool mQuitRequested; // User wants to quit, may have modified documents open.
|
||||
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
|
||||
S32 mYieldTime;
|
||||
LLSD mSettingsLocationList;
|
||||
struct SettingsFiles* mSettingsLocationList;
|
||||
|
||||
LLWatchdogTimeout* mMainloopTimeout;
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "llfloatergroups.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloaterpay.h"
|
||||
#include "llfloaterwebcontent.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "llgiveinventory.h"
|
||||
#include "llinventorybridge.h"
|
||||
|
|
@ -315,7 +316,7 @@ void LLAvatarActions::showProfile(const LLUUID& id)
|
|||
std::string agent_name = LLCacheName::buildUsername(full_name);
|
||||
llinfos << "opening web profile for " << agent_name << llendl;
|
||||
std::string url = getProfileURL(agent_name);
|
||||
LLWeb::loadWebURLInternal(url);
|
||||
LLWeb::loadWebURLInternal(url, "", id.asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -336,6 +337,24 @@ void LLAvatarActions::showProfile(const LLUUID& id)
|
|||
}
|
||||
}
|
||||
|
||||
//static
|
||||
bool LLAvatarActions::profileVisible(const LLUUID& id)
|
||||
{
|
||||
LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString()));
|
||||
return browser && browser->isShown();
|
||||
}
|
||||
|
||||
|
||||
//static
|
||||
void LLAvatarActions::hideProfile(const LLUUID& id)
|
||||
{
|
||||
LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString()));
|
||||
if (browser)
|
||||
{
|
||||
browser->closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::showOnMap(const LLUUID& id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ public:
|
|||
* Show avatar profile.
|
||||
*/
|
||||
static void showProfile(const LLUUID& id);
|
||||
static void hideProfile(const LLUUID& id);
|
||||
static bool profileVisible(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* Show avatar on world map.
|
||||
|
|
|
|||
|
|
@ -38,12 +38,15 @@
|
|||
#include "lltexteditor.h"
|
||||
|
||||
// newview includes
|
||||
#include "llagent.h"
|
||||
#include "llagentcamera.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llchiclet.h"
|
||||
#include "llfloatercamera.h"
|
||||
#include "llhints.h"
|
||||
#include "llimfloater.h" // for LLIMFloater
|
||||
#include "llnearbychatbar.h"
|
||||
#include "llsidetray.h"
|
||||
#include "llspeakbutton.h"
|
||||
#include "llsplitbutton.h"
|
||||
#include "llsyswellwindow.h"
|
||||
|
|
@ -418,10 +421,6 @@ void LLBottomTray::setVisible(BOOL visible)
|
|||
{
|
||||
LLPanel::setVisible(visible);
|
||||
}
|
||||
if(visible)
|
||||
gFloaterView->setSnapOffsetBottom(getRect().getHeight());
|
||||
else
|
||||
gFloaterView->setSnapOffsetBottom(0);
|
||||
}
|
||||
|
||||
S32 LLBottomTray::notifyParent(const LLSD& info)
|
||||
|
|
@ -849,6 +848,24 @@ void LLBottomTray::draw()
|
|||
LLRect rect = mLandingTab->calcScreenRect();
|
||||
mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
|
||||
}
|
||||
getChild<LLButton>("show_profile_btn")->setToggleState(LLAvatarActions::profileVisible(gAgent.getID()));
|
||||
|
||||
LLPanel* panel = LLSideTray::getInstance()->getPanel("panel_people");
|
||||
if (panel && panel->isInVisibleChain())
|
||||
{
|
||||
getChild<LLButton>("show_people_button")->setToggleState(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLButton>("show_people_button")->setToggleState(false);
|
||||
}
|
||||
|
||||
LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
|
||||
bool help_floater_visible = (help_browser && help_browser->isInVisibleChain());
|
||||
|
||||
getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
|
||||
|
|
|
|||
|
|
@ -138,10 +138,7 @@ public:
|
|||
|
||||
if (level == "profile")
|
||||
{
|
||||
LLSD params;
|
||||
params["object_id"] = getAvatarId();
|
||||
|
||||
LLFloaterReg::showInstance("inspect_object", params);
|
||||
LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
|
||||
}
|
||||
else if (level == "block")
|
||||
{
|
||||
|
|
@ -229,7 +226,7 @@ public:
|
|||
|
||||
if (mSourceType == CHAT_SOURCE_OBJECT)
|
||||
{
|
||||
LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID));
|
||||
LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
|
||||
}
|
||||
else if (mSourceType == CHAT_SOURCE_AGENT)
|
||||
{
|
||||
|
|
@ -251,7 +248,7 @@ public:
|
|||
|
||||
const LLUUID& getAvatarId () const { return mAvatarID;}
|
||||
|
||||
void setup(const LLChat& chat,const LLStyle::Params& style_params)
|
||||
void setup(const LLChat& chat, const LLStyle::Params& style_params, const LLSD& args)
|
||||
{
|
||||
mAvatarID = chat.mFromID;
|
||||
mSessionID = chat.mSessionID;
|
||||
|
|
@ -332,7 +329,8 @@ public:
|
|||
|
||||
|
||||
setTimeField(chat);
|
||||
|
||||
|
||||
// Set up the icon.
|
||||
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
|
||||
|
||||
if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull())
|
||||
|
|
@ -352,6 +350,30 @@ public:
|
|||
case CHAT_SOURCE_UNKNOWN:
|
||||
icon->setValue(LLSD("Unknown_Icon"));
|
||||
}
|
||||
|
||||
// In case the message came from an object, save the object info
|
||||
// to be able properly show its profile.
|
||||
if ( chat.mSourceType == CHAT_SOURCE_OBJECT)
|
||||
{
|
||||
std::string slurl = args["slurl"].asString();
|
||||
if (slurl.empty())
|
||||
{
|
||||
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
|
||||
if(region)
|
||||
{
|
||||
LLSLURL region_slurl(region->getName(), chat.mPosAgent);
|
||||
slurl = region_slurl.getLocationString();
|
||||
}
|
||||
}
|
||||
|
||||
LLSD payload;
|
||||
payload["object_id"] = chat.mFromID;
|
||||
payload["name"] = chat.mFromName;
|
||||
payload["owner_id"] = chat.mOwnerID;
|
||||
payload["slurl"] = LLWeb::escapeURL(slurl);
|
||||
|
||||
mObjectData = payload;
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void draw()
|
||||
|
|
@ -540,6 +562,7 @@ protected:
|
|||
static LLUICtrl* sInfoCtrl;
|
||||
|
||||
LLUUID mAvatarID;
|
||||
LLSD mObjectData;
|
||||
EChatSourceType mSourceType;
|
||||
std::string mFrom;
|
||||
LLUUID mSessionID;
|
||||
|
|
@ -649,10 +672,10 @@ LLView* LLChatHistory::getSeparator()
|
|||
return separator;
|
||||
}
|
||||
|
||||
LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
|
||||
LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args)
|
||||
{
|
||||
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
|
||||
header->setup(chat,style_params);
|
||||
header->setup(chat, style_params, args);
|
||||
return header;
|
||||
}
|
||||
|
||||
|
|
@ -834,7 +857,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
}
|
||||
else
|
||||
{
|
||||
view = getHeader(chat, style_params);
|
||||
view = getHeader(chat, style_params, args);
|
||||
if (mEditor->getText().size() == 0)
|
||||
p.top_pad = 0;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ class LLChatHistory : public LLUICtrl
|
|||
* Builds a message header.
|
||||
* @return pointer to LLView header object.
|
||||
*/
|
||||
LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
|
||||
LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args);
|
||||
|
||||
void onClickMoreText();
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
// system includes
|
||||
#include <boost/tokenizer.hpp>
|
||||
|
||||
#define THROTTLE_PERIOD 15 // required secs between throttled commands
|
||||
#define THROTTLE_PERIOD 5 // required secs between throttled commands
|
||||
|
||||
static LLCommandDispatcherListener sCommandDispatcherListener;
|
||||
|
||||
|
|
|
|||
|
|
@ -41,36 +41,35 @@
|
|||
|
||||
|
||||
// static
|
||||
//std::set<std::string> LLFirstUse::sConfigVariables;
|
||||
std::set<std::string> LLFirstUse::sConfigVariablesEnabled;
|
||||
std::set<std::string> LLFirstUse::sConfigVariables;
|
||||
|
||||
// static
|
||||
//void LLFirstUse::addConfigVariable(const std::string& var)
|
||||
//{
|
||||
// sConfigVariables.insert(var);
|
||||
//}
|
||||
void LLFirstUse::addConfigVariable(const std::string& var)
|
||||
{
|
||||
sConfigVariables.insert(var);
|
||||
}
|
||||
|
||||
// static
|
||||
//void LLFirstUse::disableFirstUse()
|
||||
//{
|
||||
// // Set all first-use warnings to disabled
|
||||
// for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
// iter != sConfigVariables.end(); ++iter)
|
||||
// {
|
||||
// gWarningSettings.setBOOL(*iter, FALSE);
|
||||
// }
|
||||
//}
|
||||
void LLFirstUse::disableFirstUse()
|
||||
{
|
||||
// Set all first-use warnings to disabled
|
||||
for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
iter != sConfigVariables.end(); ++iter)
|
||||
{
|
||||
gWarningSettings.setBOOL(*iter, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
//void LLFirstUse::resetFirstUse()
|
||||
//{
|
||||
// // Set all first-use warnings to disabled
|
||||
// for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
// iter != sConfigVariables.end(); ++iter)
|
||||
// {
|
||||
// gWarningSettings.setBOOL(*iter, TRUE);
|
||||
// }
|
||||
//}
|
||||
void LLFirstUse::resetFirstUse()
|
||||
{
|
||||
// Set all first-use warnings to disabled
|
||||
for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
iter != sConfigVariables.end(); ++iter)
|
||||
{
|
||||
gWarningSettings.setBOOL(*iter, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFirstUse::otherAvatarChatFirst(bool enable)
|
||||
|
|
@ -104,13 +103,6 @@ void LLFirstUse::notUsingDestinationGuide(bool enable)
|
|||
firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top"));
|
||||
}
|
||||
|
||||
void LLFirstUse::notUsingAvatarPicker(bool enable)
|
||||
{
|
||||
// not doing this yet
|
||||
firstUseNotification("FirstNotUseAvatarPicker", enable, "HintAvatarPicker", LLSD(), LLSD().with("target", "avatar_picker_btn").with("direction", "top"));
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLFirstUse::notUsingSidePanel(bool enable)
|
||||
{
|
||||
|
|
@ -152,21 +144,13 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl
|
|||
|
||||
if (enable)
|
||||
{
|
||||
if(sConfigVariablesEnabled.find(control_var) != sConfigVariablesEnabled.end())
|
||||
{
|
||||
return ; //already added
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("EnableUIHints"))
|
||||
{
|
||||
LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL;
|
||||
|
||||
// if notification doesn't already exist and this notification hasn't been disabled...
|
||||
if (gWarningSettings.getBOOL(control_var))
|
||||
{
|
||||
sConfigVariablesEnabled.insert(control_var) ;
|
||||
|
||||
// create new notification
|
||||
{ // create new notification
|
||||
LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var)));
|
||||
}
|
||||
}
|
||||
|
|
@ -178,6 +162,7 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl
|
|||
// redundantly clear settings var here, in case there are no notifications to cancel
|
||||
gWarningSettings.setBOOL(control_var, FALSE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -78,16 +78,15 @@ class LLFirstUse
|
|||
public:
|
||||
|
||||
// Add a config variable to be reset on resetFirstUse()
|
||||
//static void addConfigVariable(const std::string& var);
|
||||
static void addConfigVariable(const std::string& var);
|
||||
|
||||
// Sets all controls back to show the dialogs.
|
||||
//static void disableFirstUse();
|
||||
//static void resetFirstUse();
|
||||
static void disableFirstUse();
|
||||
static void resetFirstUse();
|
||||
|
||||
static void otherAvatarChatFirst(bool enable = true);
|
||||
static void sit(bool enable = true);
|
||||
static void notUsingDestinationGuide(bool enable = true);
|
||||
static void notUsingAvatarPicker(bool enable = true);
|
||||
static void notUsingSidePanel(bool enable = true);
|
||||
static void notMoving(bool enable = true);
|
||||
static void viewPopup(bool enable = true);
|
||||
|
|
@ -98,8 +97,7 @@ public:
|
|||
|
||||
protected:
|
||||
static void firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args = LLSD(), LLSD payload = LLSD());
|
||||
//static std::set<std::string> sConfigVariables;
|
||||
static std::set<std::string> sConfigVariablesEnabled;
|
||||
static std::set<std::string> sConfigVariables;
|
||||
|
||||
static void init();
|
||||
static bool processNotification(const LLSD& notify);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@
|
|||
#include "llviewercamera.h"
|
||||
#include "lldraghandle.h"
|
||||
#include "lltextbox.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "llagent.h"
|
||||
|
||||
|
|
@ -63,7 +62,6 @@ const S32 MAP_PADDING_BOTTOM = 0;
|
|||
|
||||
LLFloaterMap::LLFloaterMap(const LLSD& key)
|
||||
: LLFloater(key),
|
||||
mPopupMenu(NULL),
|
||||
mTextBoxEast(NULL),
|
||||
mTextBoxNorth(NULL),
|
||||
mTextBoxWest(NULL),
|
||||
|
|
@ -83,8 +81,14 @@ LLFloaterMap::~LLFloaterMap()
|
|||
BOOL LLFloaterMap::postBuild()
|
||||
{
|
||||
mMap = getChild<LLNetMap>("Net Map");
|
||||
mMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
|
||||
getString("AltToolTipMsg") : getString("ToolTipMsg"));
|
||||
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
|
||||
{
|
||||
mMap->setToolTipMsg(getString("AltToolTipMsg"));
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
|
||||
{
|
||||
mMap->setToolTipMsg(getString("ToolTipMsg"));
|
||||
}
|
||||
sendChildToBack(mMap);
|
||||
|
||||
mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
|
||||
|
|
@ -96,17 +100,6 @@ BOOL LLFloaterMap::postBuild()
|
|||
mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
|
||||
mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
|
||||
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
|
||||
registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
|
||||
registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (mPopupMenu && !LLTracker::isTracking(0))
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", false);
|
||||
}
|
||||
|
||||
stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
|
||||
,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
|
||||
|
||||
|
|
@ -150,24 +143,13 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
|
|||
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
|
||||
gAgent.teleportViaLocationLookAt(pos_global);
|
||||
}
|
||||
else
|
||||
else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
|
||||
{
|
||||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLFloaterMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if (mPopupMenu)
|
||||
{
|
||||
mPopupMenu->buildDrawLabels();
|
||||
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
|
||||
{
|
||||
// Rotation is in radians.
|
||||
|
|
@ -238,11 +220,6 @@ void LLFloaterMap::draw()
|
|||
getDragHandle()->setMouseOpaque(TRUE);
|
||||
}
|
||||
|
||||
if (LLTracker::isTracking(0))
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", true);
|
||||
}
|
||||
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
||||
|
|
@ -309,14 +286,6 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterMap::handleStopTracking (const LLSD& userdata)
|
||||
{
|
||||
if (mPopupMenu)
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", false);
|
||||
LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
|
||||
}
|
||||
}
|
||||
void LLFloaterMap::setMinimized(BOOL b)
|
||||
{
|
||||
LLFloater::setMinimized(b);
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
|
||||
#include "llfloater.h"
|
||||
|
||||
class LLMenuGL;
|
||||
class LLNetMap;
|
||||
class LLTextBox;
|
||||
|
||||
|
|
@ -44,7 +43,6 @@ public:
|
|||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
|
||||
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
|
||||
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ void onFocusLost();
|
||||
|
|
@ -54,14 +52,11 @@ public:
|
|||
|
||||
private:
|
||||
void handleZoom(const LLSD& userdata);
|
||||
void handleStopTracking (const LLSD& userdata);
|
||||
void setDirectionPos( LLTextBox* text_box, F32 rotation );
|
||||
void updateMinorDirections();
|
||||
|
||||
void stretchMiniMap(S32 width,S32 height);
|
||||
|
||||
LLMenuGL* mPopupMenu;
|
||||
|
||||
LLTextBox* mTextBoxEast;
|
||||
LLTextBox* mTextBoxNorth;
|
||||
LLTextBox* mTextBoxWest;
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
// newview includes
|
||||
#include "lltransientfloatermgr.h"
|
||||
#include "llsidetray.h"
|
||||
|
||||
LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params)
|
||||
: LLFloater(key, params)
|
||||
|
|
@ -43,3 +44,8 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
|
|||
{
|
||||
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
|
||||
}
|
||||
|
||||
void LLFloaterSideTrayTab::onClose(bool app_quitting)
|
||||
{
|
||||
LLSideTray::getInstance()->setTabDocked(getName(), true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ class LLFloaterSideTrayTab : public LLFloater
|
|||
public:
|
||||
LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams());
|
||||
~LLFloaterSideTrayTab();
|
||||
|
||||
void onClose(bool app_quitting);
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERSIDETRAYTAB_H
|
||||
|
|
|
|||
|
|
@ -110,6 +110,12 @@ public:
|
|||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (params.size() == 0)
|
||||
{
|
||||
// support the secondlife:///app/worldmap SLapp
|
||||
|
|
@ -142,6 +148,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
//Make sure we have some parameters
|
||||
if (params.size() == 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -53,6 +53,12 @@ public:
|
|||
bool handle(const LLSD& tokens, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableGroupInfo"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoGroupInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tokens.size() < 1)
|
||||
{
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* @file llhudeffecttrail.cpp
|
||||
* @brief LLHUDEffectSpiral class implementation
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&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 "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llhudeffectblob.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llui.h"
|
||||
|
||||
LLHUDEffectBlob::LLHUDEffectBlob(const U8 type)
|
||||
: LLHUDEffect(type),
|
||||
mPixelSize(10)
|
||||
{
|
||||
mTimer.start();
|
||||
mImage = LLUI::getUIImage("Camera_Drag_Dot");
|
||||
}
|
||||
|
||||
LLHUDEffectBlob::~LLHUDEffectBlob()
|
||||
{
|
||||
}
|
||||
|
||||
void LLHUDEffectBlob::render()
|
||||
{
|
||||
F32 time = mTimer.getElapsedTimeF32();
|
||||
if (mDuration < time)
|
||||
{
|
||||
markDead();
|
||||
}
|
||||
|
||||
LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal);
|
||||
|
||||
LLVector3 pixel_up, pixel_right;
|
||||
|
||||
LLViewerCamera::instance().getPixelVectors(pos_agent, pixel_up, pixel_right);
|
||||
|
||||
LLGLSPipelineAlpha gls_pipeline_alpha;
|
||||
gGL.getTexUnit(0)->bind(mImage->getImage());
|
||||
|
||||
LLColor4U color = mColor;
|
||||
color.mV[VALPHA] = (U8)clamp_rescale(time, 0.f, mDuration, 255.f, 0.f);
|
||||
gGL.color4ubv(color.mV);
|
||||
|
||||
{ gGL.pushMatrix();
|
||||
gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
|
||||
LLVector3 u_scale = pixel_right * (F32)mPixelSize;
|
||||
LLVector3 v_scale = pixel_up * (F32)mPixelSize;
|
||||
|
||||
{ gGL.begin(LLRender::QUADS);
|
||||
gGL.texCoord2f(0.f, 1.f);
|
||||
gGL.vertex3fv((v_scale - u_scale).mV);
|
||||
gGL.texCoord2f(0.f, 0.f);
|
||||
gGL.vertex3fv((-v_scale - u_scale).mV);
|
||||
gGL.texCoord2f(1.f, 0.f);
|
||||
gGL.vertex3fv((-v_scale + u_scale).mV);
|
||||
gGL.texCoord2f(1.f, 1.f);
|
||||
gGL.vertex3fv((v_scale + u_scale).mV);
|
||||
} gGL.end();
|
||||
|
||||
} gGL.popMatrix();
|
||||
}
|
||||
|
||||
void LLHUDEffectBlob::renderForTimer()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* @file llhudeffectblob.h
|
||||
* @brief LLHUDEffectBlob class definition
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&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$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLHUDEFFECTBLOB_H
|
||||
#define LL_LLHUDEFFECTBLOB_H
|
||||
|
||||
#include "llhudeffect.h"
|
||||
#include "lluiimage.h"
|
||||
|
||||
class LLHUDEffectBlob : public LLHUDEffect
|
||||
{
|
||||
public:
|
||||
friend class LLHUDObject;
|
||||
|
||||
void setPixelSize(S32 pixels) { mPixelSize = pixels; }
|
||||
|
||||
protected:
|
||||
LLHUDEffectBlob(const U8 type);
|
||||
~LLHUDEffectBlob();
|
||||
|
||||
/*virtual*/ void render();
|
||||
/*virtual*/ void renderForTimer();
|
||||
private:
|
||||
S32 mPixelSize;
|
||||
LLFrameTimer mTimer;
|
||||
LLPointer<LLUIImage> mImage;
|
||||
};
|
||||
|
||||
#endif // LL_LLHUDEFFECTBLOB_H
|
||||
|
|
@ -32,6 +32,7 @@
|
|||
#include "llhudtext.h"
|
||||
#include "llhudicon.h"
|
||||
#include "llhudeffectbeam.h"
|
||||
#include "llhudeffectblob.h"
|
||||
#include "llhudeffecttrail.h"
|
||||
#include "llhudeffectlookat.h"
|
||||
#include "llhudeffectpointat.h"
|
||||
|
|
@ -237,6 +238,9 @@ LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
|
|||
case LL_HUD_EFFECT_POINTAT:
|
||||
hud_objectp = new LLHUDEffectPointAt(type);
|
||||
break;
|
||||
case LL_HUD_EFFECT_BLOB:
|
||||
hud_objectp = new LLHUDEffectBlob(type);
|
||||
break;
|
||||
default:
|
||||
llwarns << "Unknown type of hud effect:" << (U32) type << llendl;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,8 @@ public:
|
|||
LL_HUD_EFFECT_LOOKAT,
|
||||
LL_HUD_EFFECT_POINTAT,
|
||||
LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella
|
||||
LL_HUD_NAME_TAG
|
||||
LL_HUD_NAME_TAG,
|
||||
LL_HUD_EFFECT_BLOB
|
||||
};
|
||||
protected:
|
||||
static void sortObjects();
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
|
|||
{
|
||||
// If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
|
||||
std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents2");
|
||||
if (!url.empty())
|
||||
if (gSavedSettings.getBOOL("UseHTTPInventory") && !url.empty())
|
||||
{
|
||||
bulkFetch(url);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -211,7 +211,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
|
|||
{
|
||||
// Lets replace default LLLineEditor with LLLocationLineEditor
|
||||
// to make needed escaping while copying and cutting url
|
||||
this->removeChild(mTextEntry);
|
||||
delete mTextEntry;
|
||||
|
||||
// Can't access old mTextEntry fields as they are protected, so lets build new params
|
||||
|
|
|
|||
|
|
@ -636,18 +636,19 @@ void LLNavigationBar::onRegionNameResponse(
|
|||
U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
|
||||
{
|
||||
// Invalid location?
|
||||
if (!region_handle)
|
||||
if (region_handle)
|
||||
{
|
||||
// Teleport to the location.
|
||||
LLVector3d region_pos = from_region_handle(region_handle);
|
||||
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
|
||||
|
||||
llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
|
||||
gAgent.teleportViaLocation(global_pos);
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("SearchFromAddressBar"))
|
||||
{
|
||||
invokeSearch(typed_location);
|
||||
return;
|
||||
}
|
||||
|
||||
// Teleport to the location.
|
||||
LLVector3d region_pos = from_region_handle(region_handle);
|
||||
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
|
||||
|
||||
llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
|
||||
gAgent.teleportViaLocation(global_pos);
|
||||
}
|
||||
|
||||
void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl)
|
||||
|
|
|
|||
|
|
@ -157,6 +157,16 @@ BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
|
|||
return handled;
|
||||
}
|
||||
|
||||
void LLGestureComboList::draw()
|
||||
{
|
||||
LLUICtrl::draw();
|
||||
|
||||
if(mButton->getToggleState())
|
||||
{
|
||||
showList();
|
||||
}
|
||||
}
|
||||
|
||||
void LLGestureComboList::showList()
|
||||
{
|
||||
LLRect rect = mList->getRect();
|
||||
|
|
@ -180,6 +190,7 @@ void LLGestureComboList::showList()
|
|||
// Show the list and push the button down
|
||||
mButton->setToggleState(TRUE);
|
||||
mList->setVisible(TRUE);
|
||||
sendChildToFront(mList);
|
||||
LLUI::addPopup(mList);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,8 @@ public:
|
|||
virtual void hideList();
|
||||
virtual BOOL handleKeyHere(KEY key, MASK mask);
|
||||
|
||||
virtual void draw();
|
||||
|
||||
S32 getCurrentIndex() const;
|
||||
void onItemSelected(const LLSD& data);
|
||||
void sortByName(bool ascending = true);
|
||||
|
|
|
|||
|
|
@ -112,10 +112,6 @@ BOOL LLNetMap::postBuild()
|
|||
registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (mPopupMenu && !LLTracker::isTracking(0))
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", false);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -510,13 +506,6 @@ void LLNetMap::draw()
|
|||
gGL.popUIMatrix();
|
||||
|
||||
LLUICtrl::draw();
|
||||
|
||||
if (LLTracker::isTracking(0))
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
|
|
@ -886,6 +875,7 @@ BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
mPopupMenu->buildDrawLabels();
|
||||
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
mPopupMenu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
}
|
||||
return TRUE;
|
||||
|
|
@ -904,23 +894,29 @@ BOOL LLNetMap::handleClick(S32 x, S32 y, MASK mask)
|
|||
BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLVector3d pos_global = viewPosToGlobal(x, y);
|
||||
|
||||
// If we're not tracking a beacon already, double-click will set one
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
|
||||
bool double_click_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
|
||||
bool double_click_show_world_map = gSavedSettings.getBOOL("DoubleClickShowWorldMap");
|
||||
|
||||
if (double_click_teleport || double_click_show_world_map)
|
||||
{
|
||||
LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
|
||||
if (world_map)
|
||||
// If we're not tracking a beacon already, double-click will set one
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
{
|
||||
world_map->trackLocation(pos_global);
|
||||
LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
|
||||
if (world_map)
|
||||
{
|
||||
world_map->trackLocation(pos_global);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
|
||||
|
||||
if (double_click_teleport)
|
||||
{
|
||||
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
|
||||
gAgent.teleportViaLocationLookAt(pos_global);
|
||||
}
|
||||
else
|
||||
else if (double_click_show_world_map)
|
||||
{
|
||||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
|
|||
initChannel();
|
||||
}
|
||||
|
||||
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
|
||||
if(notify["sigtype"].asString() == "add")
|
||||
{
|
||||
if (LLHandlerUtil::canLogToIM(notification))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -81,9 +81,6 @@ const S32 MAX_PASSWORD = 16;
|
|||
LLPanelLogin *LLPanelLogin::sInstance = NULL;
|
||||
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
|
||||
|
||||
// Helper for converting a user name into the canonical "Firstname Lastname" form.
|
||||
// For new accounts without a last name "Resident" is added as a last name.
|
||||
static std::string canonicalize_username(const std::string& name);
|
||||
|
||||
class LLLoginRefreshHandler : public LLCommandHandler
|
||||
{
|
||||
|
|
@ -217,6 +214,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
}
|
||||
updateLocationCombo(false);
|
||||
|
||||
gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange));
|
||||
|
||||
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
|
||||
server_choice_combo->setCommitCallback(onSelectServer, NULL);
|
||||
server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
|
||||
|
|
@ -301,14 +300,7 @@ void LLPanelLogin::addFavoritesToStartLocation()
|
|||
for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
|
||||
iter != fav_llsd.endMap(); ++iter)
|
||||
{
|
||||
std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
|
||||
|
||||
// The account name in stored_favorites.xml has Resident last name even if user has
|
||||
// a single word account name, so it can be compared case-insensitive with the
|
||||
// user defined "firstname lastname".
|
||||
S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first);
|
||||
if (res != 0) continue;
|
||||
|
||||
if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue;
|
||||
combo->addSeparator();
|
||||
LLSD user_llsd = iter->second;
|
||||
for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
|
||||
|
|
@ -1167,27 +1159,25 @@ void LLPanelLogin::updateLoginPanelLinks()
|
|||
sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
|
||||
}
|
||||
|
||||
std::string canonicalize_username(const std::string& name)
|
||||
//static
|
||||
void LLPanelLogin::onModeChange()
|
||||
{
|
||||
std::string cname = name;
|
||||
LLStringUtil::trim(cname);
|
||||
|
||||
// determine if the username is a first/last form or not.
|
||||
size_t separator_index = cname.find_first_of(" ._");
|
||||
std::string first = cname.substr(0, separator_index);
|
||||
std::string last;
|
||||
if (separator_index != cname.npos)
|
||||
{
|
||||
last = cname.substr(separator_index+1, cname.npos);
|
||||
LLStringUtil::trim(last);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ...on Linden grids, single username users as considered to have
|
||||
// last name "Resident"
|
||||
last = "Resident";
|
||||
}
|
||||
|
||||
// Username in traditional "firstname lastname" form.
|
||||
return first + ' ' + last;
|
||||
LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2));
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch (option)
|
||||
{
|
||||
case 0:
|
||||
LLAppViewer::instance()->requestQuit();
|
||||
break;
|
||||
case 1:
|
||||
// do nothing
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,6 +98,8 @@ private:
|
|||
static void onServerComboLostFocus(LLFocusableElement*);
|
||||
static void updateServerCombo();
|
||||
static void updateStartSLURL();
|
||||
static void onModeChange();
|
||||
static void onModeChangeConfirm(const LLSD& notification, const LLSD& response);
|
||||
|
||||
static void updateLoginPanelLinks();
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ static const std::string CLASSIFIED_NAME("classified_name");
|
|||
|
||||
static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
|
||||
|
||||
|
||||
class LLPickHandler : public LLCommandHandler,
|
||||
public LLAvatarPropertiesObserver
|
||||
{
|
||||
|
|
@ -83,6 +84,12 @@ public:
|
|||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePicks"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoPicks", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// handle app/classified/create urls first
|
||||
if (params.size() == 1 && params[0].asString() == "create")
|
||||
{
|
||||
|
|
@ -189,6 +196,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableClassifieds"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoClassifieds", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// handle app/classified/create urls first
|
||||
if (params.size() == 1 && params[0].asString() == "create")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,16 +31,27 @@
|
|||
#include "llavataractions.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llpanelpicks.h"
|
||||
#include "lltabcontainer.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewernetwork.h"
|
||||
|
||||
static const std::string PANEL_PICKS = "panel_picks";
|
||||
static const std::string PANEL_PROFILE = "panel_profile";
|
||||
|
||||
std::string getProfileURL(const std::string& agent_name)
|
||||
{
|
||||
std::string url = gSavedSettings.getString("WebProfileURL");
|
||||
std::string url;
|
||||
|
||||
if (LLGridManager::getInstance()->isInProductionGrid())
|
||||
{
|
||||
url = gSavedSettings.getString("WebProfileURL");
|
||||
}
|
||||
else
|
||||
{
|
||||
url = gSavedSettings.getString("WebProfileNonProductionURL");
|
||||
}
|
||||
LLSD subs;
|
||||
subs["AGENT_NAME"] = agent_name;
|
||||
url = LLWeb::expandURLSubstitutions(url,subs);
|
||||
|
|
@ -105,6 +116,12 @@ public:
|
|||
|
||||
if (verb == "pay")
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarPay"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoAvatarPay", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
LLAvatarActions::pay(avatar_id);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llui.h"
|
||||
|
||||
class LLShareWithAvatarHandler : public LLCommandHandler
|
||||
{
|
||||
|
|
@ -38,6 +40,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarShare"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoAvatarShare", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
//Make sure we have some parameters
|
||||
if (params.size() == 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ bool LLSideTray::instanceCreated ()
|
|||
|
||||
class LLSideTrayTab: public LLPanel
|
||||
{
|
||||
LOG_CLASS(LLSideTrayTab);
|
||||
friend class LLUICtrlFactory;
|
||||
friend class LLSideTray;
|
||||
public:
|
||||
|
|
@ -122,6 +123,8 @@ protected:
|
|||
void undock(LLFloater* floater_tab);
|
||||
|
||||
LLSideTray* getSideTray();
|
||||
|
||||
void onFloaterClose(LLSD::Boolean app_quitting);
|
||||
|
||||
public:
|
||||
virtual ~LLSideTrayTab();
|
||||
|
|
@ -140,6 +143,8 @@ public:
|
|||
void onOpen (const LLSD& key);
|
||||
|
||||
void toggleTabDocked();
|
||||
void setDocked(bool dock);
|
||||
bool isDocked() const;
|
||||
|
||||
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
|
||||
|
||||
|
|
@ -151,6 +156,7 @@ private:
|
|||
std::string mDescription;
|
||||
|
||||
LLView* mMainPanel;
|
||||
boost::signals2::connection mFloaterCloseConn;
|
||||
};
|
||||
|
||||
LLSideTrayTab::LLSideTrayTab(const Params& p)
|
||||
|
|
@ -271,6 +277,35 @@ void LLSideTrayTab::toggleTabDocked()
|
|||
LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
|
||||
}
|
||||
|
||||
// Same as toggleTabDocked() apart from making sure that we do exactly what we want.
|
||||
void LLSideTrayTab::setDocked(bool dock)
|
||||
{
|
||||
if (isDocked() == dock)
|
||||
{
|
||||
llwarns << "Tab " << getName() << " is already " << (dock ? "docked" : "undocked") << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
toggleTabDocked();
|
||||
}
|
||||
|
||||
bool LLSideTrayTab::isDocked() const
|
||||
{
|
||||
return dynamic_cast<LLSideTray*>(getParent()) != NULL;
|
||||
}
|
||||
|
||||
void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
|
||||
{
|
||||
// If user presses Ctrl-Shift-W, handle that gracefully by docking all
|
||||
// undocked tabs before their floaters get destroyed (STORM-1016).
|
||||
|
||||
// Don't dock on quit for the current dock state to be correctly saved.
|
||||
if (app_quitting) return;
|
||||
|
||||
lldebugs << "Forcibly docking tab " << getName() << llendl;
|
||||
setDocked(true);
|
||||
}
|
||||
|
||||
BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
||||
{
|
||||
// Let children handle the event
|
||||
|
|
@ -294,6 +329,7 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
|
|||
return;
|
||||
}
|
||||
|
||||
mFloaterCloseConn.disconnect();
|
||||
setRect(side_tray->getLocalRect());
|
||||
reshape(getRect().getWidth(), getRect().getHeight());
|
||||
|
||||
|
|
@ -342,6 +378,7 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
|
|||
}
|
||||
|
||||
floater_tab->addChild(this);
|
||||
mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
|
||||
floater_tab->setTitle(mTabTitle);
|
||||
floater_tab->setName(getName());
|
||||
|
||||
|
|
@ -629,8 +666,16 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
|
|||
|
||||
std::string tab_name = tab->getName();
|
||||
|
||||
bool tab_attached = isTabAttached(tab_name);
|
||||
|
||||
if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
|
||||
{
|
||||
tab->toggleTabDocked();
|
||||
tab_attached = false;
|
||||
}
|
||||
|
||||
// Select tab and expand Side Tray only when a tab is attached.
|
||||
if (isTabAttached(tab_name))
|
||||
if (tab_attached)
|
||||
{
|
||||
selectTabByName(tab_name);
|
||||
if (mCollapsed)
|
||||
|
|
@ -641,14 +686,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
|
|||
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
|
||||
if (!floater_tab) return NULL;
|
||||
|
||||
// Restore the floater if it was minimized.
|
||||
if (floater_tab->isMinimized())
|
||||
{
|
||||
floater_tab->setMinimized(FALSE);
|
||||
}
|
||||
|
||||
// Send the floater to the front.
|
||||
floater_tab->setFrontmost();
|
||||
floater_tab->openFloater(panel_name);
|
||||
}
|
||||
|
||||
LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
|
||||
|
|
@ -979,16 +1017,7 @@ void LLSideTray::reflectCollapseChange()
|
|||
{
|
||||
updateSidetrayVisibility();
|
||||
|
||||
if(mCollapsed)
|
||||
{
|
||||
gFloaterView->setSnapOffsetRight(0);
|
||||
setFocus(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
gFloaterView->setSnapOffsetRight(getRect().getWidth());
|
||||
setFocus(TRUE);
|
||||
}
|
||||
setFocus(!mCollapsed);
|
||||
|
||||
gFloaterView->refresh();
|
||||
}
|
||||
|
|
@ -1161,23 +1190,43 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
|
|||
*/
|
||||
LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params)
|
||||
{
|
||||
LLPanel* new_panel = NULL;
|
||||
|
||||
// Look up the tab in the list of detached tabs.
|
||||
child_vector_const_iter_t child_it;
|
||||
for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
|
||||
{
|
||||
LLPanel* panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (panel) return panel;
|
||||
}
|
||||
new_panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (new_panel) break;
|
||||
}
|
||||
|
||||
// Look up the tab in the list of attached tabs.
|
||||
for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
|
||||
{
|
||||
LLPanel* panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (panel) return panel;
|
||||
{
|
||||
new_panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (new_panel) break;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
return new_panel;
|
||||
}
|
||||
|
||||
void LLSideTray::hidePanel(const std::string& panel_name)
|
||||
{
|
||||
LLPanel* panelp = getPanel(panel_name);
|
||||
if (panelp)
|
||||
{
|
||||
if(isTabAttached(panel_name))
|
||||
{
|
||||
collapseSideBar();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReg::hideInstance("side_bar_tab", panel_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
|
||||
{
|
||||
if(!sub_panel)
|
||||
|
|
@ -1267,6 +1316,42 @@ bool LLSideTray::isPanelActive(const std::string& panel_name)
|
|||
return (panel->getName() == panel_name);
|
||||
}
|
||||
|
||||
void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
|
||||
{
|
||||
LLSideTrayTab* tab = getTab(tab_name);
|
||||
if (!tab)
|
||||
{ // not a docked tab, look through detached tabs
|
||||
for(child_vector_iter_t tab_it = mDetachedTabs.begin(), tab_end_it = mDetachedTabs.end();
|
||||
tab_it != tab_end_it;
|
||||
++tab_it)
|
||||
{
|
||||
if ((*tab_it)->getName() == tab_name)
|
||||
{
|
||||
tab = *tab_it;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (tab)
|
||||
{
|
||||
bool tab_attached = isTabAttached(tab_name);
|
||||
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
|
||||
if (!floater_tab) return;
|
||||
|
||||
if (dock && !tab_attached)
|
||||
{
|
||||
tab->dock(floater_tab);
|
||||
}
|
||||
else if (!dock && tab_attached)
|
||||
{
|
||||
tab->undock(floater_tab);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLSideTray::updateSidetrayVisibility()
|
||||
{
|
||||
// set visibility of parent container based on collapsed state
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@ public:
|
|||
*/
|
||||
LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
|
||||
|
||||
void hidePanel (const std::string& panel_name);
|
||||
|
||||
/**
|
||||
* Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
|
||||
* If "sub_panel" is not visible Side Tray is opened to display it,
|
||||
|
|
@ -112,6 +114,8 @@ public:
|
|||
LLPanel* getActivePanel ();
|
||||
bool isPanelActive (const std::string& panel_name);
|
||||
|
||||
void setTabDocked(const std::string& tab_name, bool dock);
|
||||
|
||||
/*
|
||||
* get the panel of given type T (don't show it or do anything else with it)
|
||||
*/
|
||||
|
|
@ -215,7 +219,7 @@ private:
|
|||
if (LLSideTray::instanceCreated())
|
||||
LLSideTray::getInstance()->setEnabled(FALSE);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
LLPanel* mButtonsPanel;
|
||||
typedef std::map<std::string,LLButton*> button_map_t;
|
||||
|
|
|
|||
|
|
@ -749,8 +749,6 @@ bool idle_startup()
|
|||
}
|
||||
LLPanelLogin::giveFocus();
|
||||
|
||||
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
|
||||
|
||||
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
|
||||
}
|
||||
else
|
||||
|
|
@ -1704,9 +1702,6 @@ bool idle_startup()
|
|||
// Set the show start location to true, now that the user has logged
|
||||
// on with this install.
|
||||
gSavedSettings.setBOOL("ShowStartLocation", TRUE);
|
||||
|
||||
LLSideTray::getInstance()->showPanel("panel_home", LLSD());
|
||||
|
||||
}
|
||||
|
||||
// We're successfully logged in.
|
||||
|
|
|
|||
|
|
@ -99,7 +99,6 @@ LLToast::Params::Params()
|
|||
|
||||
LLToast::LLToast(const LLToast::Params& p)
|
||||
: LLModalDialog(LLSD(), p.is_modal),
|
||||
mPanel(p.panel),
|
||||
mToastLifetime(p.lifetime_secs),
|
||||
mToastFadingTime(p.fading_time_secs),
|
||||
mNotificationID(p.notif_id),
|
||||
|
|
@ -108,6 +107,7 @@ LLToast::LLToast(const LLToast::Params& p)
|
|||
mCanBeStored(p.can_be_stored),
|
||||
mHideBtnEnabled(p.enable_hide_btn),
|
||||
mHideBtn(NULL),
|
||||
mPanel(NULL),
|
||||
mNotification(p.notification),
|
||||
mIsHidden(false),
|
||||
mHideBtnPressed(false),
|
||||
|
|
@ -128,9 +128,9 @@ LLToast::LLToast(const LLToast::Params& p)
|
|||
setBackgroundOpaque(TRUE); // *TODO: obsolete
|
||||
updateTransparency();
|
||||
|
||||
if(mPanel)
|
||||
if(p.panel())
|
||||
{
|
||||
insertPanel(mPanel);
|
||||
insertPanel(p.panel);
|
||||
}
|
||||
|
||||
if(mHideBtnEnabled)
|
||||
|
|
@ -309,6 +309,7 @@ void LLToast::reshapeToPanel()
|
|||
|
||||
void LLToast::insertPanel(LLPanel* panel)
|
||||
{
|
||||
mPanel = panel;
|
||||
mWrapperPanel->addChild(panel);
|
||||
reshapeToPanel();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,8 +79,11 @@ static ECursorType cursor_from_parcel_media(U8 click_action);
|
|||
|
||||
LLToolPie::LLToolPie()
|
||||
: LLTool(std::string("Pie")),
|
||||
mGrabMouseButtonDown( FALSE ),
|
||||
mMouseOutsideSlop( FALSE ),
|
||||
mMouseButtonDown( false ),
|
||||
mMouseOutsideSlop( false ),
|
||||
mMouseSteerX(-1),
|
||||
mMouseSteerY(-1),
|
||||
mBlockClickToWalk(false),
|
||||
mClickAction(0),
|
||||
mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
|
||||
mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
|
||||
|
|
@ -99,12 +102,17 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
|
|||
|
||||
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
mMouseOutsideSlop = FALSE;
|
||||
mMouseDownX = x;
|
||||
mMouseDownY = y;
|
||||
|
||||
//left mouse down always picks transparent
|
||||
mPick = gViewerWindow->pickImmediate(x, y, TRUE);
|
||||
mPick.mKeyMask = mask;
|
||||
mGrabMouseButtonDown = TRUE;
|
||||
|
||||
mMouseButtonDown = true;
|
||||
|
||||
pickLeftMouseDownCallback();
|
||||
handleLeftClickPick();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -119,7 +127,7 @@ BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
// claim not handled so UI focus stays same
|
||||
|
||||
pickRightMouseDownCallback();
|
||||
handleRightClickPick();
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -136,7 +144,7 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
|||
}
|
||||
|
||||
// True if you selected an object.
|
||||
BOOL LLToolPie::pickLeftMouseDownCallback()
|
||||
BOOL LLToolPie::handleLeftClickPick()
|
||||
{
|
||||
S32 x = mPick.mMousePt.mX;
|
||||
S32 y = mPick.mMousePt.mY;
|
||||
|
|
@ -292,7 +300,12 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
}
|
||||
|
||||
// put focus back "in world"
|
||||
gFocusMgr.setKeyboardFocus(NULL);
|
||||
if (gFocusMgr.getKeyboardFocus())
|
||||
{
|
||||
// don't click to walk on attempt to give focus to world
|
||||
mBlockClickToWalk = true;
|
||||
gFocusMgr.setKeyboardFocus(NULL);
|
||||
}
|
||||
|
||||
BOOL touchable = (object && object->flagHandleTouch())
|
||||
|| (parent && parent->flagHandleTouch());
|
||||
|
|
@ -304,6 +317,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
)
|
||||
{
|
||||
gGrabTransientTool = this;
|
||||
mMouseButtonDown = false;
|
||||
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolGrab::getInstance() );
|
||||
return LLToolGrab::getInstance()->handleObjectHit( mPick );
|
||||
}
|
||||
|
|
@ -319,9 +333,9 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
if (!gSavedSettings.getBOOL("LeftClickShowMenu"))
|
||||
{
|
||||
// mouse already released
|
||||
if (!mGrabMouseButtonDown)
|
||||
if (!mMouseButtonDown)
|
||||
{
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
while( object && object->isAttachment() && !object->flagHandleTouch())
|
||||
|
|
@ -333,9 +347,10 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
}
|
||||
object = (LLViewerObject*)object->getParent();
|
||||
}
|
||||
if (object && object == gAgentAvatarp)
|
||||
if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
|
||||
{
|
||||
// we left clicked on avatar, switch to focus mode
|
||||
mMouseButtonDown = false;
|
||||
LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
|
||||
gViewerWindow->hideCursor();
|
||||
LLToolCamera::getInstance()->setMouseCapture(TRUE);
|
||||
|
|
@ -513,7 +528,28 @@ void LLToolPie::selectionPropertiesReceived()
|
|||
|
||||
BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if (!mMouseOutsideSlop
|
||||
&& mMouseButtonDown
|
||||
&& gSavedSettings.getBOOL("ClickToWalk"))
|
||||
{
|
||||
S32 delta_x = x - mMouseDownX;
|
||||
S32 delta_y = y - mMouseDownY;
|
||||
S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold");
|
||||
if (delta_x * delta_x + delta_y * delta_y > threshold * threshold)
|
||||
{
|
||||
startCameraSteering();
|
||||
}
|
||||
}
|
||||
|
||||
mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
|
||||
|
||||
if (inCameraSteerMode())
|
||||
{
|
||||
steerCameraWithMouse(x, y);
|
||||
gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// perform a separate pick that detects transparent objects since they respond to 1-click actions
|
||||
LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE);
|
||||
|
||||
|
|
@ -584,39 +620,62 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
|||
BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLViewerObject* obj = mPick.getObject();
|
||||
|
||||
handleMediaMouseUp();
|
||||
|
||||
U8 click_action = final_click_action(obj);
|
||||
if (click_action != CLICK_ACTION_NONE)
|
||||
|
||||
// let media have first pass at click
|
||||
if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
|
||||
{
|
||||
switch(click_action)
|
||||
mBlockClickToWalk = true;
|
||||
}
|
||||
stopCameraSteering();
|
||||
mMouseButtonDown = false;
|
||||
|
||||
if (click_action == CLICK_ACTION_NONE // not doing 1-click action
|
||||
&& gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
|
||||
&& !gAgent.getFlying() // don't auto-navigate while flying until that works
|
||||
&& !mBlockClickToWalk // another behavior hasn't cancelled click to walk
|
||||
&& !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
|
||||
&& (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
|
||||
|| mPick.mObjectID.notNull())) // or on an object
|
||||
{
|
||||
// handle special cases of steering picks
|
||||
LLViewerObject* avatar_object = mPick.getObject();
|
||||
|
||||
// get pointer to avatar
|
||||
while (avatar_object && !avatar_object->isAvatar())
|
||||
{
|
||||
// NOTE: mClickActionBuyEnabled flag enables/disables BUY action but setting cursor to default is okay
|
||||
case CLICK_ACTION_BUY:
|
||||
// NOTE: mClickActionPayEnabled flag enables/disables PAY action but setting cursor to default is okay
|
||||
case CLICK_ACTION_PAY:
|
||||
case CLICK_ACTION_OPEN:
|
||||
case CLICK_ACTION_ZOOM:
|
||||
case CLICK_ACTION_PLAY:
|
||||
case CLICK_ACTION_OPEN_MEDIA:
|
||||
// Because these actions open UI dialogs, we won't change
|
||||
// the cursor again until the next hover and GL pick over
|
||||
// the world. Keep the cursor an arrow, assuming that
|
||||
// after the user moves off the UI, they won't be on the
|
||||
// same object anymore.
|
||||
gViewerWindow->setCursor(UI_CURSOR_ARROW);
|
||||
// Make sure the hover-picked object is ignored.
|
||||
//gToolTipView->resetLastHoverObject();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
avatar_object = (LLViewerObject*)avatar_object->getParent();
|
||||
}
|
||||
|
||||
if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
|
||||
{
|
||||
const F64 SELF_CLICK_WALK_DISTANCE = 3.0;
|
||||
// pretend we picked some point a bit in front of avatar
|
||||
mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
|
||||
}
|
||||
gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
|
||||
if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
|
||||
mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
|
||||
mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
|
||||
mAutoPilotDestination->setPixelSize(5);
|
||||
mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
|
||||
mAutoPilotDestination->setDuration(3.f);
|
||||
|
||||
handle_go_to();
|
||||
mBlockClickToWalk = false;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
gViewerWindow->setCursor(UI_CURSOR_ARROW);
|
||||
if (hasMouseCapture())
|
||||
{
|
||||
setMouseCapture(FALSE);
|
||||
}
|
||||
|
||||
mGrabMouseButtonDown = FALSE;
|
||||
LLToolMgr::getInstance()->clearTransientTool();
|
||||
gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
|
||||
|
||||
mBlockClickToWalk = false;
|
||||
return LLTool::handleMouseUp(x, y, mask);
|
||||
}
|
||||
|
||||
|
|
@ -936,7 +995,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
|
|||
p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
|
||||
p.visible_time_near(6.f);
|
||||
p.visible_time_far(3.f);
|
||||
p.delay_time(0.35f);
|
||||
p.delay_time(gSavedSettings.getF32("AvatarInspectorTooltipDelay"));
|
||||
p.wrap(false);
|
||||
|
||||
LLToolTipMgr::instance().show(p);
|
||||
|
|
@ -1054,7 +1113,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
|
|||
p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick));
|
||||
p.visible_time_near(6.f);
|
||||
p.visible_time_far(3.f);
|
||||
p.delay_time(0.35f);
|
||||
p.delay_time(gSavedSettings.getF32("ObjectInspectorTooltipDelay"));
|
||||
p.wrap(false);
|
||||
|
||||
LLToolTipMgr::instance().show(p);
|
||||
|
|
@ -1237,6 +1296,11 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
|
|||
}
|
||||
}
|
||||
|
||||
void LLToolPie::handleSelect()
|
||||
{
|
||||
// tool is reselected when app gets focus, etc.
|
||||
mBlockClickToWalk = true;
|
||||
}
|
||||
|
||||
void LLToolPie::handleDeselect()
|
||||
{
|
||||
|
|
@ -1275,10 +1339,20 @@ void LLToolPie::stopEditing()
|
|||
|
||||
void LLToolPie::onMouseCaptureLost()
|
||||
{
|
||||
mMouseOutsideSlop = FALSE;
|
||||
stopCameraSteering();
|
||||
mMouseButtonDown = false;
|
||||
handleMediaMouseUp();
|
||||
}
|
||||
|
||||
void LLToolPie::stopCameraSteering()
|
||||
{
|
||||
mMouseOutsideSlop = false;
|
||||
}
|
||||
|
||||
bool LLToolPie::inCameraSteerMode()
|
||||
{
|
||||
return mMouseButtonDown && mMouseOutsideSlop && gSavedSettings.getBOOL("ClickToWalk");
|
||||
}
|
||||
|
||||
// true if x,y outside small box around start_x,start_y
|
||||
BOOL LLToolPie::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y)
|
||||
|
|
@ -1444,8 +1518,6 @@ bool LLToolPie::handleMediaMouseUp()
|
|||
|
||||
mMediaMouseCaptureID.setNull();
|
||||
|
||||
setMouseCapture(FALSE);
|
||||
|
||||
result = true;
|
||||
}
|
||||
|
||||
|
|
@ -1508,7 +1580,7 @@ static ECursorType cursor_from_parcel_media(U8 click_action)
|
|||
|
||||
|
||||
// True if we handled the event.
|
||||
BOOL LLToolPie::pickRightMouseDownCallback()
|
||||
BOOL LLToolPie::handleRightClickPick()
|
||||
{
|
||||
S32 x = mPick.mMousePt.mX;
|
||||
S32 y = mPick.mMousePt.mY;
|
||||
|
|
@ -1630,10 +1702,148 @@ BOOL LLToolPie::pickRightMouseDownCallback()
|
|||
|
||||
void LLToolPie::showVisualContextMenuEffect()
|
||||
{
|
||||
// VEFFECT: ShowPie
|
||||
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
|
||||
effectp->setPositionGlobal(mPick.mPosGlobal);
|
||||
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
|
||||
effectp->setDuration(0.25f);
|
||||
|
||||
// VEFFECT: ShowPie
|
||||
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
|
||||
effectp->setPositionGlobal(mPick.mPosGlobal);
|
||||
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
|
||||
effectp->setDuration(0.25f);
|
||||
}
|
||||
|
||||
|
||||
bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, LLVector3& intersection_pt)
|
||||
{
|
||||
// do ray/sphere intersection by solving quadratic equation
|
||||
LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center;
|
||||
F32 B = 2.f * ray_dir * sphere_to_ray_start_vec;
|
||||
F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius);
|
||||
|
||||
F32 discriminant = B*B - 4.f*C;
|
||||
if (discriminant > 0.f)
|
||||
{ // intersection detected, now find closest one
|
||||
F32 t0 = (-B - sqrtf(discriminant)) / 2.f;
|
||||
if (t0 > 0.f)
|
||||
{
|
||||
intersection_pt = ray_pt + ray_dir * t0;
|
||||
}
|
||||
else
|
||||
{
|
||||
F32 t1 = (-B + sqrtf(discriminant)) / 2.f;
|
||||
intersection_pt = ray_pt + ray_dir * t1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLToolPie::startCameraSteering()
|
||||
{
|
||||
mMouseOutsideSlop = true;
|
||||
mBlockClickToWalk = true;
|
||||
|
||||
if (gAgentCamera.getFocusOnAvatar())
|
||||
{
|
||||
mSteerPick = mPick;
|
||||
|
||||
// handle special cases of steering picks
|
||||
LLViewerObject* avatar_object = mSteerPick.getObject();
|
||||
|
||||
// get pointer to avatar
|
||||
while (avatar_object && !avatar_object->isAvatar())
|
||||
{
|
||||
avatar_object = (LLViewerObject*)avatar_object->getParent();
|
||||
}
|
||||
|
||||
// if clicking on own avatar...
|
||||
if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
|
||||
{
|
||||
// ...project pick point a few meters in front of avatar
|
||||
mSteerPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * 3.0;
|
||||
}
|
||||
|
||||
if (!mSteerPick.isValid())
|
||||
{
|
||||
mSteerPick.mPosGlobal = gAgent.getPosGlobalFromAgent(
|
||||
LLViewerCamera::instance().getOrigin() + gViewerWindow->mouseDirectionGlobal(mSteerPick.mMousePt.mX, mSteerPick.mMousePt.mY) * 100.f);
|
||||
}
|
||||
|
||||
setMouseCapture(TRUE);
|
||||
|
||||
mMouseSteerX = mMouseDownX;
|
||||
mMouseSteerY = mMouseDownY;
|
||||
const LLVector3 camera_to_rotation_center = gAgent.getFrameAgent().getOrigin() - LLViewerCamera::instance().getOrigin();
|
||||
const LLVector3 rotation_center_to_pick = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal) - gAgent.getFrameAgent().getOrigin();
|
||||
|
||||
mClockwise = camera_to_rotation_center * rotation_center_to_pick < 0.f;
|
||||
if (mMouseSteerGrabPoint) { mMouseSteerGrabPoint->markDead(); }
|
||||
mMouseSteerGrabPoint = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
|
||||
mMouseSteerGrabPoint->setPositionGlobal(mSteerPick.mPosGlobal);
|
||||
mMouseSteerGrabPoint->setColor(LLColor4U(170, 210, 190));
|
||||
mMouseSteerGrabPoint->setPixelSize(5);
|
||||
mMouseSteerGrabPoint->setDuration(2.f);
|
||||
}
|
||||
}
|
||||
|
||||
void LLToolPie::steerCameraWithMouse(S32 x, S32 y)
|
||||
{
|
||||
const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f;
|
||||
|
||||
const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal);
|
||||
const LLVector3 rotation_center = gAgent.getFrameAgent().getOrigin();
|
||||
// FIXME: get this to work with camera tilt (i.e. sitting on a rotating object)
|
||||
const LLVector3 rotation_up_axis(LLVector3::z_axis);
|
||||
|
||||
LLVector3 object_rotation_center = rotation_center + parallel_component(pick_pos - rotation_center, rotation_up_axis);
|
||||
F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(rotation_center, LLViewerCamera::instance().getOrigin());;
|
||||
F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, object_rotation_center), min_rotation_radius, F32_MAX);
|
||||
|
||||
LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_up_axis);
|
||||
mouse_ray.normalize();
|
||||
|
||||
LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_up_axis);
|
||||
old_mouse_ray.normalize();
|
||||
|
||||
LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent();
|
||||
LLVector3 camera_to_rotation_center = object_rotation_center - camera_pos;
|
||||
LLVector3 adjusted_camera_pos = camera_pos + projected_vec(camera_to_rotation_center, rotation_up_axis);
|
||||
LLVector3 rotation_fwd_axis = LLViewerCamera::instance().getAtAxis() - projected_vec(LLViewerCamera::instance().getAtAxis(), rotation_up_axis);
|
||||
rotation_fwd_axis.normalize();
|
||||
F32 pick_dist = dist_vec(pick_pos, adjusted_camera_pos);
|
||||
|
||||
LLVector3 mouse_on_sphere;
|
||||
bool mouse_hit_sphere = intersect_ray_with_sphere(adjusted_camera_pos + (mouse_ray * pick_dist * 1.1f),
|
||||
-1.f * mouse_ray,
|
||||
object_rotation_center,
|
||||
pick_distance_from_rotation_center,
|
||||
mouse_on_sphere);
|
||||
|
||||
LLVector3 old_mouse_on_sphere;
|
||||
intersect_ray_with_sphere(adjusted_camera_pos + (old_mouse_ray * pick_dist * 1.1f),
|
||||
-1.f * old_mouse_ray,
|
||||
object_rotation_center,
|
||||
pick_distance_from_rotation_center,
|
||||
old_mouse_on_sphere);
|
||||
|
||||
if (mouse_hit_sphere)
|
||||
{
|
||||
// calculate rotation frame in screen space
|
||||
LLVector3 screen_rotation_up_axis = orthogonal_component(rotation_up_axis, LLViewerCamera::instance().getAtAxis());
|
||||
screen_rotation_up_axis.normalize();
|
||||
|
||||
LLVector3 screen_rotation_left_axis = screen_rotation_up_axis % LLViewerCamera::instance().getAtAxis();
|
||||
|
||||
LLVector3 rotation_furthest_pt = object_rotation_center + pick_distance_from_rotation_center * rotation_fwd_axis;
|
||||
F32 mouse_lateral_distance = llclamp(((mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f);
|
||||
F32 old_mouse_lateral_distance = llclamp(((old_mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f);
|
||||
|
||||
F32 yaw_angle = asinf(mouse_lateral_distance);
|
||||
F32 old_yaw_angle = asinf(old_mouse_lateral_distance);
|
||||
|
||||
F32 delta_angle = yaw_angle - old_yaw_angle;
|
||||
if (!mClockwise) delta_angle *= -1.f;
|
||||
|
||||
gAgent.yaw(delta_angle);
|
||||
mMouseSteerX = x;
|
||||
mMouseSteerY = y;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "lltool.h"
|
||||
#include "lluuid.h"
|
||||
#include "llviewerwindow.h" // for LLPickInfo
|
||||
#include "llhudeffectblob.h" // for LLPointer<LLHudEffectBlob>, apparently
|
||||
|
||||
class LLViewerObject;
|
||||
class LLObjectSelection;
|
||||
|
|
@ -56,6 +57,7 @@ public:
|
|||
virtual void stopEditing();
|
||||
|
||||
virtual void onMouseCaptureLost();
|
||||
virtual void handleSelect();
|
||||
virtual void handleDeselect();
|
||||
virtual LLTool* getOverrideTool(MASK mask);
|
||||
|
||||
|
|
@ -64,6 +66,7 @@ public:
|
|||
LLViewerObject* getClickActionObject() { return mClickActionObject; }
|
||||
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
|
||||
void resetSelection();
|
||||
void blockClickToWalk() { mBlockClickToWalk = true; }
|
||||
|
||||
static void selectionPropertiesReceived();
|
||||
|
||||
|
|
@ -75,8 +78,8 @@ public:
|
|||
|
||||
private:
|
||||
BOOL outsideSlop (S32 x, S32 y, S32 start_x, S32 start_y);
|
||||
BOOL pickLeftMouseDownCallback();
|
||||
BOOL pickRightMouseDownCallback();
|
||||
BOOL handleLeftClickPick();
|
||||
BOOL handleRightClickPick();
|
||||
BOOL useClickAction (MASK mask, LLViewerObject* object,LLViewerObject* parent);
|
||||
|
||||
void showVisualContextMenuEffect();
|
||||
|
|
@ -88,12 +91,26 @@ private:
|
|||
BOOL handleTooltipLand(std::string line, std::string tooltip_msg);
|
||||
BOOL handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg);
|
||||
|
||||
void steerCameraWithMouse(S32 x, S32 y);
|
||||
void startCameraSteering();
|
||||
void stopCameraSteering();
|
||||
bool inCameraSteerMode();
|
||||
|
||||
private:
|
||||
BOOL mGrabMouseButtonDown;
|
||||
BOOL mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
|
||||
bool mMouseButtonDown;
|
||||
bool mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
|
||||
S32 mMouseDownX;
|
||||
S32 mMouseDownY;
|
||||
S32 mMouseSteerX;
|
||||
S32 mMouseSteerY;
|
||||
LLPointer<LLHUDEffectBlob> mAutoPilotDestination;
|
||||
LLPointer<LLHUDEffectBlob> mMouseSteerGrabPoint;
|
||||
bool mClockwise;
|
||||
bool mBlockClickToWalk;
|
||||
LLUUID mMediaMouseCaptureID;
|
||||
LLPickInfo mPick;
|
||||
LLPickInfo mHoverPick;
|
||||
LLPickInfo mSteerPick;
|
||||
LLPointer<LLViewerObject> mClickActionObject;
|
||||
U8 mClickAction;
|
||||
LLSafeHandle<LLObjectSelection> mLeftClickSelection;
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ public:
|
|||
// these are static so that they can be used a callbacks
|
||||
static ETrackingStatus getTrackingStatus() { return instance()->mTrackingStatus; }
|
||||
static ETrackingLocationType getTrackedLocationType() { return instance()->mTrackingLocationType; }
|
||||
static BOOL isTracking(void*) { return (BOOL) instance()->mTrackingStatus; }
|
||||
static BOOL isTracking(void*) { return instance()->mTrackingStatus != TRACKING_NOTHING; }
|
||||
static void stopTracking(void*);
|
||||
static void clearFocus();
|
||||
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse)
|
|||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
|
||||
LLURLDispatcherImpl::regionNameCallback,
|
||||
slurl.getSLURLString(),
|
||||
false); // don't teleport
|
||||
LLUI::sSettingGroups["config"]->getBOOL("SLURLTeleportDirectly")); // don't teleport
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@
|
|||
#include "lluuid.h"
|
||||
#include "llkeyboard.h"
|
||||
#include "llmutelist.h"
|
||||
#include "llpanelprofile.h"
|
||||
#include "llappviewer.h"
|
||||
//#include "llfirstuse.h"
|
||||
#include "llwindow.h"
|
||||
|
||||
|
|
@ -292,6 +294,43 @@ public:
|
|||
|
||||
};
|
||||
|
||||
class LLViewerMediaWebProfileResponder : public LLHTTPClient::Responder
|
||||
{
|
||||
LOG_CLASS(LLViewerMediaWebProfileResponder);
|
||||
public:
|
||||
LLViewerMediaWebProfileResponder(std::string host)
|
||||
{
|
||||
mHost = host;
|
||||
}
|
||||
|
||||
~LLViewerMediaWebProfileResponder()
|
||||
{
|
||||
}
|
||||
|
||||
/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
|
||||
{
|
||||
LL_WARNS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
|
||||
LL_WARNS("MediaAuth") << content << LL_ENDL;
|
||||
|
||||
std::string cookie = content["set-cookie"].asString();
|
||||
|
||||
LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost);
|
||||
}
|
||||
|
||||
void completedRaw(
|
||||
U32 status,
|
||||
const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer)
|
||||
{
|
||||
// This is just here to disable the default behavior (attempting to parse the response as llsd).
|
||||
// We don't care about the content of the response, only the set-cookie header.
|
||||
}
|
||||
|
||||
std::string mHost;
|
||||
};
|
||||
|
||||
|
||||
LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
|
||||
LLURL LLViewerMedia::sOpenIDURL;
|
||||
std::string LLViewerMedia::sOpenIDCookie;
|
||||
|
|
@ -1351,6 +1390,19 @@ void LLViewerMedia::setOpenIDCookie()
|
|||
|
||||
// *HACK: Doing this here is nasty, find a better way.
|
||||
LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
|
||||
|
||||
// Do a web profile get so we can store the cookie
|
||||
LLSD headers = LLSD::emptyMap();
|
||||
headers["Accept"] = "*/*";
|
||||
headers["Cookie"] = sOpenIDCookie;
|
||||
headers["User-Agent"] = getCurrentUserAgent();
|
||||
|
||||
std::string profile_url = getProfileURL("");
|
||||
LLURL raw_profile_url( profile_url.c_str() );
|
||||
|
||||
LLHTTPClient::get(profile_url,
|
||||
new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),
|
||||
headers);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1833,17 +1885,12 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
|
|||
media_source->ignore_ssl_cert_errors(true);
|
||||
}
|
||||
|
||||
// NOTE: Removed as per STORM-927 - SSL handshake failed - setting local self-signed certs like this
|
||||
// seems to screw things up big time. For now, devs will need to add these certs locally and Qt will pick them up.
|
||||
// // start by assuming the default CA file will be used
|
||||
// std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "lindenlab.pem" );
|
||||
// // default turned off so pick up the user specified path
|
||||
// if( ! gSavedSettings.getBOOL("BrowserUseDefaultCAFile"))
|
||||
// {
|
||||
// ca_path = gSavedSettings.getString("BrowserCAFilePath");
|
||||
// }
|
||||
// // set the path to the CA.pem file
|
||||
// media_source->addCertificateFilePath( ca_path );
|
||||
// the correct way to deal with certs it to load ours from CA.pem and append them to the ones
|
||||
// Qt/WebKit loads from your system location.
|
||||
// Note: This needs the new CA.pem file with the Equifax Secure Certificate Authority
|
||||
// cert at the bottom: (MIIDIDCCAomgAwIBAgIENd70zzANBg)
|
||||
std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "CA.pem" );
|
||||
media_source->addCertificateFilePath( ca_path );
|
||||
|
||||
media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort"));
|
||||
|
||||
|
|
|
|||
|
|
@ -843,33 +843,53 @@ class LLAdvancedCheckFeature : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
void LLDestinationAndAvatarShow(const LLSD& value)
|
||||
void toggle_destination_and_avatar_picker(const LLSD& show)
|
||||
{
|
||||
S32 panel_idx = value.isDefined() ? value.asInteger() : -1;
|
||||
LLView* container = gViewerWindow->getRootView()->getChildView("avatar_picker_and_destination_guide_container");
|
||||
S32 panel_idx = show.isDefined() ? show.asInteger() : -1;
|
||||
LLView* container = gViewerWindow->getRootView()->findChildView("avatar_picker_and_destination_guide_container");
|
||||
if (!container) return;
|
||||
|
||||
LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents");
|
||||
LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents");
|
||||
if (!destinations || !avatar_picker) return;
|
||||
|
||||
LLButton* avatar_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("avatar_btn");
|
||||
LLButton* destination_btn = gViewerWindow->getRootView()->getChildView("bottom_tray")->getChild<LLButton>("destination_btn");
|
||||
|
||||
switch(panel_idx)
|
||||
{
|
||||
case 0:
|
||||
container->setVisible(true);
|
||||
destinations->setVisible(true);
|
||||
avatar_picker->setVisible(false);
|
||||
LLFirstUse::notUsingDestinationGuide(false);
|
||||
if (!destinations->getVisible())
|
||||
{
|
||||
container->setVisible(true);
|
||||
destinations->setVisible(true);
|
||||
avatar_picker->setVisible(false);
|
||||
LLFirstUse::notUsingDestinationGuide(false);
|
||||
avatar_btn->setToggleState(false);
|
||||
destination_btn->setToggleState(true);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
container->setVisible(true);
|
||||
destinations->setVisible(false);
|
||||
avatar_picker->setVisible(true);
|
||||
LLFirstUse::notUsingAvatarPicker(false);
|
||||
if (!avatar_picker->getVisible())
|
||||
{
|
||||
container->setVisible(true);
|
||||
destinations->setVisible(false);
|
||||
avatar_picker->setVisible(true);
|
||||
avatar_btn->setToggleState(true);
|
||||
destination_btn->setToggleState(false);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
container->setVisible(false);
|
||||
destinations->setVisible(false);
|
||||
avatar_picker->setVisible(false);
|
||||
break;
|
||||
}
|
||||
|
||||
container->setVisible(false);
|
||||
destinations->setVisible(false);
|
||||
avatar_picker->setVisible(false);
|
||||
avatar_btn->setToggleState(false);
|
||||
destination_btn->setToggleState(false);
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -5556,20 +5576,42 @@ class LLShowHelp : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
class LLToggleHelp : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
|
||||
if (help_browser && help_browser->isInVisibleChain())
|
||||
{
|
||||
help_browser->closeFloater();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string help_topic = userdata.asString();
|
||||
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
|
||||
vhelp->showTopic(help_topic);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class LLShowSidetrayPanel : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
std::string panel_name = userdata.asString();
|
||||
// Toggle the panel
|
||||
if (!LLSideTray::getInstance()->isPanelActive(panel_name))
|
||||
|
||||
LLPanel* panel = LLSideTray::getInstance()->getPanel(panel_name);
|
||||
if (panel)
|
||||
{
|
||||
// LLFloaterInventory::showAgentInventory();
|
||||
LLSideTray::getInstance()->showPanel(panel_name, LLSD());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSideTray::getInstance()->collapseSideBar();
|
||||
if (panel->isInVisibleChain())
|
||||
{
|
||||
LLSideTray::getInstance()->hidePanel(panel_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSideTray::getInstance()->showPanel(panel_name);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -5698,6 +5740,44 @@ class LLShowAgentProfile : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
class LLToggleAgentProfile : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
LLUUID agent_id;
|
||||
if (userdata.asString() == "agent")
|
||||
{
|
||||
agent_id = gAgent.getID();
|
||||
}
|
||||
else if (userdata.asString() == "hit object")
|
||||
{
|
||||
LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
|
||||
if (objectp)
|
||||
{
|
||||
agent_id = objectp->getID();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
agent_id = userdata.asUUID();
|
||||
}
|
||||
|
||||
LLVOAvatar* avatar = find_avatar_from_object(agent_id);
|
||||
if (avatar)
|
||||
{
|
||||
if (!LLAvatarActions::profileVisible(avatar->getID()))
|
||||
{
|
||||
LLAvatarActions::showProfile(avatar->getID());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLAvatarActions::hideProfile(avatar->getID());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class LLLandEdit : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
|
|
@ -7096,7 +7176,13 @@ LLViewerMenuHolderGL::LLViewerMenuHolderGL(const LLViewerMenuHolderGL::Params& p
|
|||
|
||||
BOOL LLViewerMenuHolderGL::hideMenus()
|
||||
{
|
||||
BOOL handled = LLMenuHolderGL::hideMenus();
|
||||
BOOL handled = FALSE;
|
||||
|
||||
if (LLMenuHolderGL::hideMenus())
|
||||
{
|
||||
LLToolPie::instance().blockClickToWalk();
|
||||
handled = TRUE;
|
||||
}
|
||||
|
||||
// drop pie menu selection
|
||||
mParcelSelection = NULL;
|
||||
|
|
@ -8094,8 +8180,10 @@ void initialize_menus()
|
|||
commit.add("ReportAbuse", boost::bind(&handle_report_abuse));
|
||||
commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
|
||||
view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
|
||||
view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
|
||||
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
|
||||
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
|
||||
view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");
|
||||
view_listener_t::addMenu(new LLToggleControl(), "ToggleControl");
|
||||
view_listener_t::addMenu(new LLCheckControl(), "CheckControl");
|
||||
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
|
||||
|
|
@ -8116,5 +8204,6 @@ void initialize_menus()
|
|||
|
||||
view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
|
||||
|
||||
commit.add("DestinationAndAvatar.show", boost::bind(&LLDestinationAndAvatarShow, _2));
|
||||
commit.add("Destination.show", boost::bind(&toggle_destination_and_avatar_picker, 0));
|
||||
commit.add("Avatar.show", boost::bind(&toggle_destination_and_avatar_picker, 1));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,6 +126,8 @@ bool enable_pay_object();
|
|||
bool enable_buy_object();
|
||||
bool handle_go_to();
|
||||
|
||||
void toggle_destination_and_avatar_picker(const LLSD& show);
|
||||
|
||||
// Export to XML or Collada
|
||||
void handle_export_selected( void * );
|
||||
|
||||
|
|
|
|||
|
|
@ -1199,7 +1199,6 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
|
|||
// Highlight item
|
||||
const BOOL auto_open =
|
||||
gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false
|
||||
!(asset_type == LLAssetType::AT_CALLINGCARD) && // don't open if it's a calling card
|
||||
!from_name.empty(); // don't open if it's not from anyone.
|
||||
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
|
||||
if(active_panel)
|
||||
|
|
@ -1463,15 +1462,18 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
|
|||
// This is an offer from an agent. In this case, the back
|
||||
// end has already copied the items into your inventory,
|
||||
// so we can fetch it out of our inventory.
|
||||
LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
|
||||
open_agent_offer->startFetch();
|
||||
if(catp || (itemp && itemp->isFinished()))
|
||||
if (gSavedSettings.getBOOL("ShowOfferedInventory"))
|
||||
{
|
||||
open_agent_offer->done();
|
||||
}
|
||||
else
|
||||
{
|
||||
opener = open_agent_offer;
|
||||
LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
|
||||
open_agent_offer->startFetch();
|
||||
if(catp || (itemp && itemp->isFinished()))
|
||||
{
|
||||
open_agent_offer->done();
|
||||
}
|
||||
else
|
||||
{
|
||||
opener = open_agent_offer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -1715,15 +1717,18 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
|
|||
msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
|
||||
// send the message
|
||||
msg->sendReliable(mHost);
|
||||
|
||||
if (gSavedSettings.getBOOL("LogInventoryDecline"))
|
||||
{
|
||||
LLStringUtil::format_map_t log_message_args;
|
||||
log_message_args["DESC"] = mDesc;
|
||||
log_message_args["NAME"] = mFromName;
|
||||
log_message = LLTrans::getString("InvOfferDecline", log_message_args);
|
||||
|
||||
LLSD args;
|
||||
args["MESSAGE"] = log_message;
|
||||
LLNotificationsUtil::add("SystemMessage", args);
|
||||
}
|
||||
LLSD args;
|
||||
args["MESSAGE"] = log_message;
|
||||
LLNotificationsUtil::add("SystemMessage", args);
|
||||
|
||||
if (busy && (!mFromGroup && !mFromObject))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include "llviewercontrol.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llsecapi.h"
|
||||
#include "lltrans.h"
|
||||
#include "llweb.h"
|
||||
|
||||
|
||||
|
|
@ -504,7 +505,8 @@ void LLGridManager::setGridChoice(const std::string& grid)
|
|||
addGrid(grid_data);
|
||||
}
|
||||
mGrid = grid;
|
||||
gSavedSettings.setString("CurrentGrid", grid);
|
||||
gSavedSettings.setString("CurrentGrid", grid);
|
||||
|
||||
updateIsInProductionGrid();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@
|
|||
#include "llworld.h"
|
||||
#include "llspatialpartition.h"
|
||||
#include "stringize.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
#ifdef LL_WINDOWS
|
||||
#pragma warning(disable:4355)
|
||||
|
|
@ -1387,10 +1388,15 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
|
|||
capabilityNames.append("EventQueueGet");
|
||||
capabilityNames.append("ObjectMedia");
|
||||
capabilityNames.append("ObjectMediaNavigate");
|
||||
capabilityNames.append("FetchLib2");
|
||||
capabilityNames.append("FetchLibDescendents2");
|
||||
capabilityNames.append("FetchInventory2");
|
||||
capabilityNames.append("FetchInventoryDescendents2");
|
||||
|
||||
if (gSavedSettings.getBOOL("UseHTTPInventory"))
|
||||
{
|
||||
capabilityNames.append("FetchLib2");
|
||||
capabilityNames.append("FetchLibDescendents2");
|
||||
capabilityNames.append("FetchInventory2");
|
||||
capabilityNames.append("FetchInventoryDescendents2");
|
||||
}
|
||||
|
||||
capabilityNames.append("GetDisplayNames");
|
||||
capabilityNames.append("GetTexture");
|
||||
capabilityNames.append("GroupProposalBallot");
|
||||
|
|
|
|||
|
|
@ -852,6 +852,8 @@ void send_stats()
|
|||
body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");
|
||||
body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames");
|
||||
|
||||
body["MinimalSkin"] = !gSavedSettings.getString("SessionSettingsFile").empty();
|
||||
|
||||
LLViewerStats::getInstance()->addToMessage(body);
|
||||
LLHTTPClient::post(url, body, new ViewerStatsResponder());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1624,6 +1624,7 @@ void LLViewerWindow::initBase()
|
|||
|
||||
// Constrain floaters to inside the menu and status bar regions.
|
||||
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
|
||||
gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle());
|
||||
gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View");
|
||||
|
||||
|
||||
|
|
@ -1785,6 +1786,7 @@ void LLViewerWindow::initWorldUI()
|
|||
buttons_panel_container->addChild(buttons_panel);
|
||||
|
||||
LLView* avatar_picker_destination_guide_container = gViewerWindow->getRootView()->getChild<LLView>("avatar_picker_and_destination_guide_container");
|
||||
avatar_picker_destination_guide_container->getChild<LLButton>("close")->setCommitCallback(boost::bind(toggle_destination_and_avatar_picker, LLSD()));
|
||||
LLMediaCtrl* destinations = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("destination_guide_contents");
|
||||
LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents");
|
||||
if (destinations)
|
||||
|
|
@ -1797,6 +1799,11 @@ void LLViewerWindow::initWorldUI()
|
|||
avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html");
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
|
||||
{
|
||||
toggle_destination_and_avatar_picker(0);
|
||||
gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
// Destroy the UI
|
||||
|
|
@ -2568,10 +2575,6 @@ void LLViewerWindow::updateUI()
|
|||
{
|
||||
LLFirstUse::notUsingDestinationGuide();
|
||||
}
|
||||
if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("AvatarPickerHintTimeout"))
|
||||
{
|
||||
LLFirstUse::notUsingAvatarPicker();
|
||||
}
|
||||
if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout"))
|
||||
{
|
||||
LLFirstUse::notUsingSidePanel();
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llui.h"
|
||||
|
||||
class LLVoiceCallAvatarHandler : public LLCommandHandler
|
||||
{
|
||||
|
|
@ -38,6 +40,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableVoiceCall"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoVoiceCall", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
//Make sure we have some parameters
|
||||
if (params.size() == 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -6851,7 +6851,6 @@ void LLPipeline::renderDeferredLighting()
|
|||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
LLHUDObject::renderAll();
|
||||
gObjectList.resetObjectBeacons();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -674,4 +674,5 @@ with the same filename but different name
|
|||
|
||||
<texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
|
||||
<texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
|
||||
<texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
|
||||
</textures>
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
|
|
@ -80,6 +80,13 @@
|
|||
user_resize="false"
|
||||
name="hud container"
|
||||
width="500">
|
||||
<view top="0"
|
||||
follows="all"
|
||||
height="500"
|
||||
left="0"
|
||||
mouse_opaque="false"
|
||||
name="floater_snap_region"
|
||||
width="500"/>
|
||||
<panel follows="left|top"
|
||||
height="19"
|
||||
left="0"
|
||||
|
|
|
|||
|
|
@ -1,63 +1,249 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu
|
||||
create_jump_keys="true"
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
visible="false"
|
||||
name="Gear Menu">
|
||||
layout="topleft"
|
||||
name="Self Pie">
|
||||
<menu_item_call
|
||||
label="Sit Down"
|
||||
enabled="true"
|
||||
name="sit_down_here">
|
||||
layout="topleft"
|
||||
name="Sit Down Here">
|
||||
<menu_item_call.on_click
|
||||
function="Self.SitDown"
|
||||
parameter="" />
|
||||
<menu_item_call.on_visible
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableSitDown" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Stand Up"
|
||||
enabled="true"
|
||||
name="stand_up">
|
||||
layout="topleft"
|
||||
name="Stand Up">
|
||||
<menu_item_call.on_click
|
||||
function="Self.StandUp"
|
||||
parameter="" />
|
||||
<menu_item_call.on_visible
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableStandUp" />
|
||||
</menu_item_call>
|
||||
<context_menu
|
||||
label="Take Off"
|
||||
layout="topleft"
|
||||
name="Take Off >">
|
||||
<context_menu
|
||||
label="Clothes"
|
||||
layout="topleft"
|
||||
name="Clothes >">
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Shirt"
|
||||
layout="topleft"
|
||||
name="Shirt">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="shirt" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="shirt" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Pants"
|
||||
layout="topleft"
|
||||
name="Pants">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="pants" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="pants" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Skirt"
|
||||
layout="topleft"
|
||||
name="Skirt">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="skirt" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="skirt" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Shoes"
|
||||
layout="topleft"
|
||||
name="Shoes">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="shoes" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="shoes" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Socks"
|
||||
layout="topleft"
|
||||
name="Socks">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="socks" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="socks" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Jacket"
|
||||
layout="topleft"
|
||||
name="Jacket">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="jacket" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="jacket" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Gloves"
|
||||
layout="topleft"
|
||||
name="Gloves">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="gloves" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="gloves" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Undershirt"
|
||||
layout="topleft"
|
||||
name="Self Undershirt">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="undershirt" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="undershirt" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Underpants"
|
||||
layout="topleft"
|
||||
name="Self Underpants">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="underpants" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="underpants" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Tattoo"
|
||||
layout="topleft"
|
||||
name="Self Tattoo">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="tattoo" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="tattoo" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Alpha"
|
||||
layout="topleft"
|
||||
name="Self Alpha">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="alpha" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="alpha" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="All Clothes"
|
||||
layout="topleft"
|
||||
name="All Clothes">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="all" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
<context_menu
|
||||
label="HUD"
|
||||
layout="topleft"
|
||||
name="Object Detach HUD" />
|
||||
<context_menu
|
||||
label="Detach"
|
||||
layout="topleft"
|
||||
name="Object Detach" />
|
||||
<menu_item_call
|
||||
label="Detach All"
|
||||
layout="topleft"
|
||||
name="Detach All">
|
||||
<menu_item_call.on_click
|
||||
function="Self.RemoveAllAttachments"
|
||||
parameter="" />
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableRemoveAllAttachments" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
<menu_item_call
|
||||
label="Change Outfit"
|
||||
name="change_outfit">
|
||||
label="Change Outfit"
|
||||
layout="topleft"
|
||||
name="Chenge Outfit">
|
||||
<menu_item_call.on_click
|
||||
function="CustomizeAvatar" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableCustomizeAvatar" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="My Profile"
|
||||
enabled="true"
|
||||
name="my_profile">
|
||||
<menu_item_call label="Edit My Outfit"
|
||||
layout="topleft"
|
||||
name="Edit Outfit">
|
||||
<menu_item_call.on_click
|
||||
function="ShowAgentProfile"
|
||||
parameter="agent" />
|
||||
function="EditOutfit" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableCustomizeAvatar" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Edit My Shape"
|
||||
layout="topleft"
|
||||
name="Edit My Shape">
|
||||
<menu_item_call.on_click
|
||||
function="EditShape" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableEditShape" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="My Friends"
|
||||
name="my_friends">
|
||||
label="My Friends"
|
||||
layout="topleft"
|
||||
name="Friends...">
|
||||
<menu_item_call.on_click
|
||||
function="SideTray.PanelPeopleTab"
|
||||
parameter="friends_panel" />
|
||||
function="SideTray.PanelPeopleTab"
|
||||
parameter="friends_panel" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="My Groups"
|
||||
name="my_groups">
|
||||
layout="topleft"
|
||||
name="Groups...">
|
||||
<menu_item_call.on_click
|
||||
function="SideTray.PanelPeopleTab"
|
||||
parameter="groups_panel" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Debug Textures"
|
||||
name="Debug...">
|
||||
label="My Profile"
|
||||
layout="topleft"
|
||||
name="Profile...">
|
||||
<menu_item_call.on_click
|
||||
function="ShowAgentProfile"
|
||||
parameter="agent" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Debug Textures"
|
||||
name="Debug...">
|
||||
<menu_item_call.on_click
|
||||
function="Avatar.Debug" />
|
||||
<menu_item_call.on_visible
|
||||
|
|
|
|||
|
|
@ -261,6 +261,17 @@
|
|||
function="Floater.Toggle"
|
||||
parameter="world_map" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Search"
|
||||
name="Search"
|
||||
shortcut="control|F">
|
||||
<menu_item_check.on_check
|
||||
function="Floater.Visible"
|
||||
parameter="search" />
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="search" />
|
||||
</menu_item_check>
|
||||
<menu_item_call
|
||||
label="Snapshot"
|
||||
name="Take Snapshot"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -47,8 +47,8 @@ auto_resize="false"
|
|||
follows="left|bottom"
|
||||
name="login"
|
||||
layout="topleft"
|
||||
width="695"
|
||||
min_width="695"
|
||||
width="705"
|
||||
min_width="705"
|
||||
user_resize="false"
|
||||
height="80">
|
||||
<text
|
||||
|
|
@ -67,8 +67,7 @@ follows="left|bottom"
|
|||
height="22"
|
||||
left_delta="0"
|
||||
max_chars="128"
|
||||
prevalidate_callback="ascii"
|
||||
select_on_focus="true"
|
||||
combo_editor.prevalidate_callback="ascii"
|
||||
tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
|
||||
top_pad="0"
|
||||
name="username_combo"
|
||||
|
|
@ -118,13 +117,41 @@ label="Remember password"
|
|||
name="connect_btn"
|
||||
top="35"
|
||||
width="90" />
|
||||
<text
|
||||
follows="left|bottom"
|
||||
font="SansSerifSmall"
|
||||
height="15"
|
||||
left_pad="10"
|
||||
name="mode_selection_text"
|
||||
top="20"
|
||||
width="130">
|
||||
Mode:
|
||||
</text>
|
||||
<combo_box
|
||||
follows="left|bottom"
|
||||
height="23"
|
||||
max_chars="128"
|
||||
tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."
|
||||
top_pad="0"
|
||||
control_name="SessionSettingsFile"
|
||||
name="mode_combo"
|
||||
width="110">
|
||||
<combo_box.item
|
||||
label="Basic"
|
||||
name="Basic"
|
||||
value="settings_minimal.xml" />
|
||||
<combo_box.item
|
||||
label="Advanced"
|
||||
name="Advanced"
|
||||
value="" />
|
||||
</combo_box>
|
||||
<text
|
||||
follows="left|bottom"
|
||||
font="SansSerifSmall"
|
||||
height="15"
|
||||
left_pad="18"
|
||||
left_pad="8"
|
||||
name="start_location_text"
|
||||
top="20"
|
||||
top="20"
|
||||
width="130">
|
||||
Start at:
|
||||
</text>
|
||||
|
|
@ -136,7 +163,7 @@ control_name="NextLoginLocation"
|
|||
max_chars="128"
|
||||
top_pad="0"
|
||||
name="start_location_combo"
|
||||
width="170">
|
||||
width="165">
|
||||
<combo_box.item
|
||||
label="My last location"
|
||||
name="MyLastLocation"
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
follows="all"
|
||||
height="383"
|
||||
layout="topleft"
|
||||
left="5"
|
||||
left="3"
|
||||
name="tabs"
|
||||
tab_group="1"
|
||||
tab_min_width="70"
|
||||
|
|
@ -84,7 +84,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
tab_position="top"
|
||||
top_pad="10"
|
||||
halign="center"
|
||||
width="317">
|
||||
width="319">
|
||||
<panel
|
||||
background_opaque="true"
|
||||
background_visible="true"
|
||||
|
|
@ -106,20 +106,20 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
left="3"
|
||||
mouse_opaque="false"
|
||||
name="Net Map"
|
||||
width="307"
|
||||
width="305"
|
||||
height="140"
|
||||
top="0"/>
|
||||
top="5"/>
|
||||
<avatar_list
|
||||
allow_select="true"
|
||||
follows="top|left|bottom|right"
|
||||
height="216"
|
||||
height="211"
|
||||
ignore_online_status="true"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
multi_select="true"
|
||||
name="avatar_list"
|
||||
top="145"
|
||||
width="307" />
|
||||
width="306" />
|
||||
<panel
|
||||
background_visible="true"
|
||||
follows="left|right|bottom"
|
||||
|
|
@ -165,7 +165,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
layout="topleft"
|
||||
left_pad="1"
|
||||
name="dummy_icon"
|
||||
width="241"
|
||||
width="243"
|
||||
/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
@ -251,7 +251,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
top_pad="1"
|
||||
left="0"
|
||||
name="bottom_panel"
|
||||
width="305">
|
||||
width="308">
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
height="25"
|
||||
|
|
@ -300,7 +300,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
layout="topleft"
|
||||
name="dummy_panel"
|
||||
user_resize="false"
|
||||
width="212">
|
||||
width="210">
|
||||
<icon
|
||||
follows="bottom|left|right"
|
||||
height="25"
|
||||
|
|
@ -309,7 +309,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
left="0"
|
||||
top="0"
|
||||
name="dummy_icon"
|
||||
width="211" />
|
||||
width="210" />
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
|
|
@ -471,7 +471,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
layout="topleft"
|
||||
left_pad="1"
|
||||
name="dummy_icon"
|
||||
width="209"
|
||||
width="212"
|
||||
/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
@ -506,7 +506,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
height="27"
|
||||
label="bottom_panel"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
left="3"
|
||||
name="bottom_panel"
|
||||
top_pad="0"
|
||||
width="313">
|
||||
|
|
@ -544,7 +544,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
layout="topleft"
|
||||
left_pad="1"
|
||||
name="dummy_icon"
|
||||
width="241"
|
||||
width="244"
|
||||
/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
|
||||
</string>
|
||||
<button name="back_btn" tool_tip="Atrás"/>
|
||||
<text name="title" value="Añadir el perfil"/>
|
||||
<text name="title" value="Perfil del lugar"/>
|
||||
<scroll_container name="place_scroll">
|
||||
<panel name="scrolling_panel">
|
||||
<text name="maturity_value" value="desconocido"/>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<string name="anyone" value="Cualquiera"/>
|
||||
<string name="available" value="disponible"/>
|
||||
<string name="allocated" value="asignados"/>
|
||||
<string name="title_place" value="Añadir el perfil"/>
|
||||
<string name="title_place" value="Perfil del lugar"/>
|
||||
<string name="title_teleport_history" value="Historial de teleportes"/>
|
||||
<string name="not_available" value="(No disp.)"/>
|
||||
<string name="unknown" value="(desconocido)"/>
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
|
||||
</string>
|
||||
<button name="back_btn" tool_tip="Atrás"/>
|
||||
<text name="title" value="Añadir el perfil"/>
|
||||
<text name="title" value="Perfil del lugar"/>
|
||||
<scroll_container name="place_scroll">
|
||||
<panel name="scrolling_panel">
|
||||
<text name="owner_label" value="Propietario:"/>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<colors>
|
||||
<color
|
||||
name="MenuBarBgColor"
|
||||
value="0 0 0 0" />
|
||||
</colors>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 6.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 153 B |
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
<textures version="101">
|
||||
<texture name="Button_Separator" file_name="bottomtray/button_separator.png" preload="true" />
|
||||
<texture name="arrow_keys.png"/>
|
||||
<texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />
|
||||
<texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />
|
||||
<texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" />
|
||||
</textures>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue