Ver Fonte

UI: Add snap options to general settings section

Allows the user to disable snapping all together or control the snap
threshold.
Jeremiah Senkpiel há 9 anos atrás
pai
commit
ad70d023c4

+ 3 - 0
obs/data/locale/en-US.ini

@@ -355,6 +355,9 @@ Basic.Settings.General.Theme="Theme"
 Basic.Settings.General.Language="Language"
 Basic.Settings.General.WarnBeforeStartingStream="Show confirmation dialog when starting streams"
 Basic.Settings.General.WarnBeforeStoppingStream="Show confirmation dialog when stopping streams"
+Basic.Settings.General.Snapping="Source Alignment Snapping"
+Basic.Settings.General.ScreenSnapping="Snap Sources to edge of screen"
+Basic.Settings.General.SnapDistance="Snap Sensitivity"
 
 # basic mode 'stream' settings
 Basic.Settings.Stream="Stream"

+ 130 - 2
obs/forms/OBSBasicSettings.ui

@@ -185,6 +185,86 @@
            </property>
           </widget>
          </item>
+         <item row="5" column="0" colspan="2">
+          <widget class="Line" name="line_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item row="6" column="0" colspan="2">
+          <widget class="QGroupBox" name="groupBox_10">
+           <property name="enabled">
+            <bool>true</bool>
+           </property>
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="title">
+            <string>Basic.Settings.General.Snapping</string>
+           </property>
+           <property name="flat">
+            <bool>false</bool>
+           </property>
+           <layout class="QFormLayout" name="formLayout_21">
+            <property name="labelAlignment">
+             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+            </property>
+            <item row="0" column="1">
+             <widget class="QCheckBox" name="snappingEnabled">
+              <property name="text">
+               <string>Enable</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="1">
+             <widget class="QCheckBox" name="screenSnapping">
+              <property name="text">
+               <string>Basic.Settings.General.ScreenSnapping</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="1">
+             <widget class="QDoubleSpinBox" name="snapDistance">
+              <property name="decimals">
+               <number>1</number>
+              </property>
+              <property name="singleStep">
+               <double>0.500000000000000</double>
+              </property>
+              <property name="value">
+               <double>10.000000000000000</double>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QLabel" name="label_9">
+              <property name="minimumSize">
+               <size>
+                <width>170</width>
+                <height>0</height>
+               </size>
+              </property>
+              <property name="text">
+               <string>Basic.Settings.General.SnapDistance</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
         </layout>
        </widget>
        <widget class="QWidget" name="streamPage">
@@ -3485,8 +3565,56 @@
    <slot>setEnabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>517</x>
-     <y>267</y>
+     <x>690</x>
+     <y>454</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>690</x>
+     <y>506</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>snappingEnabled</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>label_9</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>376</x>
+     <y>196</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>305</x>
+     <y>224</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>snappingEnabled</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>snapDistance</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>417</x>
+     <y>204</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>434</x>
+     <y>234</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>snappingEnabled</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>screenSnapping</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>476</x>
+     <y>202</y>
     </hint>
     <hint type="destinationlabel">
      <x>777</x>

+ 6 - 0
obs/obs-app.cpp

@@ -339,6 +339,12 @@ bool OBSApp::InitGlobalConfigDefaults()
 			"SceneDuplicationMode", true);
 	config_set_default_bool(globalConfig, "BasicWindow",
 			"SwapScenesMode", true);
+	config_set_default_bool(globalConfig, "BasicWindow",
+			"SnappingEnabled", true);
+	config_set_default_bool(globalConfig, "BasicWindow",
+			"ScreenSnapping", true);
+	config_set_default_double(globalConfig, "BasicWindow",
+			"SnapDistance", 10.0);
 
 #ifdef __APPLE__
 	config_set_default_bool(globalConfig, "Video", "DisableOSXVSync", true);

+ 31 - 9
obs/window-basic-preview.cpp

@@ -11,7 +11,6 @@
 
 #define HANDLE_RADIUS     4.0f
 #define HANDLE_SEL_RADIUS (HANDLE_RADIUS * 1.5f)
-#define CLAMP_DISTANCE    10.0f
 
 /* TODO: make C++ math classes and clean up code here later */
 
@@ -133,7 +132,7 @@ static inline vec2 GetOBSScreenSize()
 	return size;
 }
 
-vec3 OBSBasicPreview::GetScreenSnapOffset(const vec3 &tl, const vec3 &br)
+vec3 OBSBasicPreview::GetSnapOffset(const vec3 &tl, const vec3 &br)
 {
 	OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
 	vec2 screenSize = GetOBSScreenSize();
@@ -141,17 +140,34 @@ vec3 OBSBasicPreview::GetScreenSnapOffset(const vec3 &tl, const vec3 &br)
 
 	vec3_zero(&clampOffset);
 
-	const float clampDist = CLAMP_DISTANCE / main->previewScale;
+	const bool snap = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "SnappingEnabled");
+	if (snap == false)
+		return clampOffset;
 
-	if (fabsf(tl.x) < clampDist)
+	const bool screenSnap = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "ScreenSnapping");
+
+	const float clampDist = config_get_double(GetGlobalConfig(),
+			"BasicWindow", "SnapDistance") / main->previewScale;
+
+	// Left screen edge.
+	if (screenSnap &&
+	    fabsf(tl.x) < clampDist)
 		clampOffset.x = -tl.x;
