From 04a71a32725871bc50a43dc6877a006f197fb5cb Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Sat, 1 Jun 2024 13:00:17 -0400
Subject: [PATCH] Refresh camera pulldown

---
 indra/newview/llfloatercamera.cpp             |   6 +-
 indra/newview/llfloatercamera.h               |   2 +-
 .../newview/llpanelpresetscamerapulldown.cpp  |   1 +
 indra/newview/llviewermenu.cpp                |   3 +
 .../xui/en/panel_presets_camera_pulldown.xml  | 393 +++++++++++++++++-
 5 files changed, 392 insertions(+), 13 deletions(-)

diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 9acbafc00c2..01249c00ce9 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -487,11 +487,8 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
 {
     LLHints::getInstance()->registerHintTarget("view_popup", getHandle());
     mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
-    mCommitCallbackRegistrar.add("CameraPresets.Save", boost::bind(&LLFloaterCamera::onSavePreset, this));
+    mCommitCallbackRegistrar.add("CameraPresets.Save", boost::bind(&LLFloaterCamera::onSavePreset));
     mCommitCallbackRegistrar.add("CameraPresets.ShowPresetsList", boost::bind(&LLFloaterReg::showInstance, "camera_presets", LLSD(), FALSE));
-
-    mCommitCallbackRegistrar.add("Camera.SavePosition", [](LLUICtrl* ctrl, const LLSD& param) { gAgentCamera.storeCameraPosition(); });
-    mCommitCallbackRegistrar.add("Camera.RestorePosition", [](LLUICtrl* ctrl, const LLSD& param) { gAgentCamera.loadCameraPosition(); });
 }
 
 // virtual
@@ -759,6 +756,7 @@ void LLFloaterCamera::populatePresetCombo()
     updateItemsSelection();
 }
 
+// static
 void LLFloaterCamera::onSavePreset()
 {
     LLFloaterReg::hideInstance("delete_pref_preset", PRESETS_CAMERA);
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index b28c199a693..9f69384a13f 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -76,7 +76,7 @@ class LLFloaterCamera final : public LLFloater
     virtual void onOpen(const LLSD& key);
     virtual void onClose(bool app_quitting);
 
-    void onSavePreset();
+    static void onSavePreset();
     void onCustomPresetSelected();
 
     void populatePresetCombo();
diff --git a/indra/newview/llpanelpresetscamerapulldown.cpp b/indra/newview/llpanelpresetscamerapulldown.cpp
index a18eda3b270..a5ca23732ab 100644
--- a/indra/newview/llpanelpresetscamerapulldown.cpp
+++ b/indra/newview/llpanelpresetscamerapulldown.cpp
@@ -50,6 +50,7 @@ LLPanelPresetsCameraPulldown::LLPanelPresetsCameraPulldown()
 {
     mCommitCallbackRegistrar.add("Presets.toggleCameraFloater", boost::bind(&LLPanelPresetsCameraPulldown::onViewButtonClick, this, _2));
     mCommitCallbackRegistrar.add("PresetsCamera.RowClick", boost::bind(&LLPanelPresetsCameraPulldown::onRowClick, this, _2));
+    mCommitCallbackRegistrar.add("CameraPresets.Save", boost::bind(&LLFloaterCamera::onSavePreset));
 
     buildFromFile( "panel_presets_camera_pulldown.xml");
 }
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 858bc5b4246..a79377d2053 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -10541,5 +10541,8 @@ void initialize_menus()
     enable.add("RLV.EnableIfNot", boost::bind(&rlvMenuEnableIfNot, _2));
 // [/RLVa:KB]
 
+    commit.add("Camera.SavePosition", [](LLUICtrl* ctrl, const LLSD& param) { gAgentCamera.storeCameraPosition(); });
+    commit.add("Camera.RestorePosition", [](LLUICtrl* ctrl, const LLSD& param) { gAgentCamera.loadCameraPosition(); });
+
     ALViewerMenu::initialize_menus();
 }
diff --git a/indra/newview/skins/default/xui/en/panel_presets_camera_pulldown.xml b/indra/newview/skins/default/xui/en/panel_presets_camera_pulldown.xml
index d5f1bc81ee5..36e022593ce 100644
--- a/indra/newview/skins/default/xui/en/panel_presets_camera_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_presets_camera_pulldown.xml
@@ -8,10 +8,10 @@
  border="false"
  chrome="true"
  follows="bottom"
- height="155"
+ height="420"
  layout="topleft"
  name="presets_camera_pulldown"
- width="225">
+ width="295">
   <text
     type="string"
     length="1"
@@ -30,7 +30,7 @@
     layout="topleft"
     column_padding="0"
     height="100"
