project(gui
        LANGUAGES C CXX
        VERSION ${MAIN_PROJECT_VERSION}
        DESCRIPTION "Graphical UI for the simulator")

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(gui_lib_SOURCES
        dialogs/about/aboutdialog.cpp
        windows/cache/cachedock.cpp
        windows/cache/cacheview.cpp
        windows/csr/csrdock.cpp
        windows/coreview/scene.cpp
        extprocess.cpp
        fontsize.cpp
        dialogs/gotosymbol/gotosymboldialog.cpp
        graphicsview.cpp
        windows/memory/memorydock.cpp
        windows/memory/memorymodel.cpp
        windows/memory/memorytableview.cpp
        windows/messages/messagesdock.cpp
        windows/messages/messagesmodel.cpp
        windows/messages/messagesview.cpp
        dialogs/new/newdialog.cpp
        ui/hexlineedit.cpp
        ui/pow2spinbox.cpp
        windows/tlb/tlbview.cpp
        windows/tlb/tlbdock.cpp
        windows/editor/highlighterasm.cpp
        windows/editor/highlighterc.cpp
        windows/editor/linenumberarea.cpp
        windows/editor/editordock.cpp
        windows/editor/editortab.cpp
        mainwindow/assembler_gui_integration.cpp
        hinttabledelegate.cpp
        windows/lcd/lcddisplaydock.cpp
        windows/lcd/lcddisplayview.cpp
        mainwindow/mainwindow.cpp
        windows/peripherals/peripheralsdock.cpp
        windows/peripherals/peripheralsview.cpp
        windows/program/programdock.cpp
        windows/program/programmodel.cpp
        windows/program/programtableview.cpp
        windows/registers/registersdock.cpp
        dialogs/savechanged/savechangeddialog.cpp
        dialogs/webeval/webevalconfigdialog.cpp
        windows/webeval/webevaldock.cpp
        windows/webeval/taskdescriptiondock.cpp
        windows/editor/srceditor.cpp
        statictable.cpp
        windows/terminal/terminaldock.cpp
        textsignalaction.cpp
        windows/coreview/components/value_handlers.cpp
        windows/coreview/components/cache.cpp
        widgets/hidingtabwidget.cpp
        windows/predictor/predictor_btb_dock.cpp
        windows/predictor/predictor_bht_dock.cpp
        windows/predictor/predictor_info_dock.cpp
)
set(gui_lib_HEADERS
        dialogs/about/aboutdialog.h
        windows/cache/cachedock.h
        windows/cache/cacheview.h
        windows/csr/csrdock.h
        windows/coreview/scene.h
        extprocess.h
        fontsize.h
        dialogs/gotosymbol/gotosymboldialog.h
        graphicsview.h
        windows/memory/memorydock.h
        windows/memory/memorymodel.h
        windows/memory/memorytableview.h
        windows/messages/messagesdock.h
        windows/messages/messagesmodel.h
        windows/messages/messagesview.h
        dialogs/new/newdialog.h
        ui/hexlineedit.h
        ui/pow2spinbox.h
        windows/tlb/tlbview.h
        windows/tlb/tlbdock.h
        windows/editor/highlighterasm.h
        windows/editor/highlighterc.h
        windows/editor/linenumberarea.h
        windows/editor/editordock.h
        hinttabledelegate.h
        windows/lcd/lcddisplaydock.h
        windows/lcd/lcddisplayview.h
        mainwindow/mainwindow.h
        windows/peripherals/peripheralsdock.h
        windows/peripherals/peripheralsview.h
        windows/program/programdock.h
        windows/program/programmodel.h
        windows/program/programtableview.h
        windows/registers/registersdock.h
        dialogs/savechanged/savechangeddialog.h
        dialogs/webeval/webevalconfigdialog.h
        windows/webeval/webevaldock.h
        windows/webeval/taskdescriptiondock.h
        windows/editor/srceditor.h
        statictable.h
        windows/terminal/terminaldock.h
        textsignalaction.h
        windows/coreview/components/value_handlers.h
        windows/coreview/data.h
        windows/coreview/components/cache.h
        helper/async_modal.h
        widgets/hidingtabwidget.h
        windows/predictor/predictor_btb_dock.h
        windows/predictor/predictor_bht_dock.h
        windows/predictor/predictor_info_dock.h
)
set(gui_lib_UI
        dialogs/gotosymbol/gotosymboldialog.ui
        dialogs/new/NewDialog.ui
        windows/peripherals/peripheralsview.ui
        mainwindow/MainWindow.ui
        dialogs/new/NewDialogCache.ui
)
set(gui_lib_RESOURCES
        resources/icons/icons.qrc
        resources/samples/samples.qrc
        windows/coreview/schemas/schemas.qrc
)


