Browse Source

UI: Add UI support interface library with custom Qt elements

Allows the customized UI elements used by OBS Studio to more cleanly
be integrated into consumers of the same elements, mainly frontend
plugins in the main source tree.
PatTheMav 1 year ago
parent
commit
2809284795

+ 39 - 59
UI/frontend-plugins/aja-output-ui/CMakeLists.txt

@@ -9,84 +9,63 @@ endif()
 
 find_package(LibAJANTV2 REQUIRED)
 
-# cmake-format: off
 find_package(Qt6 REQUIRED Widgets)
-if(OS_LINUX)
+
+if(OS_LINUX
+   OR OS_FREEBSD
+   OR OS_OPENBSD)
   find_package(Qt6 REQUIRED Gui)
+
+  find_package(X11 REQUIRED)
+endif()
+
+if(NOT TARGET OBS::aja-support)
+  add_subdirectory("${CMAKE_SOURCE_DIR}/plugins/aja" "${CMAKE_BINARY_DIR}/plugins/aja")
 endif()
-# cmake-format: on
 
 add_library(aja-output-ui MODULE)
 add_library(OBS::aja-output-ui ALIAS aja-output-ui)
 
-target_sources(
-  aja-output-ui
-  PRIVATE AJAOutputUI.h
-          AJAOutputUI.cpp
-          aja-ui-main.cpp
-          aja-ui-main.h
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-card-manager.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-card-manager.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-common.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-common.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-enums.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-presets.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-presets.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-props.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-props.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-routing.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-routing.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-ui-props.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-vpid-data.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-vpid-data.hpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-widget-io.cpp"
-          "${CMAKE_SOURCE_DIR}/plugins/aja/aja-widget-io.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/double-slider.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/double-slider.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/plain-text-edit.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/plain-text-edit.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.moc.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/qt-wrappers.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/qt-wrappers.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.hpp")
+target_sources(aja-output-ui PRIVATE # cmake-format: sortable
+                                     aja-ui-main.cpp aja-ui-main.h AJAOutputUI.cpp AJAOutputUI.h)
 
 target_sources(aja-output-ui PRIVATE forms/output.ui)
 
-target_link_libraries(aja-output-ui PRIVATE OBS::libobs OBS::frontend-api Qt::Widgets AJA::LibAJANTV2)
+target_compile_options(
+  aja-output-ui PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-deprecated-declarations>
+                        $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-quoted-include-in-framework-header>)
+
+target_link_libraries(
+  aja-output-ui
+  PRIVATE OBS::libobs
+          OBS::aja-support
+          OBS::frontend-api
+          OBS::ui-support
+          Qt::Widgets
+          AJA::LibAJANTV2
+          $<$<PLATFORM_ID:Windows>:ws2_32.lib>
+          $<$<PLATFORM_ID:Windows>:setupapi.lib>
+          $<$<PLATFORM_ID:Windows>:Winmm.lib>
+          $<$<PLATFORM_ID:Windows>:netapi32.lib>
+          $<$<PLATFORM_ID:Windows>:Shlwapi.lib>
+          "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,AppKit.framework>>"
+          "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,CoreFoundation.framework>>"
+          "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,IOKit.framework>>"
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11>
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate>)
+
+target_link_options(aja-output-ui PRIVATE $<$<PLATFORM_ID:Windows>:/IGNORE:4099>)
 
 if(OS_WINDOWS)
   configure_file(cmake/windows/obs-module.rc.in aja-output-ui.rc)
   target_sources(aja-output-ui PRIVATE aja-output-ui.rc)
-  target_compile_options(aja-output-ui PRIVATE /wd4996)
-
-  target_link_libraries(aja-output-ui PRIVATE ws2_32.lib setupapi.lib Winmm.lib netapi32.lib Shlwapi.lib)
-  target_link_options(aja-output-ui PRIVATE /IGNORE:4099)
 
-  set_property(
-    TARGET aja-output-ui
-    APPEND
-    PROPERTY AUTORCC_OPTIONS --format-version 1)
-elseif(OS_MACOS)
   # cmake-format: off
