syncing up to viewer-development

master
Oz Linden 2011-03-24 13:22:43 -04:00
commit fb1facf13a
564 changed files with 12221 additions and 894 deletions

View File

@ -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

View File

@ -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

View File

@ -412,6 +412,7 @@ Jonathan Yap
STORM-975
STORM-990
STORM-1020
STORM-1064
Kage Pixel
VWR-11
Ken March

View File

@ -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

View File

@ -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.

View File

@ -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";

View File

@ -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(

View File

@ -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;

View File

@ -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.

View File

@ -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)

View File

@ -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;

View File

@ -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;
}

View File

@ -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
{

View File

@ -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;

View File

@ -346,7 +346,7 @@ void LLRadioGroup::setValue( const LLSD& value )
}
else
{
llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
setSelectedIndex(-1, TRUE);
}
}
}

View File

@ -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();
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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();
};

View File

@ -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;
}

View File

@ -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:

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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

View File

@ -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

View File

@ -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-----

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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&apos;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>

View File

@ -2979,6 +2979,9 @@ public:
gAgent.setGenderChosen(TRUE);
}
// release avatar picker keyboard focus
gFocusMgr.setKeyboardFocus( NULL );
return true;
}
};

View File

@ -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())

View File

@ -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;

View File

@ -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)
{

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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();

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View File

@ -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)
{

View File

@ -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;

View File

@ -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()
{
}

View File

@ -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

View File

@ -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;
}

View File

@ -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();

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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);
}

View File

@ -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);

View File

@ -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");
}

View File

@ -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))
{

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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")
{

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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

View File

@ -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;

View File

@ -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.

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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();

View File

@ -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;
}

View File

@ -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"));

View File

@ -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));
}

View File

@ -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 * );

View File

@ -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))
{

View File

@ -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();
}

View File

@ -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");

View File

@ -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());
}

View File

@ -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();

View File

@ -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)
{

View File

@ -6851,7 +6851,6 @@ void LLPipeline::renderDeferredLighting()
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
}

View File

@ -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

View File

@ -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"

View File

@ -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 &gt;">
<context_menu
label="Clothes"
layout="topleft"
name="Clothes &gt;">
<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

View File

@ -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

View File

@ -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"

View File

@ -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>

View File

@ -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"/>

View File

@ -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:"/>

View File

@ -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

View File

@ -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