if ("${WASM}")
    message(STATUS "gui :: Including WASM only files.")
    list(APPEND gui_lib_SOURCES qhtml5file_html5.cpp)
    list(APPEND gui_lib_HEADERS qhtml5file.h)
endif ()

# MACOS
set(ICON_NAME gui)
set(ICON_PATH ${CMAKE_SOURCE_DIR}/data/icons/macos/${ICON_NAME}.icns)
# END MACOS

add_library(gui_lib STATIC
        ${gui_lib_SOURCES}
        ${gui_lib_HEADERS}
        ${gui_lib_UI}
        ${gui_lib_RESOURCES})
target_include_directories(gui_lib
        PUBLIC
        . windows/coreview
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/gui_lib_autogen/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/gui_lib_autogen/include_$<CONFIG>>
        PRIVATE "${GENERATED_INCLUDE_PATH}")
target_link_libraries(gui_lib
        PUBLIC ${QtLib}::Core ${QtLib}::Widgets ${QtLib}::Gui ${QtLib}::Network
        PUBLIC machine os_emulation assembler svgscene)
target_compile_definitions(gui_lib
        PUBLIC
        APP_ORGANIZATION=\"${MAIN_PROJECT_ORGANIZATION}\"
        APP_ORGANIZATION_DOMAIN=\"${MAIN_PROJECT_HOMEPAGE_URL}\"
        APP_GIT=\"${MAIN_PROJECT_HOMEPAGE_URL}\"
        APP_NAME=\"${MAIN_PROJECT_NAME}\"
        APP_VERSION=\"${MAIN_PROJECT_VERSION}\"
        APP_USER_MANUAL_URL=\"https://comparch.edu.cvut.cz/qtrvsim/manual\"
        APP_REPORT_PROBLEM_URL=\"https://github.com/cvut/qtrvsim/issues/new\"
        ENV_CONFIG_FILE_NAME=\"${MAIN_PROJECT_NAME_UPPER}_CONFIG_FILE\")

add_executable(gui
        ${ICON_PATH}
        main.cpp)
target_link_libraries(gui
        PRIVATE gui_lib ${QtLib}::Core ${QtLib}::Gui ${QtLib}::Widgets ${QtLib}::Network)
set_target_properties(gui PROPERTIES
        OUTPUT_NAME "${MAIN_PROJECT_NAME_LOWER}_${PROJECT_NAME}")

if (${${QtLib}PrintSupport_FOUND} AND NOT ${WASM})
    target_link_libraries(gui_lib PUBLIC ${QtLib}::PrintSupport)
    target_compile_definitions(gui_lib PUBLIC WITH_PRINTING=1)
endif ()

# MACOS
set_property(SOURCE ${ICON_PATH}
        PROPERTY MACOSX_PACKAGE_LOCATION Resources)
set_target_properties(gui PROPERTIES
        MACOSX_BUNDLE true
        MACOSX_BUNDLE_GUI_IDENTIFIER cz.cvut.fel.${MAIN_PROJECT_ORGANIZATION}.gui
        MACOSX_BUNDLE_BUNDLE_NAME ${MAIN_PROJECT_NAME}
        MACOSX_BUNDLE_BUNDLE_VERSION "${MAIN_PROJECT_VERSION}"
        MACOSX_BUNDLE_SHORT_VERSION_STRING "${MAIN_PROJECT_VERSION}"
        MACOSX_BUNDLE_ICONFILE ${ICON_NAME}
)
# END MACOS

if (NOT "${WASM}")
    add_executable(editor_dock_test
            windows/editor/editordock.test.cpp
            windows/editor/editordock.test.h
            windows/editor/editordock.cpp
            windows/editor/editortab.cpp
            windows/editor/srceditor.cpp
            windows/editor/linenumberarea.cpp
            windows/editor/highlighterasm.cpp
            windows/editor/highlighterc.cpp
            dialogs/savechanged/savechangeddialog.cpp
            widgets/hidingtabwidget.cpp)
    target_include_directories(editor_dock_test PRIVATE .)
    target_link_libraries(editor_dock_test PRIVATE machine ${QtLib}::Widgets ${QtLib}::Test)
    add_test(NAME editor_dock COMMAND editor_dock_test)
    set_tests_properties(editor_dock PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen")
endif ()

# =============================================================================
# Installation
# =============================================================================

# Prior to CMake version 3.13, installation must be performed in the subdirectory,
# there the target was created. Therefore executable installation is to be found
# in corresponding CMakeLists.txt.

install(TARGETS gui
        RUNTIME DESTINATION bin
        BUNDLE DESTINATION ${EXECUTABLE_OUTPUT_PATH}
)