-  target_link_libraries(
-    aja-output-ui
-    PRIVATE "$<LINK_LIBRARY:FRAMEWORK,AppKit.framework>"
-            "$<LINK_LIBRARY:FRAMEWORK,CoreFoundation.framework>"
-            "$<LINK_LIBRARY:FRAMEWORK,IOKit.framework>")
+  set_property(TARGET aja-output-ui APPEND PROPERTY AUTORCC_OPTIONS --format-version 1)
   # cmake-format: on
-  target_compile_options(aja-output-ui PRIVATE -Wno-deprecated-declarations -Wno-quoted-include-in-framework-header)
-elseif(OS_LINUX OR OS_FREEBSD)
-  find_package(X11 REQUIRED)
-  target_link_libraries(aja-output-ui PRIVATE X11::X11 Qt::GuiPrivate)
 endif()
 
+# cmake-format: off
 set_target_properties_obs(
   aja-output-ui
   PROPERTIES FOLDER frontend
@@ -95,3 +74,4 @@ set_target_properties_obs(
              AUTOUIC ON
              AUTORCC ON
              AUTOUIC_SEARCH_PATHS forms)
+# cmake-format: on

+ 20 - 12
UI/frontend-plugins/decklink-captions/CMakeLists.txt

@@ -7,6 +7,13 @@ if(NOT ENABLE_DECKLINK)
   return()
 endif()
 
+if(OS_LINUX
+   OR OS_FREEBSD
+   OR OS_OPENBSD)
+  find_package(X11 REQUIRED)
+  mark_as_advanced(X11)
+endif()
+
 # cmake-format: off
 find_package(Qt6 REQUIRED Widgets)
 # cmake-format: on
@@ -15,25 +22,25 @@ add_library(decklink-captions MODULE)
 add_library(OBS::decklink-captions ALIAS decklink-captions)
 
 target_sources(decklink-captions PRIVATE decklink-captions.cpp decklink-captions.h forms/captions.ui)
-target_link_libraries(decklink-captions PRIVATE OBS::frontend-api OBS::libobs Qt::Widgets)
+
+target_compile_options(decklink-captions PRIVATE $<$<PLATFORM_ID:Darwin>:-Wno-quoted-include-in-framework-header>
+                                                 $<$<PLATFORM_ID:Darwin>:-Wno-comma>)
+
+target_link_libraries(
+  decklink-captions
+  PRIVATE OBS::frontend-api OBS::libobs Qt::Widgets
+          "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa.framework>>" $<$<PLATFORM_ID:Linux,FreeBSD>:X11::X11>)
 
 if(OS_WINDOWS)
   configure_file(cmake/windows/obs-module.rc.in decklink-captions.rc)
   target_sources(decklink-captions PRIVATE decklink-captions.rc)
 
-  set_property(
-    TARGET decklink-captions
-    APPEND
-    PROPERTY AUTORCC_OPTIONS --format-version 1)
-elseif(OS_MACOS)
-  target_compile_options(decklink-captions PRIVATE -Wno-quoted-include-in-framework-header -Wno-comma)
-  target_link_libraries(decklink-captions PRIVATE "$<LINK_LIBRARY:FRAMEWORK,Cocoa.framework>")
-elseif(OS_LINUX OR OS_FREEBSD)
-  find_package(X11 REQUIRED)
-  mark_as_advanced(X11)
-  target_link_libraries(decklink-captions PRIVATE X11::X11)
+  # cmake-format: off
+  set_property(TARGET decklink-captions APPEND PROPERTY AUTORCC_OPTIONS --format-version 1)
+  # cmake-format: on
 endif()
 
+# cmake-format: off
 set_target_properties_obs(
   decklink-captions
   PROPERTIES FOLDER plugins/decklink
@@ -42,3 +49,4 @@ set_target_properties_obs(
              AUTOUIC ON
              AUTORCC ON
              AUTOUIC_SEARCH_PATHS forms)
+# cmake-format: on

+ 22 - 38
UI/frontend-plugins/decklink-output-ui/CMakeLists.txt

@@ -7,59 +7,43 @@ if(NOT ENABLE_DECKLINK)
   return()
 endif()
 
-# cmake-format: off
 find_package(Qt6 REQUIRED Widgets)
-if (OS_LINUX)
+
+if(OS_LINUX
+   OR OS_FREEBSD
+   OR OS_OPENBSD)
   find_package(Qt6 REQUIRED Gui)
+
+  find_package(X11 REQUIRED)
 endif()
-# cmake-format: on
 
 add_library(decklink-output-ui MODULE)
 add_library(OBS::decklink-output-ui ALIAS decklink-output-ui)
 
 target_sources(decklink-output-ui PRIVATE forms/output.ui)
 
-target_sources(
-  decklink-output-ui
-  PRIVATE DecklinkOutputUI.cpp
-          DecklinkOutputUI.h
-          decklink-ui-main.cpp
-          decklink-ui-main.h
-          "${CMAKE_SOURCE_DIR}/UI/double-slider.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/double-slider.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/plain-text-edit.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/plain-text-edit.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.moc.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/qt-wrappers.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/qt-wrappers.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.cpp")
+target_sources(decklink-output-ui PRIVATE DecklinkOutputUI.cpp DecklinkOutputUI.h decklink-ui-main.cpp
+                                          decklink-ui-main.h)
 
-target_link_libraries(decklink-output-ui PRIVATE OBS::libobs OBS::frontend-api Qt::Widgets)
+target_compile_options(decklink-output-ui PRIVATE $<$<PLATFORM_ID:Darwin>:-Wno-quoted-include-in-framework-header>)
+
+target_link_libraries(
+  decklink-output-ui
+  PRIVATE OBS::libobs
+          OBS::frontend-api
+          OBS::ui-support
+          Qt::Widgets
+          "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa.framework>>"
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11>
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate>)
 
 if(OS_WINDOWS)
   configure_file(cmake/windows/obs-module.rc.in decklink-output-ui.rc)
   target_sources(decklink-output-ui PRIVATE decklink-output-ui.rc)
 
-  set_property(
-    TARGET decklink-output-ui
-    APPEND
-    PROPERTY AUTORCC_OPTIONS --format-version 1)
-elseif(OS_MACOS)
-  find_library(COCOA Cocoa)
-  mark_as_advanced(COCOA)
-
-  target_link_libraries(decklink-output-ui PRIVATE ${COCOA})
-  target_compile_options(decklink-output-ui PRIVATE -Wno-quoted-include-in-framework-header)
-elseif(OS_LINUX OR OS_FREEBSD)
-  find_package(X11 REQUIRED)
-  target_link_libraries(decklink-output-ui PRIVATE X11::X11 Qt::GuiPrivate)
+  # cmake-format: off
+  set_property(TARGET decklink-output-ui APPEND PROPERTY AUTORCC_OPTIONS --format-version 1)
+  # cmake-format: on
 endif()
 
 set_target_properties_obs(

+ 41 - 59
UI/frontend-plugins/frontend-tools/CMakeLists.txt

@@ -2,47 +2,54 @@ cmake_minimum_required(VERSION 3.22...3.25)
 
 legacy_check()
 
-# cmake-format: off
 find_package(Qt6 REQUIRED Widgets)
-if (OS_LINUX)
+
+if(OS_LINUX
+   OR OS_FREEBSD
+   OR OS_OPENBSD)
   find_package(Qt6 REQUIRED Gui)
+  find_package(X11 REQUIRED)
 endif()
-# cmake-format: on
 
 add_library(frontend-tools MODULE)
 add_library(OBS::frontend-tools ALIAS frontend-tools)
 
 target_sources(
   frontend-tools
-  PRIVATE frontend-tools.c
-          auto-scene-switcher.hpp
+  PRIVATE # cmake-format: sortable
+          $<$<PLATFORM_ID:Darwin>:auto-scene-switcher-osx.mm>
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:auto-scene-switcher-nix.cpp>
+          $<$<PLATFORM_ID:Windows>:auto-scene-switcher-win.cpp>
+          $<$<PLATFORM_ID:Windows>:captions-handler.cpp>
+          $<$<PLATFORM_ID:Windows>:captions-handler.hpp>
+          $<$<PLATFORM_ID:Windows>:captions-mssapi-stream.cpp>
+          $<$<PLATFORM_ID:Windows>:captions-mssapi-stream.hpp>
+          $<$<PLATFORM_ID:Windows>:captions-mssapi.cpp>
+          $<$<PLATFORM_ID:Windows>:captions-mssapi.hpp>
+          $<$<PLATFORM_ID:Windows>:captions.cpp>
+          $<$<PLATFORM_ID:Windows>:captions.hpp>
           auto-scene-switcher.cpp
-          output-timer.hpp
-          tool-helpers.hpp
+          auto-scene-switcher.hpp
+          frontend-tools.c
           output-timer.cpp
-          "${CMAKE_SOURCE_DIR}/UI/double-slider.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/double-slider.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/horizontal-scroll-area.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/horizontal-scroll-area.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/properties-view.moc.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/qt-wrappers.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/qt-wrappers.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.hpp"
-          "${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/plain-text-edit.cpp"
-          "${CMAKE_SOURCE_DIR}/UI/plain-text-edit.hpp")
+          output-timer.hpp
+          tool-helpers.hpp)
 
 target_sources(frontend-tools PRIVATE forms/auto-scene-switcher.ui forms/captions.ui forms/output-timer.ui
                                       forms/scripts.ui)
 
-target_link_libraries(frontend-tools PRIVATE OBS::frontend-api OBS::libobs Qt::Widgets
-                                             $<$<PLATFORM_ID:Linux,FreeBSD>:Qt::GuiPrivate>)
+target_compile_options(frontend-tools PRIVATE $<$<PLATFORM_ID:Darwin>:-Wno-quoted-include-in-framework-header>
+                                              $<$<PLATFORM_ID:Darwin>:-Wno-comma>)
+
+target_link_libraries(
+  frontend-tools
+  PRIVATE OBS::frontend-api
+          OBS::libobs
+          OBS::ui-support
+          Qt::Widgets
+          "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa>>"
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11>
+          $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate>)
 
 add_subdirectory("${CMAKE_SOURCE_DIR}/deps/obs-scripting" "${CMAKE_BINARY_DIR}/deps/obs-scripting")
 
@@ -54,41 +61,14 @@ endif()
 
 if(OS_WINDOWS)
   configure_file(cmake/windows/obs-module.rc.in frontend-tools.rc)
-  target_sources(
-    frontend-tools
-    PRIVATE auto-scene-switcher-win.cpp
-            frontend-tools.rc
-            captions.cpp
-            captions.hpp
-            captions-handler.cpp
-            captions-handler.hpp
-            captions-mssapi.cpp
-            captions-mssapi.hpp
-            captions-mssapi-stream.cpp
-            captions-mssapi-stream.hpp)
+  target_sources(frontend-tools PRIVATE frontend-tools.rc)
 
-  set_property(
-    TARGET frontend-tools
-    APPEND
-    PROPERTY AUTORCC_OPTIONS --format-version 1)
-elseif(OS_MACOS)
-  find_library(COCOA Cocoa)
-  mark_as_advanced(COCOA)
-  target_link_libraries(frontend-tools PRIVATE ${COCOA})
-
-  target_sources(frontend-tools PRIVATE auto-scene-switcher-osx.mm)
-  target_compile_options(frontend-tools PRIVATE -Wno-quoted-include-in-framework-header -Wno-comma)
-  set_target_properties(frontend-tools PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
-  if(NOT XCODE)
-    set_source_files_properties(auto-scene-switcher-osx.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
-  endif()
-elseif(OS_LINUX OR OS_FREEBSD)
-  find_package(X11 REQUIRED)
-
-  target_link_libraries(frontend-tools PRIVATE X11::X11)
-  target_sources(frontend-tools PRIVATE auto-scene-switcher-nix.cpp)
+  # cmake-format: off
+  set_property(TARGET frontend-tools APPEND PROPERTY AUTORCC_OPTIONS --format-version 1)
+  # cmake-format: on
 endif()
 
+# cmake-format: off
 set_target_properties_obs(
   frontend-tools
   PROPERTIES FOLDER frontend
@@ -96,4 +76,6 @@ set_target_properties_obs(
              AUTOMOC ON
              AUTOUIC ON
              AUTORCC ON
-             AUTOUIC_SEARCH_PATHS forms)
+             AUTOUIC_SEARCH_PATHS forms
+             XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
+# cmake-format: on