set(HEADERS
    Export.h
    Action.h
    ActionGroup.h
    App.h
    Bellows.h
    ButtonGroup.h
    Capture.h
    CheckBox.h
    ChoiceDialog.h
    ClipboardSystem.h
    ColorDot.h
    ColorPopup.h
    ColorSlider.h
    ColorSwatch.h
    ColorWidget.h
    ColorWidgetSystem.h
    ComboBox.h
    ConfirmDialog.h
    DiagWidget.h
    DialogSystem.h
    Divider.h
    DocumentModel.h
    DoubleEdit.h
    DoubleEditShuttle.h
    DoubleEditSlider.h
    DoubleModel.h
    DoubleSlider.h
    DrawUtil.h
    DrivesModel.h
    Event.h
    FileBrowser.h
    FileBrowserWidgets.h
    FileEdit.h
    FloatEdit.h
    FloatEditShuttle.h
    FloatEditSlider.h
    FloatModel.h
    FloatSlider.h
    FlowLayout.h
    FormLayout.h
    GraphWidget.h
    GridLayout.h
    GroupBox.h
    IButton.h
    IContainer.h
    IDialog.h
    InputDialog.h
    ItemButton.h
    ItemButtonList.h
    IMenuPopup.h
    IMouseWidget.h
    IPopup.h
    IWidget.h
    IWidgetInline.h
    IWidgetPopup.h
    IWindow.h
    ImageWidget.h
    IncButtons.h
    IntEdit.h
    IntEditShuttle.h
    IntEditSlider.h
    IntModel.h
    IntSlider.h
    Icon.h
    IconSystem.h
    Init.h
    Label.h
    LayoutUtil.h
    LevelsSlider.h
    LineEdit.h
    LineEditModel.h
    ListItemsWidget.h
    ListWidget.h
    MainWindow.h
    MDICanvas.h
    MDIMiniMap.h
    MDIWidget.h
    Menu.h
    MenuBar.h
    MessageDialog.h
    OverlayLayout.h
    PieChart.h
    ProgressDialog.h
    PushButton.h
    RadioButton.h
    SliderPopup.h
    RecentFilesModel.h
    RowLayout.h
    SVGWidget.h
    ScreenshotTag.h
    ScrollArea.h
    ScrollBar.h
    ScrollWidget.h
    SearchBox.h
    Settings.h
    SettingsInline.h
    ShuttleWidget.h
    Spacer.h
    Splitter.h
    Splitter2D.h
    StackLayout.h
    Style.h
    SysLogModel.h
    TabBar.h
    TabWidget.h
    TextEdit.h
    TextEditModel.h
    ToolBar.h
    ToolButton.h
    Tooltip.h
    Util.h
    WidgetDump.h
    WidgetJson.h
    WidgetOptions.h
    Window.h)
set(PRIVATE_HEADERS
    BellowsPrivate.h
    ComboBoxPrivate.h
    FileBrowserPrivate.h
    ListItemsWidgetPrivate.h
    MenuBarPrivate.h
    MenuPrivate.h
    TabBarPrivate.h
    TextEditPrivate.h)

