cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)

# meta data
set(META_PROJECT_NAME qtutilities)
set(META_PROJECT_VARNAME QT_UTILITIES)
set(META_APP_NAME "Qt Utilities")
set(META_APP_AUTHOR "Martchus")
set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
set(META_APP_DESCRIPTION
    "Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models")
set(META_VERSION_MAJOR 6)
set(META_VERSION_MINOR 0)
set(META_VERSION_PATCH 0)
set(META_APP_VERSION ${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH})

project(${META_PROJECT_NAME})

# add project files
set(HEADER_FILES
    misc/xmlparsermacros.h
    misc/undefxmlparsermacros.h
    misc/trylocker.h
    misc/adoptlocker.h
    misc/dialogutils.h
    misc/desktoputils.h
    misc/conversion.h
    models/checklistmodel.h
    resources/qtconfigarguments.h
    resources/resources.h
    resources/importplugin.h)
set(SRC_FILES
    misc/dialogutils.cpp
    misc/desktoputils.cpp
    models/checklistmodel.cpp
    resources/qtconfigarguments.cpp
    resources/resources.cpp)
set(RES_FILES resources/qtutilsicons.qrc)

set(WIDGETS_HEADER_FILES
    aboutdialog/aboutdialog.h
    enterpassworddialog/enterpassworddialog.h
    settingsdialog/optioncategory.h
    settingsdialog/optioncategoryfiltermodel.h
    settingsdialog/optioncategorymodel.h
    settingsdialog/optionpage.h
    settingsdialog/settingsdialog.h
    settingsdialog/qtsettings.h
    widgets/buttonoverlay.h
    widgets/clearcombobox.h
    widgets/clearlineedit.h
    widgets/clearplaintextedit.h
    widgets/clearspinbox.h
    widgets/iconbutton.h
    widgets/pathselection.h
    paletteeditor/paletteeditor.h
    paletteeditor/colorbutton.h
    misc/recentmenumanager.h)
set(WIDGETS_SRC_FILES
    aboutdialog/aboutdialog.cpp
    enterpassworddialog/enterpassworddialog.cpp
    settingsdialog/optioncategory.cpp
    settingsdialog/optioncategoryfiltermodel.cpp
    settingsdialog/optioncategorymodel.cpp
    settingsdialog/optionpage.cpp
    settingsdialog/settingsdialog.cpp
    settingsdialog/qtsettings.cpp
    widgets/buttonoverlay.cpp
    widgets/clearcombobox.cpp
    widgets/clearlineedit.cpp
    widgets/clearplaintextedit.cpp
    widgets/clearspinbox.cpp
    widgets/iconbutton.cpp
    widgets/pathselection.cpp
    paletteeditor/paletteeditor.cpp
    paletteeditor/colorbutton.cpp
    misc/recentmenumanager.cpp)
set(WIDGETS_UI_FILES
    aboutdialog/aboutdialog.ui
    enterpassworddialog/enterpassworddialog.ui
    settingsdialog/settingsdialog.ui
    settingsdialog/qtappearanceoptionpage.ui
    settingsdialog/qtlanguageoptionpage.ui
    settingsdialog/qtenvoptionpage.ui
    paletteeditor/paletteeditor.ui)

set(CMAKE_MODULE_FILES
    cmake/modules/AndroidApk.cmake
    cmake/modules/QtConfig.cmake
    cmake/modules/QtGuiConfig.cmake
    cmake/modules/QtLinkage.cmake
    cmake/modules/QtWebViewProviderConfig.cmake
    cmake/modules/QtJsProviderConfig.cmake)
set(CMAKE_TEMPLATE_FILES
    cmake/templates/qtconfig.h.in
    cmake/templates/webviewdefs.h.in
    cmake/templates/webviewincludes.h.in
    cmake/templates/jsdefs.h.in
    cmake/templates/jsincludes.h.in)
if (ANDROID)
    list(APPEND CMAKE_MODULE_FILES)
    list(APPEND CMAKE_TEMPLATE_FILES cmake/templates/android-deployment.json.in)
endif ()

set(TS_FILES translations/${META_PROJECT_NAME}_de_DE.ts translations/${META_PROJECT_NAME}_en_US.ts)

