# ----------------------------------------------------------------------------
# Safeguards against invalid configurations
# ----------------------------------------------------------------------------
if(NOT VIDEOSTITCH_CMAKE)
  message(FATAL_ERROR "Please configure CMake from the root folder!")
endif(NOT VIDEOSTITCH_CMAKE)

set(STUDIO_SOURCES
    src/centralwidget/centralstackedwidget.cpp
    src/centralwidget/outputtabwidget.cpp
    src/centralwidget/processtabwidget.cpp
    src/centralwidget/processtab/iprocesswidget.cpp
    src/centralwidget/processtab/outputfileprocess.cpp
    src/centralwidget/processtab/videoprocess.cpp
    src/centralwidget/processtab/audioprocess.cpp
    src/dialogs/extractdialog.cpp
    src/dialogs/jumpdialog.cpp
    src/dialogs/preferencesdialog.cpp
    src/dialogs/processprogressdialog.cpp
    src/dialogs/shortcutdialog.cpp
    src/main/main.cpp
    src/mainwindow/mainwindow.cpp
    src/videostitcher/postprodmutableprojectdefinition.cpp
    src/videostitcher/postprodprojectdefinition.cpp
    src/widgets/advancedblendingwidget.cpp
    src/widgets/blendingmaskwidget.cpp
    src/widgets/calibrationwidget.cpp
    src/widgets/computationwidget.cpp
    src/widgets/curvestreewidget.cpp
    src/widgets/exposurewidget.cpp
    src/widgets/interactivetabwidget.cpp
    src/widgets/seekbar.cpp
    src/widgets/stabilizationwidget.cpp
    src/widgets/synchronizationwidget.cpp
    src/widgets/outputconfigurationwidget.cpp
    src/widgets/timeline/timelinecontainer.cpp
    src/widgets/timeline/timelineticks.cpp
    src/widgets/timeline/timeline.cpp
    src/widgets/timesequence.cpp
    src/widgets/timeline/constrainedgraphicsitemgroup.cpp
    src/widgets/timeline/curvegraphicsitem.cpp
    src/widgets/timeline/timelinescene.cpp
    src/commands/synchronizationoffsetschangedcommand.cpp
    src/commands/calibrationappliedcommand.cpp
    src/commands/blendingmaskappliedcommand.cpp
    src/commands/externcalibrationappliedcommand.cpp
    src/commands/outputsizechangedcommand.cpp
    src/commands/panochangedcommand.cpp
    src/commands/blenderchangedcommand.cpp
    src/commands/advancedblenderchangedcommand.cpp
    src/commands/spherescalechangedcommand.cpp
    src/commands/stabilizationcomputedcommand.cpp
    src/videostitcher/postprodstitchercontroller.cpp
    src/videostitcher/globalpostprodcontroller.cpp
    src/commands/workingareachangedcommand.cpp
    src/commands/exposureappliedcommand.cpp
    src/commands/photometriccalibrationappliedcommand.cpp
    src/commands/orientationchangedcommand.cpp
    src/commands/projectionchangedcommand.cpp
    src/mainwindow/shortcutmanager.cpp
    src/widgets/photometriccalibrationwidget.cpp
    src/widgets/stereoconfigurationwidget.cpp
    src/mainwindow/postprodsettings.cpp)

