diff --git a/doc/contributions.txt b/doc/contributions.txt
index e67df2453e..ce64a93126 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -219,6 +219,7 @@ Ansariel Hiller
STORM-2105
STORM-2151
MAINT-8085
+ STORM-2145
Aralara Rajal
Arare Chantilly
CHUIBUG-191
@@ -772,6 +773,7 @@ Jonathan Yap
STORM-2100
STORM-2104
STORM-2142
+ STORM-2145
Kadah Coba
STORM-1060
STORM-1843
@@ -1490,6 +1492,7 @@ Whirly Fizzle
STORM-1930
BUG-6659
STORM-2078
+ BUG-17349
Whoops Babii
VWR-631
VWR-1640
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index a245dd8f78..2dcc62ce79 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1,5 +1,4 @@
/**
-
* @file llfloater.cpp
* @brief LLFloater base class
*
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 550bee5c70..e53ecd30c2 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -212,7 +212,8 @@ public:
virtual void setColor(const LLColor4& color);
- F32 getCurrentTransparency();
+ // Ansariel: Changed to virtual. We might want to change the transparency ourself!
+ virtual F32 getCurrentTransparency();
void setTransparencyType(ETypeTransparency type);
ETypeTransparency getTransparencyType() const {return mTransparencyType;}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 23337ddbfb..237821f806 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -279,6 +279,7 @@ set(viewer_SOURCE_FILES
llfloaterperms.cpp
llfloaterpostprocess.cpp
llfloaterpreference.cpp
+ llfloaterpreferenceviewadvanced.cpp
llfloaterpreviewtrash.cpp
llfloaterproperties.cpp
llfloaterregiondebugconsole.cpp
@@ -467,6 +468,7 @@ set(viewer_SOURCE_FILES
llpanelplaceprofile.cpp
llpanelplaces.cpp
llpanelplacestab.cpp
+ llpanelpresetscamerapulldown.cpp
llpanelpresetspulldown.cpp
llpanelprimmediacontrols.cpp
llpanelprofile.cpp
@@ -903,6 +905,7 @@ set(viewer_HEADER_FILES
llfloaterperms.h
llfloaterpostprocess.h
llfloaterpreference.h
+ llfloaterpreferenceviewadvanced.h
llfloaterpreviewtrash.h
llfloaterproperties.h
llfloaterregiondebugconsole.h
@@ -1082,6 +1085,7 @@ set(viewer_HEADER_FILES
llpanelplaceprofile.h
llpanelplaces.h
llpanelplacestab.h
+ llpanelpresetscamerapulldown.h
llpanelpresetspulldown.h
llpanelprimmediacontrols.h
llpanelprofile.h
diff --git a/indra/newview/app_settings/camera/Front.xml b/indra/newview/app_settings/camera/Front.xml
new file mode 100644
index 0000000000..d5ead526b7
--- /dev/null
+++ b/indra/newview/app_settings/camera/Front.xml
@@ -0,0 +1,115 @@
+
+
+
diff --git a/indra/newview/app_settings/camera/Pennys_Gamer.xml b/indra/newview/app_settings/camera/Pennys_Gamer.xml
new file mode 100644
index 0000000000..5d249153a0
--- /dev/null
+++ b/indra/newview/app_settings/camera/Pennys_Gamer.xml
@@ -0,0 +1,115 @@
+
+
+ AppearanceCameraMovement
+
+ Comment
+ When entering appearance editing mode, camera zooms in on currently selected portion of avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ CameraAngle
+
+ Comment
+ Camera field of view angle (Radians)
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1.047197551
+
+ CameraOffsetBuild
+
+ Comment
+ Default camera position relative to focus point when entering build mode
+ Persist
+ 1
+ Type
+ Vector3
+ Value
+
+ -6
+ 0
+ 6
+
+
+ CameraOffsetRearView
+
+ Comment
+ Initial camera offset from avatar in Rear View
+ Persist
+ 1
+ Type
+ Vector3
+ Value
+
+ -3.0
+ 0.0
+ -0.2
+
+
+ CameraOffsetScale
+
+ Comment
+ Scales the default offset
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1
+
+ EditCameraMovement
+
+ Comment
+ When entering build mode, camera moves up above avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ FocusOffsetRearView
+
+ Comment
+ Initial focus point offset relative to avatar for the camera preset Rear View (x-axis is forward)
+ Persist
+ 1
+ Type
+ Vector3D
+ Value
+
+ 0.9
+ 0.0
+ 0.2
+
+
+ PresetCameraActive
+
+ Comment
+ Name of currently selected preference
+ Persist
+ 1
+ Type
+ String
+ Value
+ Default
+
+ TrackFocusObject
+
+ Comment
+ Camera tracks last object zoomed on
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+
+
diff --git a/indra/newview/app_settings/camera/Rear.xml b/indra/newview/app_settings/camera/Rear.xml
new file mode 100644
index 0000000000..0bfe5a9ed8
--- /dev/null
+++ b/indra/newview/app_settings/camera/Rear.xml
@@ -0,0 +1,115 @@
+
+
+ AppearanceCameraMovement
+
+ Comment
+ When entering appearance editing mode, camera zooms in on currently selected portion of avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ CameraAngle
+
+ Comment
+ Camera field of view angle (Radians)
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1.047197551
+
+ CameraOffsetBuild
+
+ Comment
+ Default camera position relative to focus point when entering build mode
+ Persist
+ 1
+ Type
+ Vector3
+ Value
+
+ -6
+ 0
+ 6
+
+
+ CameraOffsetRearView
+
+ Comment
+ Initial camera offset from avatar in Rear View
+ Persist
+ 1
+ Type
+ Vector3
+ Value
+
+ -3
+ 0
+ 0.75
+
+
+ CameraOffsetScale
+
+ Comment
+ Scales the default offset
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1
+
+ EditCameraMovement
+
+ Comment
+ When entering build mode, camera moves up above avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ FocusOffsetRearView
+
+ Comment
+ Initial focus point offset relative to avatar for the camera preset Rear View (x-axis is forward)
+ Persist
+ 1
+ Type
+ Vector3D
+ Value
+
+ 1.0
+ 0.0
+ 1.0
+
+
+ PresetCameraActive
+
+ Comment
+ Name of currently selected preference
+ Persist
+ 1
+ Type
+ String
+ Value
+ Default
+
+ TrackFocusObject
+
+ Comment
+ Camera tracks last object zoomed on
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+
+
diff --git a/indra/newview/app_settings/camera/Side.xml b/indra/newview/app_settings/camera/Side.xml
new file mode 100644
index 0000000000..4cd5f2f5a4
--- /dev/null
+++ b/indra/newview/app_settings/camera/Side.xml
@@ -0,0 +1,115 @@
+
+
+ AppearanceCameraMovement
+
+ Comment
+ When entering appearance editing mode, camera zooms in on currently selected portion of avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ CameraAngle
+
+ Comment
+ Camera field of view angle (Radians)
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1.047197551
+
+ CameraOffsetBuild
+
+ Comment
+ Default camera position relative to focus point when entering build mode
+ Persist
+ 1
+ Type
+ Vector3
+ Value
+
+ -6
+ 0
+ 6
+
+
+ CameraOffsetRearView
+
+ Comment
+ Initial camera offset from avatar in Rear View
+ Persist
+ 1
+ Type
+ Vector3
+ Value
+
+ -1.0
+ 0.7
+ 0.5
+
+
+ CameraOffsetScale
+
+ Comment
+ Scales the default offset
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1
+
+ EditCameraMovement
+
+ Comment
+ When entering build mode, camera moves up above avatar
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ FocusOffsetRearView
+
+ Comment
+ Initial focus point offset relative to avatar for the camera preset Rear View (x-axis is forward)
+ Persist
+ 1
+ Type
+ Vector3D
+ Value
+
+ 1.5
+ 0.7
+ 1.0
+
+
+ PresetCameraActive
+
+ Comment
+ Name of currently selected preference
+ Persist
+ 1
+ Type
+ String
+ Value
+ Default
+
+ TrackFocusObject
+
+ Comment
+ Camera tracks last object zoomed on
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+
+
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index bbd7f65383..fded2f4f84 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2369,7 +2369,8 @@
Value
0
- DEPRECATED: DebugShowPrivateMem
+ DEPRECATED: DebugShowPrivateMem
+
Comment
Show Private Mem Info
@@ -6408,7 +6409,8 @@
Value
600.0
- MemoryPrivatePoolEnabled
+ MemoryPrivatePoolEnabled
+
Comment
DEPRECATED: Enable the private memory pool management
@@ -6419,7 +6421,8 @@
Value
0
- MemoryPrivatePoolSize
+ MemoryPrivatePoolSize
+
Comment
DEPRECATED: Size of the private memory pool in MB (min. value is 256)
@@ -16167,7 +16170,29 @@
Value
0
- CefVerboseLog
+ CameraOpacity
+
+ Comment
+ Opacity of the Camera Controls floater
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 1.0
+
+ PresetCameraActive
+
+ Comment
+ Name of currently selected preference
+ Persist
+ 1
+ Type
+ String
+ Value
+
+
+CefVerboseLog
Comment
Enable/disable CEF verbose loggingk
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index ab793ff316..29a1891d82 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -56,7 +56,10 @@ enum ECameraPreset
CAMERA_PRESET_FRONT_VIEW,
/** "Above and to the left, over the shoulder, pulled back a little on the zoom" */
- CAMERA_PRESET_GROUP_VIEW
+ CAMERA_PRESET_GROUP_VIEW,
+
+ /** Current view when a preset is saved */
+ CAMERA_PRESET_CUSTOM0
};
//------------------------------------------------------------------------
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 20d650fa37..c12ccb386e 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -42,6 +42,7 @@
#include "llslider.h"
#include "llfirstuse.h"
#include "llhints.h"
+#include "lltabcontainer.h"
static LLDefaultChildRegistry::Register r("panel_camera_item");
@@ -353,6 +354,7 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
{
LLHints::registerHintTarget("view_popup", getHandle());
mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
+ mCommitCallbackRegistrar.add("Presets.GoViewPrefs", boost::bind(&LLFloaterCamera::onViewButtonClick, this, _2));
}
// virtual
@@ -376,6 +378,33 @@ BOOL LLFloaterCamera::postBuild()
return LLFloater::postBuild();
}
+F32 LLFloaterCamera::getCurrentTransparency()
+{
+
+ static LLCachedControl camera_opacity(gSavedSettings, "CameraOpacity");
+ static LLCachedControl active_floater_transparency(gSavedSettings, "ActiveFloaterTransparency");
+ return llmin(camera_opacity(), active_floater_transparency());
+
+}
+
+void LLFloaterCamera::onViewButtonClick(const LLSD& user_data)
+{
+ // bring up the prefs floater
+ LLFloater* prefsfloater = LLFloaterReg::showInstance("preferences");
+ if (prefsfloater)
+ {
+ // grab the 'view' panel from the preferences floater and
+ // bring it the front!
+ LLTabContainer* tabcontainer = prefsfloater->getChild("pref core");
+ LLPanel* graphicspanel = prefsfloater->getChild("view");
+ if (tabcontainer && graphicspanel)
+ {
+ tabcontainer->selectTabPanel(graphicspanel);
+ }
+ }
+}
+
+
void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel)
{
// copying child list and then iterating over a copy, because list itself
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 4d6d03f22d..481e9aec1b 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -91,6 +91,10 @@ private:
/*virtual*/ BOOL postBuild();
+ F32 getCurrentTransparency();
+
+ void onViewButtonClick(const LLSD& user_data);
+
ECameraControlMode determineMode();
/* resets to the previous mode */
diff --git a/indra/newview/llfloaterdeleteprefpreset.cpp b/indra/newview/llfloaterdeleteprefpreset.cpp
index 7dedbbf984..bd62849b42 100644
--- a/indra/newview/llfloaterdeleteprefpreset.cpp
+++ b/indra/newview/llfloaterdeleteprefpreset.cpp
@@ -60,13 +60,15 @@ void LLFloaterDeletePrefPreset::onOpen(const LLSD& key)
{
mSubdirectory = key.asString();
std::string floater_title = getString(std::string("title_") + mSubdirectory);
-
setTitle(floater_title);
LLComboBox* combo = getChild("preset_combo");
-
EDefaultOptions option = DEFAULT_HIDE;
- LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+ bool action;
+ action = LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
+
+ LLButton* delete_btn = getChild("delete");
+ delete_btn->setEnabled(action);
}
void LLFloaterDeletePrefPreset::onBtnDelete()
@@ -87,12 +89,10 @@ void LLFloaterDeletePrefPreset::onBtnDelete()
void LLFloaterDeletePrefPreset::onPresetsListChange()
{
LLComboBox* combo = getChild("preset_combo");
- LLButton* delete_btn = getChild("delete");
EDefaultOptions option = DEFAULT_HIDE;
- LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
- delete_btn->setEnabled(0 != combo->getItemCount());
+ LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
}
void LLFloaterDeletePrefPreset::onBtnCancel()
diff --git a/indra/newview/llfloaterloadprefpreset.cpp b/indra/newview/llfloaterloadprefpreset.cpp
index 403db35cc0..fa17a9d40e 100644
--- a/indra/newview/llfloaterloadprefpreset.cpp
+++ b/indra/newview/llfloaterloadprefpreset.cpp
@@ -42,7 +42,8 @@ LLFloaterLoadPrefPreset::LLFloaterLoadPrefPreset(const LLSD &key)
// virtual
BOOL LLFloaterLoadPrefPreset::postBuild()
-{ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance("preferences");
+{
+ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance("preferences");
if (preferences)
{
preferences->addDependentFloater(this);
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 5de7ca5289..3e4afa545e 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -661,7 +661,7 @@ void LLFloaterPreference::cancel()
// hide spellchecker settings folder
LLFloaterReg::hideInstance("prefs_spellchecker");
- // hide advancede floater
+ // hide advanced graphics floater
LLFloaterReg::hideInstance("prefs_graphics_advanced");
// reverts any changes to current skin
@@ -780,7 +780,8 @@ void LLFloaterPreference::onOpen(const LLSD& key)
saveSettings();
// Make sure there is a default preference file
- LLPresetsManager::getInstance()->createMissingDefault();
+ LLPresetsManager::getInstance()->createMissingDefault(PRESETS_CAMERA);
+ LLPresetsManager::getInstance()->createMissingDefault(PRESETS_GRAPHIC);
bool started = (LLStartUp::getStartupState() == STATE_STARTED);
@@ -789,10 +790,24 @@ void LLFloaterPreference::onOpen(const LLSD& key)
LLButton* delete_btn = findChild("PrefDeleteButton");
LLButton* exceptions_btn = findChild("RenderExceptionsButton");
- load_btn->setEnabled(started);
- save_btn->setEnabled(started);
- delete_btn->setEnabled(started);
- exceptions_btn->setEnabled(started);
+ if (load_btn && save_btn && delete_btn && exceptions_btn)
+ {
+ load_btn->setEnabled(started);
+ save_btn->setEnabled(started);
+ delete_btn->setEnabled(started);
+ exceptions_btn->setEnabled(started);
+ }
+
+ LLButton* load_camera_btn = findChild("PrefCameraLoadButton");
+ LLButton* save_camera_btn = findChild("PrefCameraSaveButton");
+ LLButton* delete_camera_btn = findChild("PrefCameraDeleteButton");
+
+ if (load_camera_btn && save_camera_btn && delete_camera_btn)
+ {
+ load_camera_btn->setEnabled(started);
+ save_camera_btn->setEnabled(started);
+ delete_camera_btn->setEnabled(started);
+ }
}
void LLFloaterPreference::onVertexShaderEnable()
@@ -2211,6 +2226,11 @@ void LLFloaterPreference::changed()
}
+void LLFloaterPreference::saveCameraPreset(std::string& preset)
+{
+ mSavedCameraPreset = preset;
+}
+
void LLFloaterPreference::saveGraphicsPreset(std::string& preset)
{
mSavedGraphicsPreset = preset;
@@ -2498,18 +2518,24 @@ void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)
void LLPanelPreference::deletePreset(const LLSD& user_data)
{
std::string subdirectory = user_data.asString();
+ LLFloaterReg::hideInstance("load_pref_preset", subdirectory);
+ LLFloaterReg::hideInstance("save_pref_preset", subdirectory);
LLFloaterReg::showInstance("delete_pref_preset", subdirectory);
}
void LLPanelPreference::savePreset(const LLSD& user_data)
{
std::string subdirectory = user_data.asString();
+ LLFloaterReg::hideInstance("delete_pref_preset", subdirectory);
+ LLFloaterReg::hideInstance("load_pref_preset", subdirectory);
LLFloaterReg::showInstance("save_pref_preset", subdirectory);
}
void LLPanelPreference::loadPreset(const LLSD& user_data)
{
std::string subdirectory = user_data.asString();
+ LLFloaterReg::hideInstance("delete_pref_preset", subdirectory);
+ LLFloaterReg::hideInstance("save_pref_preset", subdirectory);
LLFloaterReg::showInstance("load_pref_preset", subdirectory);
}
@@ -2557,6 +2583,82 @@ private:
static LLPanelInjector t_pref_graph("panel_preference_graphics");
static LLPanelInjector t_pref_privacy("panel_preference_privacy");
+static LLPanelInjector t_pref_view("panel_preference_view");
+
+BOOL LLPanelPreferenceView::postBuild()
+{
+ setPresetText();
+
+ LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
+ if (presetsMgr)
+ {
+ presetsMgr->setPresetListChangeCameraCallback(boost::bind(&LLPanelPreferenceView::onPresetsListChangeCamera, this));
+ presetsMgr->createMissingDefault(PRESETS_CAMERA); // a no-op after the first time, but that's ok
+ }
+
+ return LLPanelPreference::postBuild();
+}
+
+void LLPanelPreferenceView::onPresetsListChangeCamera()
+{
+ LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
+ if (presetsMgr)
+ {
+ presetsMgr->setCameraDirty(false);
+ }
+
+ setPresetText();
+
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
+ if (instance && !gSavedSettings.getString("PresetCameraActive").empty())
+ {
+ instance->saveSettings(); //make cancel work correctly after changing the preset
+ }
+}
+
+void LLPanelPreferenceView::draw()
+{
+ setPresetText();
+ LLPanelPreference::draw();
+}
+
+void LLPanelPreferenceView::setPresetText()
+{
+ LLTextBox* preset_text = getChild("preset_camera_text");
+
+ std::string preset_camera_active = gSavedSettings.getString("PresetCameraActive");
+
+ if (!preset_camera_active.empty() && preset_camera_active != preset_text->getText())
+ {
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
+ if (instance)
+ {
+ instance->saveCameraPreset(preset_camera_active);
+ }
+ }
+
+ LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
+ if (presetsMgr)
+ {
+ if (presetsMgr->isCameraDirty() && !preset_camera_active.empty())
+ {
+ preset_camera_active.clear();
+ }
+ }
+
+ if (!preset_camera_active.empty())
+ {
+ if (preset_camera_active == PRESETS_DEFAULT)
+ {
+ preset_camera_active = LLTrans::getString(PRESETS_DEFAULT);
+ }
+ preset_text->setText(preset_camera_active);
+ }
+ else
+ {
+ preset_text->setText(LLTrans::getString("none_paren_cap"));
+ }
+}
BOOL LLPanelPreferenceGraphics::postBuild()
{
@@ -2580,7 +2682,7 @@ BOOL LLPanelPreferenceGraphics::postBuild()
LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
presetsMgr->setPresetListChangeCallback(boost::bind(&LLPanelPreferenceGraphics::onPresetsListChange, this));
- presetsMgr->createMissingDefault(); // a no-op after the first time, but that's ok
+ presetsMgr->createMissingDefault(PRESETS_GRAPHIC); // a no-op after the first time, but that's ok
return LLPanelPreference::postBuild();
}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 444ad5a928..6452a41f19 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -179,6 +179,7 @@ public:
void buildPopupLists();
static void refreshSkin(void* data);
void selectPanel(const LLSD& name);
+ void saveCameraPreset(std::string& preset);
void saveGraphicsPreset(std::string& preset);
private:
@@ -201,6 +202,7 @@ private:
std::string mDirectoryVisibility;
LLAvatarData mAvatarProperties;
+ std::string mSavedCameraPreset;
std::string mSavedGraphicsPreset;
LOG_CLASS(LLFloaterPreference);
};
@@ -249,6 +251,18 @@ private:
LOG_CLASS(LLPanelPreference);
};
+class LLPanelPreferenceView : public LLPanelPreference
+{
+public:
+ BOOL postBuild();
+ void draw();
+ void setPresetText();
+
+private:
+ void onPresetsListChangeCamera();
+ LOG_CLASS(LLPanelPreferenceView);
+};
+
class LLPanelPreferenceGraphics : public LLPanelPreference
{
public:
@@ -266,7 +280,6 @@ protected:
bool hasDirtyChilds();
private:
-
void onPresetsListChange();
LOG_CLASS(LLPanelPreferenceGraphics);
};
diff --git a/indra/newview/llfloaterpreferenceviewadvanced.cpp b/indra/newview/llfloaterpreferenceviewadvanced.cpp
new file mode 100644
index 0000000000..791ff79d87
--- /dev/null
+++ b/indra/newview/llfloaterpreferenceviewadvanced.cpp
@@ -0,0 +1,112 @@
+/**
+ * @file llfloaterpreferenceviewadvanced.cpp
+ * @brief floater for adjusting camera position
+ *
+ * $LicenseInfo:firstyear=2018&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2018, 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 "llfloaterpreferenceviewadvanced.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "lluictrlfactory.h"
+#include "llspinctrl.h"
+#include "llviewercontrol.h"
+
+
+LLFloaterPreferenceViewAdvanced::LLFloaterPreferenceViewAdvanced(const LLSD& key)
+: LLFloater(key)
+{
+ mCommitCallbackRegistrar.add("Cancel", boost::bind(&LLFloaterPreferenceViewAdvanced::onClickCancel, this));
+ mCommitCallbackRegistrar.add("CommitSettings", boost::bind(&LLFloaterPreferenceViewAdvanced::onCommitSettings, this));
+ mCommitCallbackRegistrar.add("Ok", boost::bind(&LLFloaterPreferenceViewAdvanced::onClickOk, this));
+
+}
+
+LLFloaterPreferenceViewAdvanced::~LLFloaterPreferenceViewAdvanced()
+{}
+
+void LLFloaterPreferenceViewAdvanced::onClickOk()
+{
+ closeFloater();
+}
+
+void LLFloaterPreferenceViewAdvanced::onClickCancel()
+{
+ gSavedSettings.setVector3("CameraOffsetRearView", mCameraSaved);
+ gSavedSettings.setVector3d("FocusOffsetRearView", mFocusSaved);
+
+ updateCameraControl(mCameraSaved);
+ updateFocusControl(mFocusSaved);
+}
+
+BOOL LLFloaterPreferenceViewAdvanced::postBuild()
+{
+ mCameraSaved = gSavedSettings.getVector3("CameraOffsetRearView");
+ mFocusSaved = gSavedSettings.getVector3d("FocusOffsetRearView");
+
+ updateCameraControl(mCameraSaved);
+ updateFocusControl(mFocusSaved);
+
+ return TRUE;
+}
+
+void LLFloaterPreferenceViewAdvanced::updateCameraControl(const LLVector3& vector)
+{
+ getChild("camera_x")->setValue(vector[VX]);
+ getChild("camera_y")->setValue(vector[VY]);
+ getChild("camera_z")->setValue(vector[VZ]);
+}
+
+void LLFloaterPreferenceViewAdvanced::updateFocusControl(const LLVector3d& vector3d)
+{
+ getChild("focus_x")->setValue(vector3d[VX]);
+ getChild("focus_y")->setValue(vector3d[VY]);
+ getChild("focus_z")->setValue(vector3d[VZ]);
+}
+
+ void LLFloaterPreferenceViewAdvanced::draw()
+{
+ static LLCachedControl camera(gSavedSettings, "CameraOffsetRearView");
+ static LLCachedControl focus(gSavedSettings, "FocusOffsetRearView");
+
+ updateCameraControl(camera);
+ updateFocusControl(focus);
+
+ LLFloater::draw();
+}
+
+void LLFloaterPreferenceViewAdvanced::onCommitSettings()
+{
+ LLVector3 vector;
+ LLVector3d vector3d;
+
+ vector.mV[VX] = (F32)getChild("camera_x")->getValue().asReal();
+ vector.mV[VY] = (F32)getChild("camera_y")->getValue().asReal();
+ vector.mV[VZ] = (F32)getChild("camera_z")->getValue().asReal();
+ gSavedSettings.setVector3("CameraOffsetRearView", vector);
+
+ vector3d.mdV[VX] = (F32)getChild("focus_x")->getValue().asReal();
+ vector3d.mdV[VY] = (F32)getChild("focus_y")->getValue().asReal();
+ vector3d.mdV[VZ] = (F32)getChild("focus_z")->getValue().asReal();
+ gSavedSettings.setVector3d("FocusOffsetRearView", vector3d);
+}
diff --git a/indra/newview/llfloaterpreferenceviewadvanced.h b/indra/newview/llfloaterpreferenceviewadvanced.h
new file mode 100644
index 0000000000..8f4b594605
--- /dev/null
+++ b/indra/newview/llfloaterpreferenceviewadvanced.h
@@ -0,0 +1,58 @@
+/**
+ * @file llfloaterpreferenceviewadvanced.h
+ * @brief floater for adjusting camera position
+ *
+ * $LicenseInfo:firstyear=2018&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2018, 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 LLFLOATERPREFERENCEVIEWADVANCED_H
+#define LLFLOATERPREFERENCEVIEWADVANCED_H
+
+#include "llcontrol.h"
+#include "llfloater.h"
+
+class LLFloaterPreferenceViewAdvanced
+: public LLFloater
+{
+ friend class LLFloaterReg;
+
+public:
+ LLFloaterPreferenceViewAdvanced(const LLSD& key);
+ virtual BOOL postBuild();
+ virtual void draw();
+
+ void onCommitSettings();
+ void onClickCancel();
+ void onClickOk();
+ void updateCameraControl(const LLVector3& vector);
+ void updateFocusControl(const LLVector3d& vector3d);
+
+private:
+ virtual ~LLFloaterPreferenceViewAdvanced();
+
+ LLVector3 mCameraSaved;
+ LLVector3d mFocusSaved;
+
+};
+
+#endif //LLFLOATERPREFERENCEVIEWADVANCED_H
+
diff --git a/indra/newview/llfloatersaveprefpreset.cpp b/indra/newview/llfloatersaveprefpreset.cpp
index bdef718d0e..eaacba893d 100644
--- a/indra/newview/llfloatersaveprefpreset.cpp
+++ b/indra/newview/llfloatersaveprefpreset.cpp
@@ -42,7 +42,8 @@ LLFloaterSavePrefPreset::LLFloaterSavePrefPreset(const LLSD &key)
// virtual
BOOL LLFloaterSavePrefPreset::postBuild()
-{ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance("preferences");
+{
+ LLFloaterPreference* preferences = LLFloaterReg::getTypedInstance("preferences");
if (preferences)
{
preferences->addDependentFloater(this);
diff --git a/indra/newview/llpanelpresetscamerapulldown.cpp b/indra/newview/llpanelpresetscamerapulldown.cpp
new file mode 100644
index 0000000000..7612c428d9
--- /dev/null
+++ b/indra/newview/llpanelpresetscamerapulldown.cpp
@@ -0,0 +1,237 @@
+/**
+ * @file llpanelpresetscamerapulldown.cpp
+ * @brief A panel showing a quick way to pick camera presets
+ *
+ * $LicenseInfo:firstyear=2017&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2017, 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 "llpanelpresetscamerapulldown.h"
+
+#include "llviewercontrol.h"
+#include "llstatusbar.h"
+
+#include "llbutton.h"
+#include "lltabcontainer.h"
+#include "llfloaterreg.h"
+#include "llfloaterpreference.h"
+#include "llpresetsmanager.h"
+#include "llsliderctrl.h"
+#include "llscrolllistctrl.h"
+#include "lltrans.h"
+
+/* static */ const F32 LLPanelPresetsCameraPulldown::sAutoCloseFadeStartTimeSec = 2.0f;
+/* static */ const F32 LLPanelPresetsCameraPulldown::sAutoCloseTotalTimeSec = 3.0f;
+
+///----------------------------------------------------------------------------
+/// Class LLPanelPresetsCameraPulldown
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLPanelPresetsCameraPulldown::LLPanelPresetsCameraPulldown()
+{
+ mHoverTimer.stop();
+
+ mCommitCallbackRegistrar.add("Presets.GoViewPrefs", boost::bind(&LLPanelPresetsCameraPulldown::onViewButtonClick, this, _2));
+ mCommitCallbackRegistrar.add("PresetsCamera.RowClick", boost::bind(&LLPanelPresetsCameraPulldown::onRowClick, this, _2));
+
+ buildFromFile( "panel_presets_camera_pulldown.xml");
+}
+
+BOOL LLPanelPresetsCameraPulldown::postBuild()
+{
+ LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
+ if (presetsMgr)
+ {
+ // Make sure there is a default preference file
+ presetsMgr->createMissingDefault(PRESETS_CAMERA);
+
+ presetsMgr->startWatching(PRESETS_CAMERA);
+
+ presetsMgr->setPresetListChangeCameraCallback(boost::bind(&LLPanelPresetsCameraPulldown::populatePanel, this));
+ }
+
+ populatePanel();
+
+ return LLPanel::postBuild();
+}
+
+void LLPanelPresetsCameraPulldown::populatePanel()
+{
+ std::string presets_dir = LLPresetsManager::getInstance()->getPresetsDir(PRESETS_CAMERA);
+ LLPresetsManager::getInstance()->loadPresetNamesFromDir(presets_dir, mPresetNames, DEFAULT_TOP);
+
+ LLScrollListCtrl* scroll = getChild("preset_camera_list");
+
+ if (scroll && mPresetNames.begin() != mPresetNames.end())
+ {
+ scroll->clearRows();
+
+ std::string active_preset = gSavedSettings.getString("PresetCameraActive");
+ if (active_preset == PRESETS_DEFAULT)
+ {
+ active_preset = LLTrans::getString(PRESETS_DEFAULT);
+ }
+
+ for (std::list::const_iterator it = mPresetNames.begin(); it != mPresetNames.end(); ++it)
+ {
+ const std::string& name = *it;
+ LL_DEBUGS() << "adding '" << name << "'" << LL_ENDL;
+
+ LLSD row;
+ row["columns"][0]["column"] = "preset_name";
+ row["columns"][0]["value"] = name;
+
+ bool is_selected_preset = false;
+ if (name == active_preset)
+ {
+ row["columns"][1]["column"] = "icon";
+ row["columns"][1]["type"] = "icon";
+ row["columns"][1]["value"] = "Check_Mark";
+
+ is_selected_preset = true;
+ }
+
+ LLScrollListItem* new_item = scroll->addElement(row);
+ new_item->setSelected(is_selected_preset);
+ }
+ }
+}
+
+/*virtual*/
+void LLPanelPresetsCameraPulldown::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.stop();
+ LLPanel::onMouseEnter(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelPresetsCameraPulldown::onTopLost()
+{
+ setVisible(FALSE);
+}
+
+/*virtual*/
+BOOL LLPanelPresetsCameraPulldown::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ LLPanel::handleMouseDown(x,y,mask);
+ return TRUE;
+}
+
+/*virtual*/
+BOOL LLPanelPresetsCameraPulldown::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ LLPanel::handleRightMouseDown(x, y, mask);
+ return TRUE;
+}
+
+/*virtual*/
+BOOL LLPanelPresetsCameraPulldown::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ LLPanel::handleDoubleClick(x, y, mask);
+ return TRUE;
+}
+
+/*virtual*/
+void LLPanelPresetsCameraPulldown::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.start();
+ LLPanel::onMouseLeave(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelPresetsCameraPulldown::onVisibilityChange ( BOOL new_visibility )
+{
+ if (new_visibility)
+ {
+ mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
+ }
+ else
+ {
+ mHoverTimer.stop();
+
+ }
+}
+
+void LLPanelPresetsCameraPulldown::onRowClick(const LLSD& user_data)
+{
+ LLScrollListCtrl* scroll = getChild("preset_camera_list");
+
+ if (scroll)
+ {
+ LLScrollListItem* item = scroll->getFirstSelected();
+ if (item)
+ {
+ std::string name = item->getColumn(1)->getValue().asString();
+
+ LL_DEBUGS() << "selected '" << name << "'" << LL_ENDL;
+ LLPresetsManager::getInstance()->loadPreset(PRESETS_CAMERA, name);
+
+ setVisible(FALSE);
+ }
+ else
+ {
+ LL_DEBUGS() << "none selected" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS() << "no scroll" << LL_ENDL;
+ }
+}
+
+void LLPanelPresetsCameraPulldown::onViewButtonClick(const LLSD& user_data)
+{
+ // close the minicontrol, we're bringing up the big one
+ setVisible(FALSE);
+
+ // bring up the prefs floater
+ LLFloater* prefsfloater = LLFloaterReg::showInstance("preferences");
+ if (prefsfloater)
+ {
+ // grab the 'view' panel from the preferences floater and
+ // bring it the front!
+ LLTabContainer* tabcontainer = prefsfloater->getChild("pref core");
+ LLPanel* graphicspanel = prefsfloater->getChild("view");
+ if (tabcontainer && graphicspanel)
+ {
+ tabcontainer->selectTabPanel(graphicspanel);
+ }
+ }
+}
+
+//virtual
+void LLPanelPresetsCameraPulldown::draw()
+{
+ F32 alpha = mHoverTimer.getStarted()
+ ? clamp_rescale(mHoverTimer.getElapsedTimeF32(), sAutoCloseFadeStartTimeSec, sAutoCloseTotalTimeSec, 1.f, 0.f)
+ : 1.0f;
+ LLViewDrawContext context(alpha);
+
+ LLPanel::draw();
+
+ if (alpha == 0.f)
+ {
+ setVisible(FALSE);
+ }
+}
diff --git a/indra/newview/llpanelpresetscamerapulldown.h b/indra/newview/llpanelpresetscamerapulldown.h
new file mode 100644
index 0000000000..12d9bc26ec
--- /dev/null
+++ b/indra/newview/llpanelpresetscamerapulldown.h
@@ -0,0 +1,62 @@
+/**
+ * @file llpanelpresetscamerapulldown.h
+ * @brief A panel showing a quick way to pick camera presets
+ *
+ * $LicenseInfo:firstyear=2017&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2017, 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_LLPANELPRESETSCAMERAPULLDOWN_H
+#define LL_LLPANELPRESETSCAMERAPULLDOWN_H
+
+#include "linden_common.h"
+
+#include "llpanel.h"
+
+class LLFrameTimer;
+
+class LLPanelPresetsCameraPulldown : public LLPanel
+{
+ public:
+ LLPanelPresetsCameraPulldown();
+ /*virtual*/ void draw();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onTopLost();
+ /*virtual*/ void onVisibilityChange ( BOOL new_visibility );
+ /*virtual*/ BOOL postBuild();
+ void populatePanel();
+
+ private:
+ void onViewButtonClick(const LLSD& user_data);
+ void onRowClick(const LLSD& user_data);
+
+ std::list mPresetNames;
+ LLFrameTimer mHoverTimer;
+ static const F32 sAutoCloseFadeStartTimeSec;
+ static const F32 sAutoCloseTotalTimeSec;
+ LOG_CLASS(LLPanelPresetsCameraPulldown);
+};
+
+#endif // LL_LLPANELPRESETSCAMERAPULLDOWN_H
diff --git a/indra/newview/llpanelpresetspulldown.cpp b/indra/newview/llpanelpresetspulldown.cpp
index 9b4dc5474a..0bbf1781a5 100644
--- a/indra/newview/llpanelpresetspulldown.cpp
+++ b/indra/newview/llpanelpresetspulldown.cpp
@@ -63,7 +63,7 @@ BOOL LLPanelPresetsPulldown::postBuild()
LLPresetsManager* presetsMgr = LLPresetsManager::getInstance();
presetsMgr->setPresetListChangeCallback(boost::bind(&LLPanelPresetsPulldown::populatePanel, this));
// Make sure there is a default preference file
- presetsMgr->createMissingDefault();
+ presetsMgr->createMissingDefault(PRESETS_GRAPHIC);
populatePanel();
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index 96818d5a21..52964a125f 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -39,6 +39,8 @@
#include "llfloaterpreference.h"
#include "llfloaterreg.h"
#include "llfeaturemanager.h"
+#include "llagentcamera.h"
+#include "llfile.h"
LLPresetsManager::LLPresetsManager()
{
@@ -46,6 +48,12 @@ LLPresetsManager::LLPresetsManager()
LLPresetsManager::~LLPresetsManager()
{
+ mCameraChangedSignal.disconnect();
+}
+
+void LLPresetsManager::triggerChangeCameraSignal()
+{
+ mPresetListChangeCameraSignal();
}
void LLPresetsManager::triggerChangeSignal()
@@ -53,19 +61,21 @@ void LLPresetsManager::triggerChangeSignal()
mPresetListChangeSignal();
}
-void LLPresetsManager::createMissingDefault()
+void LLPresetsManager::createMissingDefault(const std::string& subdirectory)
{
if(gDirUtilp->getLindenUserDir().empty())
{
return;
}
- std::string default_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, PRESETS_GRAPHIC, PRESETS_DEFAULT + ".xml");
+
+ std::string default_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR,
+ subdirectory, PRESETS_DEFAULT + ".xml");
if (!gDirUtilp->fileExists(default_file))
{
LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;
- // Write current graphic settings as the default
- savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT, true);
+ // Write current settings as the default
+ savePreset(subdirectory, PRESETS_DEFAULT, true);
}
else
{
@@ -73,17 +83,64 @@ void LLPresetsManager::createMissingDefault()
}
}
+void LLPresetsManager::startWatching(const std::string& subdirectory)
+{
+ if (PRESETS_CAMERA == subdirectory)
+ {
+ std::vector name_list;
+ getControlNames(name_list);
+
+ for (std::vector::iterator it = name_list.begin(); it != name_list.end(); ++it)
+ {
+ std::string ctrl_name = *it;
+ if (gSavedSettings.controlExists(ctrl_name))
+ {
+ LLPointer cntrl_ptr = gSavedSettings.getControl(ctrl_name);
+ if (cntrl_ptr.isNull())
+ {
+ LL_WARNS("Init") << "Unable to set signal on global setting '" << ctrl_name
+ << "'" << LL_ENDL;
+ }
+ else
+ {
+ mCameraChangedSignal = cntrl_ptr->getCommitSignal()->connect(boost::bind(&settingChanged));
+ }
+ }
+ }
+ }
+}
+
std::string LLPresetsManager::getPresetsDir(const std::string& subdirectory)
{
std::string presets_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR);
- std::string full_path;
LLFile::mkdir(presets_path);
- full_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, subdirectory);
- LLFile::mkdir(full_path);
+ std::string dest_path = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, subdirectory);
+ if (!gDirUtilp->fileExists(dest_path))
+ LLFile::mkdir(dest_path);
- return full_path;
+ if (PRESETS_CAMERA == subdirectory)
+ {
+ std::string source_dir = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, PRESETS_CAMERA);
+ LLDirIterator dir_iter(source_dir, "*.xml");
+ bool found = true;
+ while (found)
+ {
+ std::string file;
+ found = dir_iter.next(file);
+
+ if (found)
+ {
+ std::string source = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, PRESETS_CAMERA, file);
+ file = LLURI::escape(file);
+ std::string dest = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, PRESETS_CAMERA, file);
+ LLFile::copy(source, dest);
+ }
+ }
+ }
+
+ return dest_path;
}
void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option)
@@ -132,6 +189,47 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_nam
presets = mPresetNames;
}
+bool LLPresetsManager::mCameraDirty = false;
+
+void LLPresetsManager::setCameraDirty(bool dirty)
+{
+ mCameraDirty = dirty;
+}
+
+bool LLPresetsManager::isCameraDirty()
+{
+ return mCameraDirty;
+}
+
+void LLPresetsManager::settingChanged()
+{
+ setCameraDirty(true);
+
+ gSavedSettings.setString("PresetCameraActive", "");
+
+// Hack call because this is a static routine
+ LLPresetsManager::getInstance()->triggerChangeCameraSignal();
+
+}
+
+void LLPresetsManager::getControlNames(std::vector& names)
+{
+ const std::vector camera_controls = boost::assign::list_of
+ // From panel_preferences_move.xml
+ ("CameraAngle")
+ ("CameraOffsetScale")
+ ("EditCameraMovement")
+ ("AppearanceCameraMovement")
+ // From llagentcamera.cpp
+ ("CameraOffsetBuild")
+ ("CameraOffsetRearView")
+ ("FocusOffsetRearView")
+ ("CameraOffsetScale")
+ ("TrackFocusObject")
+ ;
+ names = camera_controls;
+}
+
bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name, bool createDefault)
{
if (LLTrans::getString(PRESETS_DEFAULT) == name)
@@ -147,94 +245,107 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
if (instance && !createDefault)
{
- gSavedSettings.setString("PresetGraphicActive", name);
+ gSavedSettings.setString("PresetGraphicActive", name);
instance->getControlNames(name_list);
- LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
+ LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
name_list.push_back("PresetGraphicActive");
}
- else
+ else
{
- LL_WARNS() << "preferences floater instance not found" << LL_ENDL;
- }
+ LL_WARNS("Presets") << "preferences floater instance not found" << LL_ENDL;
+ }
}
- else if(PRESETS_CAMERA == subdirectory)
+ else if(PRESETS_CAMERA == subdirectory)
{
+ gSavedSettings.setString("PresetGraphicActive", name);
+
name_list.clear();
- name_list.push_back("Placeholder");
+ getControlNames(name_list);
+ name_list.push_back("PresetCameraActive");
+ }
+ else
+ {
+ LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
+ }
+
+ // make an empty llsd
+ LLSD paramsData(LLSD::emptyMap());
+
+ // Create a default graphics preset from hw recommended settings
+ if (createDefault && name == PRESETS_DEFAULT && subdirectory == PRESETS_GRAPHIC)
+ {
+ paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap();
+ if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0)
+ {
+ // use the recommended setting as an initial one (MAINT-6435)
+ gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger());
+ }
+ }
+ else
+ {
+ for (std::vector::iterator it = name_list.begin(); it != name_list.end(); ++it)
+ {
+ std::string ctrl_name = *it;
+ LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
+ std::string comment = ctrl->getComment();
+ std::string type = LLControlGroup::typeEnumToString(ctrl->type());
+ LLSD value = ctrl->getValue();
+
+ paramsData[ctrl_name]["Comment"] = comment;
+ paramsData[ctrl_name]["Persist"] = 1;
+ paramsData[ctrl_name]["Type"] = type;
+ paramsData[ctrl_name]["Value"] = value;
+ }
+ }
+
+ std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
+
+ // If the active preset name is the only thing in the list, don't save the list
+ if (paramsData.size() > 1)
+ {
+ // write to file
+ llofstream presetsXML(pathName.c_str());
+ if (presetsXML.is_open())
+ {
+ LLPointer formatter = new LLSDXMLFormatter();
+ formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
+ presetsXML.close();
+ saved = true;
+
+ LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
+
+ if (subdirectory == PRESETS_GRAPHIC)
+ {
+ gSavedSettings.setString("PresetGraphicActive", name);
+ // signal interested parties
+ triggerChangeSignal();
+ }
+
+ if (subdirectory == PRESETS_CAMERA)
+ {
+ gSavedSettings.setString("PresetCameraActive", name);
+ setCameraDirty(false);
+ // signal interested parties
+ triggerChangeCameraSignal();
+ }
+ }
+ else
+ {
+ LL_WARNS("Presets") << "Cannot open for output preset file " << pathName << LL_ENDL;
+ }
}
else
- {
- LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
- }
-
- if (name_list.size() > 1 // if the active preset name is the only thing in the list, don't save the list
- || (createDefault && name == PRESETS_DEFAULT && subdirectory == PRESETS_GRAPHIC)) // or create a default graphics preset from hw recommended settings
- {
- // make an empty llsd
- LLSD paramsData(LLSD::emptyMap());
-
- if (createDefault)
- {
- paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap();
- if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0)
- {
- // use the recommended setting as an initial one (MAINT-6435)
- gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger());
- }
- }
- else
- {
- for (std::vector::iterator it = name_list.begin(); it != name_list.end(); ++it)
- {
- std::string ctrl_name = *it;
- LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
- std::string comment = ctrl->getComment();
- std::string type = LLControlGroup::typeEnumToString(ctrl->type());
- LLSD value = ctrl->getValue();
-
- paramsData[ctrl_name]["Comment"] = comment;
- paramsData[ctrl_name]["Persist"] = 1;
- paramsData[ctrl_name]["Type"] = type;
- paramsData[ctrl_name]["Value"] = value;
- }
- }
-
- std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
-
- // write to file
- llofstream presetsXML(pathName.c_str());
- if (presetsXML.is_open())
- {
-
- LLPointer formatter = new LLSDXMLFormatter();
- formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
- presetsXML.close();
- saved = true;
-
- LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
-
- if (!createDefault)
- {
- gSavedSettings.setString("PresetGraphicActive", name);
- // signal interested parties
- triggerChangeSignal();
- }
- }
- else
- {
- LL_WARNS("Presets") << "Cannot open for output preset file " << pathName << LL_ENDL;
- }
- }
- else
- {
- LL_INFOS() << "No settings found; preferences floater has not yet been created" << LL_ENDL;
- }
+ {
+ LL_INFOS() << "No settings available to be saved" << LL_ENDL;
+ }
return saved;
}
-void LLPresetsManager::setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option)
+bool LLPresetsManager::setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option)
{
+ bool sts = true;
+
combo->clearRows();
std::string presets_dir = getPresetsDir(subdirectory);
@@ -257,8 +368,10 @@ void LLPresetsManager::setPresetNamesInComboBox(const std::string& subdirectory,
else
{
combo->setLabel(LLTrans::getString("preset_combo_label"));
+ sts = false;
}
}
+ return sts;
}
void LLPresetsManager::loadPreset(const std::string& subdirectory, std::string name)
@@ -277,18 +390,23 @@ void LLPresetsManager::loadPreset(const std::string& subdirectory, std::string n
if(PRESETS_GRAPHIC == subdirectory)
{
gSavedSettings.setString("PresetGraphicActive", name);
- }
- LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
- if (instance)
- {
- instance->refreshEnabledGraphics();
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences");
+ if (instance)
+ {
+ instance->refreshEnabledGraphics();
+ }
+ triggerChangeSignal();
+ }
+ if(PRESETS_CAMERA == subdirectory)
+ {
+ gSavedSettings.setString("PresetCameraActive", name);
+ triggerChangeCameraSignal();
}
- triggerChangeSignal();
}
else
{
- LL_WARNS() << "failed to load preset '"< preset_name_list_t;
typedef boost::signals2::signal preset_list_signal_t;
- void createMissingDefault();
+ void createMissingDefault(const std::string& subdirectory);
+ void startWatching(const std::string& subdirectory);
+ void triggerChangeCameraSignal();
void triggerChangeSignal();
static std::string getPresetsDir(const std::string& subdirectory);
- void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
+ bool setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option);
bool savePreset(const std::string& subdirectory, std::string name, bool createDefault = false);
void loadPreset(const std::string& subdirectory, std::string name);
bool deletePreset(const std::string& subdirectory, std::string name);
+ bool isCameraDirty();
+ static void setCameraDirty(bool dirty);
// Emitted when a preset gets loaded, deleted, or saved.
+ boost::signals2::connection setPresetListChangeCameraCallback(const preset_list_signal_t::slot_type& cb);
boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
// Emitted when a preset gets loaded or saved.
preset_name_list_t mPresetNames;
+ preset_list_signal_t mPresetListChangeCameraSignal;
preset_list_signal_t mPresetListChangeSignal;
private:
- LOG_CLASS(LLPresetsManager);
+ LOG_CLASS(LLPresetsManager);
+
+ void getControlNames(std::vector& names);
+ static void settingChanged();
+
+ boost::signals2::connection mCameraChangedSignal;
+
+ static bool mCameraDirty;
};
#endif // LL_PRESETSMANAGER_H
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 72c5c961aa..6c95bcc0ae 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -38,6 +38,7 @@
#include "llfloaterbuycurrency.h"
#include "llbuycurrencyhtml.h"
#include "llpanelnearbymedia.h"
+#include "llpanelpresetscamerapulldown.h"
#include "llpanelpresetspulldown.h"
#include "llpanelvolumepulldown.h"
#include "llfloaterregioninfo.h"
@@ -171,8 +172,11 @@ BOOL LLStatusBar::postBuild()
mBtnStats = getChildView("stat_btn");
- mIconPresets = getChild( "presets_icon" );
- mIconPresets->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresets, this));
+ mIconPresetsCamera = getChild( "presets_icon_camera" );
+ mIconPresetsCamera->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresetsCamera, this));
+
+ mIconPresetsGraphic = getChild( "presets_icon_graphic" );
+ mIconPresetsGraphic->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterPresets, this));
mBtnVolume = getChild( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
@@ -227,6 +231,11 @@ BOOL LLStatusBar::postBuild()
mSGPacketLoss = LLUICtrlFactory::create(pgp);
addChild(mSGPacketLoss);
+ mPanelPresetsCameraPulldown = new LLPanelPresetsCameraPulldown();
+ addChild(mPanelPresetsCameraPulldown);
+ mPanelPresetsCameraPulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
+ mPanelPresetsCameraPulldown->setVisible(FALSE);
+
mPanelPresetsPulldown = new LLPanelPresetsPulldown();
addChild(mPanelPresetsPulldown);
mPanelPresetsPulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
@@ -325,7 +334,8 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
- mIconPresets->setVisible(visible);
+ mIconPresetsCamera->setVisible(visible);
+ mIconPresetsGraphic->setVisible(visible);
}
void LLStatusBar::debitBalance(S32 debit)
@@ -470,10 +480,34 @@ void LLStatusBar::onClickBuyCurrency()
LLFirstUse::receiveLindens(false);
}
+void LLStatusBar::onMouseEnterPresetsCamera()
+{
+ LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
+ LLIconCtrl* icon = getChild( "presets_icon_camera" );
+ LLRect icon_rect = icon->getRect();
+ LLRect pulldown_rect = mPanelPresetsCameraPulldown->getRect();
+ pulldown_rect.setLeftTopAndSize(icon_rect.mLeft -
+ (pulldown_rect.getWidth() - icon_rect.getWidth()),
+ icon_rect.mBottom,
+ pulldown_rect.getWidth(),
+ pulldown_rect.getHeight());
+
+ pulldown_rect.translate(popup_holder->getRect().getWidth() - pulldown_rect.mRight, 0);
+ mPanelPresetsCameraPulldown->setShape(pulldown_rect);
+
+ // show the master presets pull-down
+ LLUI::clearPopups();
+ LLUI::addPopup(mPanelPresetsCameraPulldown);
+ mPanelNearByMedia->setVisible(FALSE);
+ mPanelVolumePulldown->setVisible(FALSE);
+ mPanelPresetsPulldown->setVisible(FALSE);
+ mPanelPresetsCameraPulldown->setVisible(TRUE);
+}
+
void LLStatusBar::onMouseEnterPresets()
{
LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
- LLIconCtrl* icon = getChild( "presets_icon" );
+ LLIconCtrl* icon = getChild( "presets_icon_graphic" );
LLRect icon_rect = icon->getRect();
LLRect pulldown_rect = mPanelPresetsPulldown->getRect();
pulldown_rect.setLeftTopAndSize(icon_rect.mLeft -
@@ -512,6 +546,7 @@ void LLStatusBar::onMouseEnterVolume()
// show the master volume pull-down
LLUI::clearPopups();
LLUI::addPopup(mPanelVolumePulldown);
+ mPanelPresetsCameraPulldown->setVisible(FALSE);
mPanelPresetsPulldown->setVisible(FALSE);
mPanelNearByMedia->setVisible(FALSE);
mPanelVolumePulldown->setVisible(TRUE);
@@ -536,6 +571,7 @@ void LLStatusBar::onMouseEnterNearbyMedia()
LLUI::clearPopups();
LLUI::addPopup(mPanelNearByMedia);
+ mPanelPresetsCameraPulldown->setVisible(FALSE);
mPanelPresetsPulldown->setVisible(FALSE);
mPanelVolumePulldown->setVisible(FALSE);
mPanelNearByMedia->setVisible(TRUE);
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 277f039f20..507afcd147 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -41,6 +41,7 @@ class LLUICtrl;
class LLUUID;
class LLFrameTimer;
class LLStatGraph;
+class LLPanelPresetsCameraPulldown;
class LLPanelPresetsPulldown;
class LLPanelVolumePulldown;
class LLPanelNearByMedia;
@@ -91,6 +92,7 @@ private:
void onClickBuyCurrency();
void onVolumeChanged(const LLSD& newvalue);
+ void onMouseEnterPresetsCamera();
void onMouseEnterPresets();
void onMouseEnterVolume();
void onMouseEnterNearbyMedia();
@@ -106,7 +108,8 @@ private:
LLStatGraph *mSGPacketLoss;
LLView *mBtnStats;
- LLIconCtrl *mIconPresets;
+ LLIconCtrl *mIconPresetsCamera;
+ LLIconCtrl *mIconPresetsGraphic;
LLButton *mBtnVolume;
LLTextBox *mBoxBalance;
LLButton *mMediaToggle;
@@ -119,6 +122,7 @@ private:
S32 mSquareMetersCommitted;
LLFrameTimer* mBalanceTimer;
LLFrameTimer* mHealthTimer;
+ LLPanelPresetsCameraPulldown* mPanelPresetsCameraPulldown;
LLPanelPresetsPulldown* mPanelPresetsPulldown;
LLPanelVolumePulldown* mPanelVolumePulldown;
LLPanelNearByMedia* mPanelNearByMedia;
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 0ebacddd9b..5237986cd6 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -104,6 +104,7 @@
#include "llfloaterperms.h"
#include "llfloaterpostprocess.h"
#include "llfloaterpreference.h"
+#include "llfloaterpreferenceviewadvanced.h"
#include "llfloaterpreviewtrash.h"
#include "llfloaterproperties.h"
#include "llfloaterregiondebugconsole.h"
@@ -295,6 +296,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("prefs_graphics_advanced", "floater_preferences_graphics_advanced.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
+ LLFloaterReg::add("prefs_view_advanced", "floater_preferences_view_advanced.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("prefs_spellchecker_import", "floater_spellcheck_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
diff --git a/indra/newview/skins/default/textures/icons/Presets_Icon.png b/indra/newview/skins/default/textures/icons/Presets_Icon_Graphic.png
similarity index 100%
rename from indra/newview/skins/default/textures/icons/Presets_Icon.png
rename to indra/newview/skins/default/textures/icons/Presets_Icon_Graphic.png
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index d757e39366..bc4ff0ddf7 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -98,7 +98,7 @@ with the same filename but different name
-
+
@@ -207,7 +207,7 @@ with the same filename but different name
-
+
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 72a7b5540c..25db24da2e 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -145,8 +145,26 @@
left="0"
mouse_opaque="false"
name="zoom"
- top="20"
+ top="0"
width="226">
+