-    width="215"
+    width="285"
     draw_heading="false"
     draw_stripes="false"
     bg_stripe_color="0.25 0.25 0.25 0.25"
@@ -54,16 +54,393 @@
     left="5"
     name="horiz_separator"
     top_delta="105"
-    width="215" />
+    width="285" />
+    <text
+    follows="top|left|right"
+    name="camera_offset_lbl"
+    height="16"
+    layout="topleft"
+    left="10"
+    top_pad="5"
+    width="100">
+      Camera offset:
+  </text>
+
+  <spinner
+   height="20"
+   label="X"
+   label_width="12"
+   follows="top|left"
+   left="10"
+   name="camera_x"
+   top_pad="5"
+   min_val="-1e+007"
+   max_val="1e+007"
+   width="70">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+
+  <spinner
+   height="20"
+   label="Y"
+   label_width="12"
+   follows="top|left"
+   name="camera_y"
+   left_pad="21"
+   min_val="-1e+007"
+   max_val="1e+007"
+   width="70">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+
+  <spinner
+   height="20"
+   label="Z"
+   label_width="12"
+   follows="top|left"
+   name="camera_z"
+   left_pad="21"
+   min_val="-1e+007"
+   max_val="1e+007"
+   width="70">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+
+  <button
+  follows="top|left|right"
+  left_pad="3"
+  top_delta="0"
+  height="22"
+  width="22"
+  name="reset_offset_rear"
+  image_overlay="Refresh_Off"
+  tool_tip="Reset camera offset to default value">
+     <button.commit_callback
+        function="ResetControl"
+        parameter="CameraOffsetRearView" />
+  </button>
+
+  <text
+    follows="top|left|right"
+    name="focus_offset_lbl"
+    height="16"
+    layout="topleft"
+    left="10"
+    top_pad="9"
+    width="100">
+      Focus offset:
+  </text>
+
+  <spinner
+   height="20"
+   label="X"
+   label_width="12"
+   follows="top|left"
+   left="10"
+   name="focus_x"
+   top_pad="5"
+   min_val="-1e+007"
+   max_val="1e+007"
+   width="70">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+
+  <spinner
+   height="20"
+   label="Y"
+   label_width="12"
+   follows="top|left"
+   name="focus_y"
+   left_pad="21"
+   min_val="-1e+007"
+   max_val="1e+007"
+   width="70">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+
+  <spinner
+   height="20"
+   label="Z"
+   label_width="12"
+   follows="top|left"
+   name="focus_z"
+   left_pad="21"
+   min_val="-1e+007"
+   max_val="1e+007"
+   width="70">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+   <button
+   follows="top|left|right"
+   left_pad="3"
+   top_delta="0"
+   height="22"
+   width="22"
+   name="reset_offset_rear"
+   image_overlay="Refresh_Off"
+   tool_tip="Reset focus offset to default value">
+      <button.commit_callback
+         function="ResetControl"
+         parameter="FocusOffsetRearView" />
+   </button>
+
+   <text
+    follows="top|left|right"
+    name="offset_scale_lbl"
+    height="16"
+    layout="topleft"
+    left="10"
+    top_pad="8"
+    width="140">
+      Camera offset scale:
+  </text>
+
+  <slider
+   control_name="CameraOffsetScale"
+   follows="top|left|right"
+   height="16"
+   top_pad="2"
+   increment="0.1"
+   min_val="-3"
+   max_val="5"
+   show_text="false"
+   layout="topleft"
+   left="3"
+   name="offset_scale_sld"
+   width="196" />
+  <spinner
+   control_name="CameraOffsetScale"
+   height="20"
+   follows="top|left|right"
+   left_pad="5"
+   name="offset_scale_ctrl"
+   min_val="-3"
+   max_val="5"
+   width="58">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+  <button
+  follows="top|left|right"
+  left_pad="3"
+  top_delta="0"
+  height="22"
+  width="22"  
+  name="reset_offset_scale"
+  image_overlay="Refresh_Off"
+  tool_tip="Reset offset scaling to default value">
+     <button.commit_callback
+        function="ResetControl"
+        parameter="CameraOffsetScale" />
+  </button>
+    <text
+    follows="top|left"
+    name="offset_scale_lbl"
+    height="16"
+    layout="topleft"
+    left="10"
+    top_pad="3"
+    width="140">
+      Camera angle:
+  </text>
+  
+  <slider
+   control_name="CameraAngle"
+   follows="top|left"
+   height="16"
+   top_pad="2"
+   increment="0.025"
+   min_val="0.08"
+   max_val="3.06"
+   show_text="false"
+   layout="topleft"
+   left="3"
+   name="camera_angle_slider"
+   width="196" />
+  <spinner
+   control_name="CameraAngle"
+   height="20"
+   follows="top|left"
+   left_pad="5"
+   name="camera_angle_spinner"
+   min_val="0.08"
+   max_val="3.06"
+   width="58"
+   increment="0.025">
+    <spinner.commit_callback
+     function="CommitSettings" />
+  </spinner>
+     <button
+     follows="top|left"
+     left_pad="3"
+     top_delta="0"
+     height="22"
+     width="22"
+     name="reset_angle"
+     image_overlay="Refresh_Off"
+     tool_tip="Reset camera angle to default value">
+        <button.commit_callback
+           function="ResetControl"
+           parameter="CameraAngle" />
+     </button>
+  
+     <text
+     follows="top|left"
+     name="offset_scale_lbl"
+     height="16"
+     layout="topleft"
+     left="10"
+     top_pad="3"
+     width="140">
+       Zoom Speed:
+   </text>
+   
+   <slider
+    control_name="ZoomTime"
+    follows="top|left"
+    height="16"
+    top_pad="2"
+    increment="0.1"
+    min_val="0.0"
+    max_val="30.0"
+    show_text="false"
+    layout="topleft"
+    left="3"
+    name="zoom_time_slider"
+    width="196" />
+   <spinner
+    control_name="ZoomTime"
+    height="20"
+    follows="top|left"
+    left_pad="5"
+    name="zoom_time_spin"
+    min_val="0.0"
+    max_val="30.0"
+    width="58"
+    increment="0.1">
+     <spinner.commit_callback
+      function="CommitSettings" />
+   </spinner>
+      <button
+      follows="top|left"
+      left_pad="3"
+      top_delta="0"
+      height="22"
+      width="22"
+      name="reset_zoom_time"
+      image_overlay="Refresh_Off"
+      tool_tip="Reset camera zoom speed to default value">
+         <button.commit_callback
+            function="ResetControl"
+            parameter="ZoomTime" />
+      </button>
+  
+      <text
+      follows="top|left"
+      name="offset_scale_lbl"
+      height="16"
+      layout="topleft"
+      left="10"
+      top_pad="3"
+      width="140">
+        Position Smoothing:
+    </text>
+    
+    <slider
+     control_name="CameraPositionSmoothing"
+     follows="top|left"
+     height="16"
+     top_pad="2"
+     increment="1.000"
+     min_val="0.0"
+     max_val="60.0"
+     show_text="false"
+     layout="topleft"
+     left="3"
+     name="cam_pos_slider"
+     width="196" />
+    <spinner
+     control_name="CameraPositionSmoothing"
+     height="20"
+     follows="top|left"
+     left_pad="5"
+     name="cam_pos_spinner"
+     min_val="0.0"
+     max_val="60.0"
+     width="58"
+     increment="1.000">
+    </spinner>
+       <button
+       follows="top|left"
+       left_pad="3"
+       top_delta="0"
+       height="22"
+       width="22"
+       name="cam_pos_reset"
+       image_overlay="Refresh_Off"
+       tool_tip="Reset camera position smoothing to default value">
+          <button.commit_callback
+             function="ResetControl"
+             parameter="CameraPositionSmoothing" />
+       </button>
+  <button
+    name="open_prefs_btn"
+    label="Camera"
+    tool_tip = "Bring up Camera floater"
+    follows="top|left"
+    top_pad="5"
+    left="10"
+    height="20"
+    width="108">
+    <button.commit_callback
+      function="Presets.toggleCameraFloater" />
+  </button>
   <button
     name="open_prefs_btn"
-    label="Open Camera floater"
+    label="Save Preset"
     tool_tip = "Bring up Camera floater"
-    top_delta="5"
-    left="15"
+    follows="top|left"
+    top_delta="0"
+    left_pad="5"
     height="20"
-    width="200">
+    width="108">
     <button.commit_callback
       function="Presets.toggleCameraFloater" />
   </button>
+  <button
+  height="20"
+  label=""
+  image_overlay="Cam_Save"
+  name="save_cam_pos_btn"
+  tab_stop="false"
+  tool_tip="Save current camera position and focus"
+  follows="top|left"
+  layout="topleft"
+  top_delta="0"
+  left_pad="5"
+  width="23">
+  <button.commit_callback
+    function="Camera.SavePosition"/>
+ </button>
+ <button
+  height="20"
+  label=""
+  follows="top|left"
+  layout="topleft"
+  top_delta="0"
+  left_pad="5"
+  image_overlay="Cam_Recall"
+  name="restore_cam_pos_btn"
+  tab_stop="false"
+  tool_tip="Restore saved camera position and focus"
+  width="23">
+  <button.commit_callback
+    function="Camera.RestorePosition"/>
+ </button>
 </panel>
-- 
GitLab