set(STUDIO_HEADERS
    src/centralwidget/centralstackedwidget.hpp
    src/centralwidget/outputtabwidget.hpp
    src/centralwidget/processtabwidget.hpp
    src/centralwidget/processtab/iprocesswidget.hpp
    src/centralwidget/processtab/outputfileprocess.hpp
    src/centralwidget/processtab/videoprocess.hpp
    src/centralwidget/processtab/audioprocess.hpp
    src/commands/advancedblenderchangedcommand.hpp
    src/commands/blenderchangedcommand.hpp
    src/commands/spherescalechangedcommand.hpp
    src/commands/calibrationappliedcommand.hpp
    src/commands/exposureappliedcommand.hpp
    src/commands/photometriccalibrationappliedcommand.hpp
    src/commands/externcalibrationappliedcommand.hpp
    src/commands/orientationchangedcommand.hpp
    src/commands/outputsizechangedcommand.hpp
    src/commands/panochangedcommand.hpp
    src/commands/projectionchangedcommand.hpp
    src/commands/stabilizationcomputedcommand.hpp
    src/commands/synchronizationoffsetschangedcommand.hpp
    src/commands/undoHelpers.hpp
    src/commands/workingareachangedcommand.hpp
    src/dialogs/extractdialog.hpp
    src/dialogs/jumpdialog.hpp
    src/dialogs/preferencesdialog.hpp
    src/dialogs/processprogressdialog.hpp
    src/dialogs/shortcutdialog.hpp
    src/mainwindow/crasher.hpp
    src/mainwindow/mainwindow.hpp
    src/mainwindow/postprodsettings.hpp
    src/mainwindow/shortcutmanager.hpp
    src/videostitcher/postprodmutableprojectdefinition.hpp
    src/videostitcher/postprodprojectdefinition.hpp
    src/videostitcher/postprodstitchercontroller.hpp
    src/widgets/itoolwidget.hpp
    src/widgets/advancedblendingwidget.hpp
    src/widgets/blendingmaskwidget.hpp
    src/widgets/calibrationwidget.hpp
    src/widgets/computationwidget.hpp
    src/widgets/curvestreewidget.hpp
    src/widgets/exposurewidget.hpp
    src/widgets/interactivetabwidget.hpp
    src/widgets/photometriccalibrationwidget.hpp
    src/widgets/seekbar.hpp
    src/widgets/stabilizationwidget.hpp
    src/widgets/stereoconfigurationwidget.hpp
    src/widgets/synchronizationwidget.hpp
    src/widgets/outputconfigurationwidget.hpp
    src/widgets/timeline/constrainedgraphicsitemgroup.hpp
    src/widgets/timeline/curvegraphicsitem.hpp
    src/widgets/timeline/timeline.hpp
    src/widgets/timesequence.hpp
    src/widgets/timeline/timelinecontainer.hpp
    src/widgets/timeline/timelinescene.hpp
    src/widgets/timeline/timelineticks.hpp
    )

set(STUDIO_FORMS
    src/centralwidget/outputtabwidget.ui
    src/centralwidget/processtabwidget.ui
    src/centralwidget/processtab/outputfileprocess.ui
    src/centralwidget/processtab/videoprocess.ui
    src/centralwidget/processtab/audioprocess.ui
    src/dialogs/extractdialog.ui
    src/dialogs/preferencesdialog.ui
    src/mainwindow/mainwindow.ui
    src/widgets/seekbar.ui
    src/dialogs/jumpdialog.ui
    src/dialogs/welcomedialog.ui
    src/dialogs/shortcutdialog.ui
    src/widgets/synchronizationwidget.ui
    src/widgets/exposurewidget.ui
    src/widgets/interactivetabwidget.ui
    src/widgets/timeline/timelinecontainer.ui
    src/dialogs/processprogressdialog.ui
    src/widgets/advancedblendingwidget.ui
    src/widgets/blendingmaskwidget.ui
    src/widgets/calibrationwidget.ui
    src/widgets/stabilizationwidget.ui
    src/widgets/outputconfigurationwidget.ui
    src/widgets/timesequence.ui
    src/widgets/photometriccalibrationwidget.ui
    src/widgets/stereoconfigurationwidget.ui
    )


set(RESOURCES
    videostitch-studio-gui.qrc
    # add the qss resources to be able to search in it
    videostitch-studio.qss)

qt5_wrap_ui(UI_GENERATED_HEADERS ${STUDIO_FORMS})

include_directories(src)