-	if (fabsf(clampOffset.x) < EPSILON &&
+	// Right screen edge.
+	if (screenSnap &&
+	    fabsf(clampOffset.x) < EPSILON &&
 	    fabsf(screenSize.x - br.x) < clampDist)
 		clampOffset.x = screenSize.x - br.x;
 
-	if (fabsf(tl.y) < clampDist)
+	// Top screen edge.
+	if (screenSnap &&
+	    fabsf(tl.y) < clampDist)
 		clampOffset.y = -tl.y;
-	if (fabsf(clampOffset.y) < EPSILON &&
+	// Bottom screen edge.
+	if (screenSnap &&
+	    fabsf(clampOffset.y) < EPSILON &&
 	    fabsf(screenSize.y - br.y) < clampDist)
 		clampOffset.y = screenSize.y - br.y;
 
@@ -485,7 +501,13 @@ void OBSBasicPreview::SnapItemMovement(vec2 &offset)
 	data.br.x += offset.x;
 	data.br.y += offset.y;
 
-	vec3 snapOffset = GetScreenSnapOffset(data.tl, data.br);
+	vec3 snapOffset = GetSnapOffset(data.tl, data.br);
+
+	const bool snap = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "SnappingEnabled");
+	if (snap == false)
+		return;
+
 	offset.x += snapOffset.x;
 	offset.y += snapOffset.y;
 }
@@ -606,7 +628,7 @@ void OBSBasicPreview::SnapStretchingToScreen(vec3 &tl, vec3 &br)
 	vec3_max(&boundingBR, &boundingBR, &newBL);
 	vec3_max(&boundingBR, &boundingBR, &newBR);
 
-	vec3 offset = GetScreenSnapOffset(boundingTL, boundingBR);
+	vec3 offset = GetSnapOffset(boundingTL, boundingBR);
 	vec3_add(&offset, &offset, &newTL);
 	vec3_transform(&offset, &offset, &screenToItem);
 	vec3_sub(&offset, &offset, &tl);

+ 1 - 1
obs/window-basic-preview.hpp

@@ -56,7 +56,7 @@ private:
 	static void DoSelect(const vec2 &pos);
 	static void DoCtrlSelect(const vec2 &pos);
 
-	static vec3 GetScreenSnapOffset(const vec3 &tl, const vec3 &br);
+	static vec3 GetSnapOffset(const vec3 &tl, const vec3 &br);
 
 	void GetStretchHandleData(const vec2 &pos);
 

+ 29 - 0
obs/window-basic-settings.cpp

@@ -266,6 +266,9 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
 	HookWidget(ui->theme, 		     COMBO_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->warnBeforeStreamStart,CHECK_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->warnBeforeStreamStop, CHECK_CHANGED,  GENERAL_CHANGED);
+	HookWidget(ui->snappingEnabled,      CHECK_CHANGED,  GENERAL_CHANGED);
+	HookWidget(ui->screenSnapping,       CHECK_CHANGED,  GENERAL_CHANGED);
+	HookWidget(ui->snapDistance,         SCROLL_CHANGED, GENERAL_CHANGED);
 	HookWidget(ui->outputMode,           COMBO_CHANGED,  OUTPUTS_CHANGED);
 	HookWidget(ui->streamType,           COMBO_CHANGED,  STREAM1_CHANGED);
 	HookWidget(ui->simpleOutputPath,     EDIT_CHANGED,   OUTPUTS_CHANGED);
@@ -763,6 +766,19 @@ void OBSBasicSettings::LoadGeneralSettings()
 	LoadLanguageList();
 	LoadThemeList();
 
+	bool snappingEnabled = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "SnappingEnabled");
+	ui->snappingEnabled->setChecked(snappingEnabled);
+
+	bool screenSnapping = config_get_bool(GetGlobalConfig(),
+			"BasicWindow", "ScreenSnapping");
+	ui->screenSnapping->setChecked(screenSnapping);
+
+	double snapDistance = config_get_double(GetGlobalConfig(),
+			"BasicWindow", "SnapDistance");
+	ui->snapDistance->setValue(snapDistance);
+
+
 	bool warnBeforeStreamStart = config_get_bool(GetGlobalConfig(),
 			"BasicWindow", "WarnBeforeStartingStream");
 	ui->warnBeforeStreamStart->setChecked(warnBeforeStreamStart);
@@ -2038,6 +2054,19 @@ void OBSBasicSettings::SaveGeneralSettings()
 		App()->SetTheme(theme);
 	}
 
+	if (WidgetChanged(ui->snappingEnabled))
+		config_set_bool(GetGlobalConfig(), "BasicWindow",
+				"SnappingEnabled",
+				ui->snappingEnabled->isChecked());
+	if (WidgetChanged(ui->screenSnapping))
+		config_set_bool(GetGlobalConfig(), "BasicWindow",
+				"ScreenSnapping",
+				ui->screenSnapping->isChecked());
+	if (WidgetChanged(ui->snapDistance))
+		config_set_double(GetGlobalConfig(), "BasicWindow",
+				"SnapDistance",
+				ui->snapDistance->value());
+
 	config_set_bool(GetGlobalConfig(), "BasicWindow",
 			"WarnBeforeStartingStream",
 			ui->warnBeforeStreamStart->isChecked());