# --- Find modules

FIND_PACKAGE (
  Qt6
  COMPONENTS
    Core
    DBus
    Widgets
    Svg
    Network
  REQUIRED )
FIND_PACKAGE ( ALSA REQUIRED )

# TODO: FIND_PACKAGE
SET ( UDEV_LIBRARIES udev )


# --- Configure files

INCLUDE ( CheckIncludeFiles )
CONFIGURE_FILE (
  ${SHARED_SRC_DIR}/qastools_config.hpp.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/qastools_config.hpp )


# --- Sources

SET ( SRC_GUI
  ${SHARED_SRC_DIR}/qsnd/alsa.cpp
  ${SHARED_SRC_DIR}/qsnd/event_types.cpp
  ${SHARED_SRC_DIR}/qsnd/ctl_address_argument.cpp
  ${SHARED_SRC_DIR}/qsnd/ctl_address.cpp
  ${SHARED_SRC_DIR}/qsnd/cards_db.cpp
  ${SHARED_SRC_DIR}/qsnd/cards_model.cpp
  ${SHARED_SRC_DIR}/qsnd/card_info.cpp
  ${SHARED_SRC_DIR}/qsnd/mixer/mixer.cpp
  ${SHARED_SRC_DIR}/qsnd/mixer/elem.cpp
  ${SHARED_SRC_DIR}/qsnd/mixer/filter.cpp
  ${SHARED_SRC_DIR}/qsnd/mixer/filters/first_playback_volume.cpp
  ${SHARED_SRC_DIR}/qsnd/mixers_model.cpp
  ${SHARED_SRC_DIR}/qsnd/udev_device_lookout.cpp

  ${SHARED_SRC_DIR}/dpe/image.cpp
  ${SHARED_SRC_DIR}/dpe/image_set_meta.cpp
  ${SHARED_SRC_DIR}/dpe/image_set.cpp
  ${SHARED_SRC_DIR}/dpe/image_set_group.cpp
  ${SHARED_SRC_DIR}/dpe/image_set_state.cpp
  ${SHARED_SRC_DIR}/dpe/image_request.cpp
  ${SHARED_SRC_DIR}/dpe/image_allocator.cpp
  ${SHARED_SRC_DIR}/dpe/is_buffer_handle.cpp
  ${SHARED_SRC_DIR}/dpe/is_buffer.cpp
  ${SHARED_SRC_DIR}/dpe/paint_job.cpp
  ${SHARED_SRC_DIR}/dpe/painter.cpp
  ${SHARED_SRC_DIR}/dpe/painter_simple.cpp
  ${SHARED_SRC_DIR}/dpe/painter_thread.cpp
  ${SHARED_SRC_DIR}/dpe/painter_thread_shared.cpp

  ${SHARED_SRC_DIR}/wdg/label_elide.cpp
  ${SHARED_SRC_DIR}/wdg/label_styled.cpp
  ${SHARED_SRC_DIR}/wdg/label_width.cpp
  ${SHARED_SRC_DIR}/wdg/text_browser.cpp
  ${SHARED_SRC_DIR}/wdg/scroll_area_horizontal.cpp
  ${SHARED_SRC_DIR}/wdg/scroll_area_vertical.cpp
  ${SHARED_SRC_DIR}/wdg/color_methods.cpp
  ${SHARED_SRC_DIR}/wdg/ds/imaging.cpp
  ${SHARED_SRC_DIR}/wdg/ds/painter/slider_bevelled.cpp
  ${SHARED_SRC_DIR}/wdg/ds/painter/switch_circle.cpp
  ${SHARED_SRC_DIR}/wdg/ds/painter/switch_svg.cpp
  ${SHARED_SRC_DIR}/wdg/ds/slider.cpp
  ${SHARED_SRC_DIR}/wdg/ds/slider_meta_bg.cpp
  ${SHARED_SRC_DIR}/wdg/ds/switch.cpp
  ${SHARED_SRC_DIR}/wdg/cubic_curve.cpp
  ${SHARED_SRC_DIR}/wdg/event_types.cpp
  ${SHARED_SRC_DIR}/wdg/pass_events.cpp
  ${SHARED_SRC_DIR}/wdg/pad_focus_info.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/proxy.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/style.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/slider.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/switch.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/enum.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/column.cpp
  ${SHARED_SRC_DIR}/wdg/pad_proxy/group.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/equal_columns/column.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/equal_columns/group.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/equal_columns/index.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/equal_columns/layout.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/equal_columns/row.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/equal_columns/weights.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/layout.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/style.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/data.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/data_column.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/data_group.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/header_data.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/header_label.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/header.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/footer.cpp
  ${SHARED_SRC_DIR}/wdg/sliders_pad/pad.cpp
  ${SHARED_SRC_DIR}/wdg/switches_pad/fill_columns/item.cpp
  ${SHARED_SRC_DIR}/wdg/switches_pad/fill_columns/layout.cpp
  ${SHARED_SRC_DIR}/wdg/switches_pad/widgets_group.cpp
  ${SHARED_SRC_DIR}/wdg/switches_pad/widgets_set.cpp
  ${SHARED_SRC_DIR}/wdg/switches_pad/pad.cpp
  ${SHARED_SRC_DIR}/wdg/switches_pad/scroll_area.cpp
  ${SHARED_SRC_DIR}/wdg/uint_mapper.cpp
  ${SHARED_SRC_DIR}/wdg/style_db.cpp

  ${SHARED_SRC_DIR}/mwdg/event_types.cpp
  ${SHARED_SRC_DIR}/mwdg/inputs_setup.cpp
  ${SHARED_SRC_DIR}/mwdg/mixer_device_setup.cpp
  ${SHARED_SRC_DIR}/mwdg/mixer_style_db.cpp
  ${SHARED_SRC_DIR}/mwdg/mixers_delegate.cpp
  ${SHARED_SRC_DIR}/mwdg/mixers_view.cpp
  ${SHARED_SRC_DIR}/mwdg/slider_status_widget.cpp
  ${SHARED_SRC_DIR}/mwdg/user_device_input.cpp

  ${SHARED_SRC_DIR}/views/view_utility.cpp
  ${SHARED_SRC_DIR}/views/message_widget.cpp
  ${SHARED_SRC_DIR}/views/view_base_setup.cpp
  ${SHARED_SRC_DIR}/views/view_base.cpp
  ${SHARED_SRC_DIR}/views/device_selection_view_setup.cpp
  ${SHARED_SRC_DIR}/views/device_selection_view.cpp
  ${SHARED_SRC_DIR}/views/basic_dialog.cpp
  ${SHARED_SRC_DIR}/views/multi_page_dialog.cpp
  ${SHARED_SRC_DIR}/views/info_dialog.cpp

  ${SHARED_SRC_DIR}/unix_signal_handler.cpp
  ${SHARED_SRC_DIR}/single_application.cpp
  ${SHARED_SRC_DIR}/license_texts.cpp

  mstate/mixer/controls.cpp
  mstate/mixer/state.cpp
  mstate/mixer/states_db.cpp

  mwdg/mixer/proxy/column.cpp
  mwdg/mixer/proxy/group.cpp
  mwdg/mixer/proxies_model.cpp
  mwdg/mixer/proxies_settings_model.cpp
  mwdg/mixer/proxy_identifier.cpp
  mwdg/mixer/setup.cpp
  mwdg/mixer/sliders/mixer.cpp
  mwdg/mixer/sliders/proxies_model.cpp
  mwdg/mixer/sliders/proxy/column.cpp
  mwdg/mixer/sliders/proxy/group.cpp
  mwdg/mixer/sliders/proxy/slider.cpp
  mwdg/mixer/sliders/proxy/switch.cpp
  mwdg/mixer/sliders/status_widget.cpp
  mwdg/mixer/switches/mixer.cpp
  mwdg/mixer/switches/proxies_model.cpp
  mwdg/mixer/switches/proxy/column.cpp
  mwdg/mixer/switches/proxy/group.cpp
  mwdg/mixer/switches/proxy/enum.cpp
  mwdg/mixer/switches/proxy/switch.cpp
  mwdg/stream_view_selection.cpp
  mwdg/stream_view_selection_actions.cpp

  views/device_settings_dialog.cpp
  views/device_settings_dialog_setup.cpp
  views/device_selection_bar.cpp
  views/mixer_setup.cpp
  views/mixer.cpp
  views/settings_dialog_setup.cpp
  views/settings_dialog.cpp

  tray/icon.cpp
  tray/mixer.cpp
  tray/mixer_dev_setup.cpp
  tray/notifier.cpp
  tray/shared.cpp
  tray/view_setup.cpp
  
  cmd_options.cpp
  main_window_setup.cpp
  main_window.cpp
  desktop_items_setup.cpp
  desktop_items.cpp

  init_globals.cpp
  info_texts.cpp
  main.cpp
)


# --- Compiler flags

SET ( CMAKE_CXX_STANDARD 17 )
SET ( CMAKE_CXX_STANDARD_REQUIRED ON )
SET ( CMAKE_CXX_EXTENSIONS OFF )
SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wunused -Wall" )
SET ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g -fno-inline" )
SET ( CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS_RELEASE}" )


# --- Include directories

INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR} )
INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_BINARY_DIR} )
INCLUDE_DIRECTORIES ( ${SHARED_INC_DIR} )
INCLUDE_DIRECTORIES ( ${ALSA_INCLUDE_DIRS} )


# --- Executable

ADD_EXECUTABLE ( ${PROGRAM_NAME}
  ${SRC_GUI}
)
SET_TARGET_PROPERTIES ( ${PROGRAM_NAME} PROPERTIES AUTOMOC ON )
TARGET_LINK_LIBRARIES ( ${PROGRAM_NAME}
  Qt6::DBus
  Qt6::Widgets
  Qt6::Svg
  Qt6::Network
  ${ALSA_LIBRARIES}
  ${UDEV_LIBRARIES}
)


# --- Installation

INSTALL (
  TARGETS ${PROGRAM_NAME} RUNTIME
  DESTINATION ${INSTALL_DIR_BIN} )