if(BUILD_MACOSX_BUNDLE AND APPLE)
  # NOTE: Don't include the path in MACOSX_BUNDLE_ICON_FILE -- this is
  # the property added to Info.plist
  set(MACOSX_BUNDLE_ICON_FILE videostitch.icns)

  # And this part tells CMake where to find and install the file itself
  set(Studio_ICON ${CMAKE_CURRENT_SOURCE_DIR}/../resources/icons/vs/videostitch.icns)
  set_source_files_properties(${Studio_ICON} PROPERTIES
                              MACOSX_PACKAGE_LOCATION "Resources")

  set(VS_STUDIO_BUNDLE "VideoStitch-Studio")
  set(BIN_NAME "${VS_STUDIO_BUNDLE}")

  add_executable(${VS_STUDIO_BUNDLE} MACOSX_BUNDLE ${STUDIO_SOURCES} ${STUDIO_HEADERS} ${UI_GENERATED_HEADERS} ${RESOURCES} ${Studio_ICON})
  set_target_properties(${VS_STUDIO_BUNDLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/dmg/videostitch-studio.plist )

  add_dependencies(${VS_STUDIO_BUNDLE} batchstitcher)
  add_vs_IO_deps(${VS_STUDIO_BUNDLE})
  include_lib_vs_headers(${VS_STUDIO_BUNDLE})
  include_discovery_vs_headers(${VS_STUDIO_BUNDLE})
  target_include_directories(${VS_STUDIO_BUNDLE} PRIVATE ${LIB_VS_GUI_GEN_HEADER_DIR})
  set_property(TARGET ${VS_STUDIO_BUNDLE} PROPERTY CXX_STANDARD 14)
  target_link_libraries(${VS_STUDIO_BUNDLE} PRIVATE Qt5::Concurrent Qt5::Gui Qt5::Multimedia Qt5::OpenGL Qt5::Widgets ${VS_GUI} ${VS_BASE} ${CORE_FOUNDATION} ${VS_DISCOVERY})
  link_target_to_libvideostitch(${VS_STUDIO_BUNDLE})
else()

  # ----------------------------------------------------------------------------
  # Studio output directories
  # ----------------------------------------------------------------------------
  # Set the resources file for icon
  set(STUDIO_RC studio.rc)

  # Set binary output dir for the generic single-config case (e.g. make, ninja)
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${VS_STUDIO_DIR})
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${VS_STUDIO_DIR})
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${VS_STUDIO_DIR})

  # Set binary output dir for multi-config builds (e.g. MSVC, Xcode)
  foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
    string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG_UP)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UP} ${VS_STUDIO_DIR_${OUTPUTCONFIG_UP}})
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UP} ${VS_STUDIO_DIR_${OUTPUTCONFIG_UP}})
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG_UP} ${VS_STUDIO_DIR_${OUTPUTCONFIG_UP}})
  endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)

  # ----------------------------------------------------------------------------

  set(VS_STUDIO_BIN "videostitch-studio")
  set(BIN_NAME "${VS_STUDIO_BIN}")
  add_executable(${VS_STUDIO_BIN} WIN32 ${STUDIO_SOURCES} ${STUDIO_HEADERS} ${UI_GENERATED_HEADERS} ${RESOURCES} ${STUDIO_RC})

  add_dependencies(${VS_STUDIO_BIN} batchstitcher)
  add_vs_IO_deps(${VS_STUDIO_BIN})
  include_lib_vs_headers(${VS_STUDIO_BIN})
  include_discovery_vs_headers(${VS_STUDIO_BIN})
  target_include_directories(${VS_STUDIO_BIN} PRIVATE ${LIB_VS_GUI_GEN_HEADER_DIR})
  set_property(TARGET ${VS_STUDIO_BIN} PROPERTY CXX_STANDARD 14)
  target_link_libraries(${VS_STUDIO_BIN} PRIVATE Qt5::Concurrent Qt5::Gui Qt5::Multimedia Qt5::OpenGL Qt5::Widgets ${VS_GUI} ${VS_BASE} ${CORE_FOUNDATION} ${VS_DISCOVERY})
  link_target_to_libvideostitch(${VS_STUDIO_BIN})
endif()

target_compile_definitions(${BIN_NAME} PRIVATE "APPS_VIDEOSTITCH_VERSION=\"${STUDIO_VERSION}\"")
set_target_properties(${BIN_NAME} PROPERTIES COMPILE_FLAGS "${COMMON_FLAGS}")

# Add filter to MSVS project
assign_source_group(${STUDIO_SOURCES} ${STUDIO_HEADERS} ${STUDIO_FORMS})
add_cppcheck(${BIN_NAME} VS)