set(DOC_FILES README.md)

set(REQUIRED_ICONS
    dialog-cancel
    dialog-ok
    dialog-ok-apply
    document-open
    document-open-recent
    edit-clear
    go-next
    preferences-desktop-icons
    preferences-desktop-locale
    qtcreator
    system-file-manager
    system-run
    system-search
    window-close)

set(SCRIPT_FILES scripts/required_icons.sh)

# required to include CMake modules from own project directory
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" "${CMAKE_MODULE_PATH}")

# configure platform specific capslock detection for enterpassworddialog.cpp
if (WIN32 OR (UNIX AND NOT APPLE AND NOT ANDROID))
    set(ENABLE_CAPSLOCK_DETECTION_BY_DEFAULT ON)
else ()
    set(ENABLE_CAPSLOCK_DETECTION_BY_DEFAULT OFF)
endif ()
option(CAPSLOCK_DETECTION "enables capslock detection" ${ENABLE_CAPSLOCK_DETECTION_BY_DEFAULT})
if (CAPSLOCK_DETECTION)
    if (WIN32)
        # WinAPI provides functions to provide capslock detection
        set(HAVE_PLATFORM_SPECIFIC_CAPSLOCK_DETECTION ON)
    else ()
        # X11 can provide functions for capslock detection under non-Windows environments
        find_package(X11)
        if (X11_FOUND)
            list(APPEND LIBRARIES ${X11_LIBRARIES})
            set(HAVE_PLATFORM_SPECIFIC_CAPSLOCK_DETECTION ON)
        endif ()
    endif ()
    if (NOT HAVE_PLATFORM_SPECIFIC_CAPSLOCK_DETECTION)
        message(FATAL_ERROR "No backend for capslock detection found (WinAPI or X11 must be provided)")
    endif ()
    set_property(SOURCE enterpassworddialog/enterpassworddialog.cpp
                 APPEND
                 PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_PLATFORM_SPECIFIC_CAPSLOCK_DETECTION)
endif ()

# configure support for D-Bus notifications
if (UNIX AND NOT APPLE AND NOT ANDROID)
    set(ENABLE_DBUS_NOTIFICATIONS_BY_DEFAULT ON)
else ()
    set(ENABLE_DBUS_NOTIFICATIONS_BY_DEFAULT OFF)
endif ()
option(DBUS_NOTIFICATIONS "enables support for D-Bus notifications" ${ENABLE_DBUS_NOTIFICATIONS_BY_DEFAULT})
set(DBUS_NOTIFICATIONS_FILE_NAME misc/dbusnotification)
if (DBUS_NOTIFICATIONS)
    list(APPEND HEADER_FILES ${DBUS_NOTIFICATIONS_FILE_NAME}.h)
    list(APPEND SRC_FILES ${DBUS_NOTIFICATIONS_FILE_NAME}.cpp)
    list(APPEND DBUS_FILES dbus/org.freedesktop.Notifications.xml)
    list(APPEND META_PUBLIC_COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_SUPPORT_DBUS_NOTIFICATIONS)
    message(STATUS "D-Bus notifications enabled")
else ()
    list(APPEND EXCLUDED_FILES ${DBUS_NOTIFICATIONS_FILE_NAME}.h ${DBUS_NOTIFICATIONS_FILE_NAME}.cpp)
    message(STATUS "D-Bus notifications disabled")
endif ()

# find c++utilities
set(CONFIGURATION_PACKAGE_SUFFIX
    ""
    CACHE STRING "sets the suffix for find_package() calls to packages configured via c++utilities")
find_package(c++utilities${CONFIGURATION_PACKAGE_SUFFIX} 5.0.0 REQUIRED)
use_cpp_utilities()

# include modules to apply configuration
include(BasicConfig)
include(QtGuiConfig)

# add further Qt modules (which are not automatically detected)
set(META_PUBLIC_QT_MODULES Core ${ADDITIONAL_QT_MODULES})

# include further modules to apply configuration
include(QtConfig)
include(WindowsResources)
include(LibraryTarget)
include(Doxygen)
include(ConfigHeader)