set(SOURCE
    Action.cpp
    ActionGroup.cpp
    Bellows.cpp
    BellowsButton.cpp
    ButtonGroup.cpp
    Capture.cpp
    CheckBox.cpp
    ChoiceDialog.cpp
    ClipboardSystem.cpp
    ColorDot.cpp
    ColorPopup.cpp
    ColorSlider.cpp
    ColorSwatch.cpp
    ColorWidget.cpp
    ColorWidgetSystem.cpp
    ComboBox.cpp
    ComboBoxButton.cpp
    ComboBoxMenu.cpp
    ConfirmDialog.cpp
    DiagWidget.cpp
    DialogSystem.cpp
    Divider.cpp
    DocumentModel.cpp
    DoubleEdit.cpp
    DoubleEditShuttle.cpp
    DoubleEditSlider.cpp
    DoubleModel.cpp
    DoubleSlider.cpp
    DrawUtil.cpp
    DrivesModel.cpp
    Event.cpp
    FileBrowser.cpp
    FileBrowserModel.cpp
    FileBrowserPanel.cpp
    FileBrowserPath.cpp
    FileBrowserSystem.cpp
    FileBrowserView.cpp
    FileBrowserWidget.cpp
    FileEdit.cpp
    FloatEdit.cpp
    FloatEditShuttle.cpp
    FloatEditSlider.cpp
    FloatModel.cpp
    FloatSlider.cpp
    FlowLayout.cpp
    FormLayout.cpp
    GraphWidget.cpp
    GridLayout.cpp
    GroupBox.cpp
    IButton.cpp
    IContainer.cpp
    IDialog.cpp
    InputDialog.cpp
    ItemButton.cpp
    ItemButtonList.cpp
    IMenuPopup.cpp
    IMouseWidget.cpp
    IPopup.cpp
    IWidget.cpp
    IWidgetPopup.cpp
    IWindow.cpp
    ImageWidget.cpp
    IncButtons.cpp
    IntEdit.cpp
    IntEditShuttle.cpp
    IntEditSlider.cpp
    IntModel.cpp
    IntSlider.cpp
    Icon.cpp
    IconSystem.cpp
    Init.cpp
    Label.cpp
    LayoutUtil.cpp
    LevelsSlider.cpp
    LineEdit.cpp
    LineEditModel.cpp
    ListItemButton.cpp
    ListItemsWidget.cpp
    ListWidget.cpp
    MDICanvas.cpp
    MDIMiniMap.cpp
    MDIWidget.cpp
    MainWindow.cpp
    Menu.cpp
    MenuBar.cpp
    MenuBarButton.cpp
    MenuButton.cpp
    MessageDialog.cpp
    OverlayLayout.cpp
    PieChart.cpp
    ProgressDialog.cpp
    PushButton.cpp
    RadioButton.cpp
    SliderPopup.cpp
    RecentFilesModel.cpp
    RowLayout.cpp
    SVGWidget.cpp
    ScrollArea.cpp
    ScrollBar.cpp
    ScrollWidget.cpp
    SearchBox.cpp
    Settings.cpp
    ShuttleWidget.cpp
    Spacer.cpp
    Splitter.cpp
    Splitter2D.cpp
    StackLayout.cpp
    Style.cpp
    SysLogModel.cpp
    TabBar.cpp
    TabBarButton.cpp
    TabWidget.cpp
    TextEdit.cpp
    TextEditModel.cpp
    TextEditWidget.cpp
    ToolBar.cpp
    ToolButton.cpp
    Tooltip.cpp
    Util.cpp
    WidgetDump.cpp
    WidgetJson.cpp
    WidgetOptions.cpp)
if ("${ftk_API}" STREQUAL "GL_4_1" OR
    "${ftk_API}" STREQUAL "GL_4_1_Debug" OR
    "${ftk_API}" STREQUAL "GLES_3")
    list(APPEND SOURCE
        AppGL.cpp
        WindowGL.cpp)
endif()

add_library(ftkUI ${HEADERS} ${PRIVATE_HEADERS} ${SOURCE})
# Private when building, so this library's own API is dllexport here and
# dllimport to everything else. Public when static, which a consumer does
# have to know: the API then carries no declspec at all.
if(BUILD_SHARED_LIBS)
    target_compile_definitions(ftkUI PRIVATE FTK_UI_EXPORTS)
else()
    target_compile_definitions(ftkUI PUBLIC FTK_UI_STATIC)
endif()

if(ftk_nfd)
    target_compile_definitions(ftkUI PUBLIC FTK_NFD)
endif()

target_include_directories(ftkUI
    PUBLIC
        $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/lib>
        $<INSTALL_INTERFACE:include>)

if ("${ftk_API}" STREQUAL "GL_4_1" OR
    "${ftk_API}" STREQUAL "GL_4_1_Debug" OR
    "${ftk_API}" STREQUAL "GLES_3")
    target_link_libraries(ftkUI PUBLIC ftkGL)
endif()
target_link_libraries(ftkUI PUBLIC ftkCore PRIVATE lunasvg::lunasvg)
if(ftk_nfd)
    target_link_libraries(ftkUI PRIVATE nfd::nfd)
    if(APPLE)
        target_link_libraries(ftkUI PUBLIC "-framework UniformTypeIdentifiers")
    endif()
endif()

set_target_properties(ftkUI PROPERTIES FOLDER lib)
set_target_properties(ftkUI PROPERTIES PUBLIC_HEADER "${HEADERS}")

install(
    TARGETS ftkUI
    EXPORT ftkUITargets
    ARCHIVE DESTINATION lib COMPONENT dev
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
    PUBLIC_HEADER DESTINATION include/ftk/UI COMPONENT dev)
install(
    EXPORT ftkUITargets
    FILE ftkUITargets.cmake
    DESTINATION "lib/cmake/ftk"
    NAMESPACE ftk::
    COMPONENT dev)
