diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index de6be7a08..c8599af30 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -534,6 +534,8 @@ Basic.MainMenu.Edit.Transform.FlipVertical="Flip &Vertical" Basic.MainMenu.Edit.Transform.FitToScreen="&Fit to screen" Basic.MainMenu.Edit.Transform.StretchToScreen="&Stretch to screen" Basic.MainMenu.Edit.Transform.CenterToScreen="&Center to screen" +Basic.MainMenu.Edit.Transform.VerticalCenter="Center Vertically" +Basic.MainMenu.Edit.Transform.HorizontalCenter="Center Horizontally" Basic.MainMenu.Edit.Order="&Order" Basic.MainMenu.Edit.Order.MoveUp="Move &Up" Basic.MainMenu.Edit.Order.MoveDown="Move &Down" diff --git a/UI/forms/OBSBasic.ui b/UI/forms/OBSBasic.ui index b07d5c5b4..211e1c17c 100644 --- a/UI/forms/OBSBasic.ui +++ b/UI/forms/OBSBasic.ui @@ -185,6 +185,8 @@ + + @@ -1361,6 +1363,16 @@ Ctrl+D + + + Basic.MainMenu.Edit.Transform.VerticalCenter + + + + + Basic.MainMenu.Edit.Transform.HorizontalCenter + + Basic.MainMenu.Edit.Transform.FlipHorizontal diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index b4f90ef81..c045f2b22 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -6106,20 +6106,39 @@ void OBSBasic::on_actionStretchToScreen_triggered() &boundsType); } -static bool center_to_scene(obs_scene_t *, obs_sceneitem_t *item, void *) +enum class CenterType { + Scene, + Vertical, + Horizontal +}; + +static bool center_to_scene(obs_scene_t *, obs_sceneitem_t *item, void *param) { + CenterType centerType = *reinterpret_cast(param); + vec3 tl, br, itemCenter, screenCenter, offset; obs_video_info ovi; + obs_transform_info oti; if (obs_sceneitem_is_group(item)) - obs_sceneitem_group_enum_items(item, center_to_scene, nullptr); + obs_sceneitem_group_enum_items(item, center_to_scene, + ¢erType); if (!obs_sceneitem_selected(item)) return true; obs_get_video_info(&ovi); + obs_sceneitem_get_info(item, &oti); + + if (centerType == CenterType::Scene) + vec3_set(&screenCenter, float(ovi.base_width), + float(ovi.base_height), 0.0f); + else if (centerType == CenterType::Vertical) + vec3_set(&screenCenter, float(oti.bounds.x), + float(ovi.base_height), 0.0f); + else if (centerType == CenterType::Horizontal) + vec3_set(&screenCenter, float(ovi.base_width), + float(oti.bounds.y), 0.0f); - vec3_set(&screenCenter, float(ovi.base_width), - float(ovi.base_height), 0.0f); vec3_mulf(&screenCenter, &screenCenter, 0.5f); GetItemBox(item, tl, br); @@ -6131,13 +6150,31 @@ static bool center_to_scene(obs_scene_t *, obs_sceneitem_t *item, void *) vec3_sub(&offset, &screenCenter, &itemCenter); vec3_add(&tl, &tl, &offset); + if (centerType == CenterType::Vertical) + tl.x = oti.pos.x; + else if (centerType == CenterType::Horizontal) + tl.y = oti.pos.y; + SetItemTL(item, tl); return true; }; void OBSBasic::on_actionCenterToScreen_triggered() { - obs_scene_enum_items(GetCurrentScene(), center_to_scene, nullptr); + CenterType centerType = CenterType::Scene; + obs_scene_enum_items(GetCurrentScene(), center_to_scene, ¢erType); +} + +void OBSBasic::on_actionVerticalCenter_triggered() +{ + CenterType centerType = CenterType::Vertical; + obs_scene_enum_items(GetCurrentScene(), center_to_scene, ¢erType); +} + +void OBSBasic::on_actionHorizontalCenter_triggered() +{ + CenterType centerType = CenterType::Horizontal; + obs_scene_enum_items(GetCurrentScene(), center_to_scene, ¢erType); } void OBSBasic::EnablePreviewDisplay(bool enable) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 85d71f21f..c69c8930b 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -673,6 +673,8 @@ private slots: void on_actionFitToScreen_triggered(); void on_actionStretchToScreen_triggered(); void on_actionCenterToScreen_triggered(); + void on_actionVerticalCenter_triggered(); + void on_actionHorizontalCenter_triggered(); void on_scenes_currentItemChanged(QListWidgetItem *current, QListWidgetItem *prev);