chore(cpn): upgrade to Ubuntu 22.04 and Qt 6.9.0 (#5986)
Co-authored-by: elecpower <elecpower@users.noreply.github.com> Co-authored-by: raphaelcoeffic <1050031+raphaelcoeffic@users.noreply.github.com>
@@ -2,7 +2,7 @@
|
||||
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/cpp
|
||||
{
|
||||
"name": "edgetx-dev",
|
||||
"image": "ghcr.io/edgetx/edgetx-dev:latest",
|
||||
"image": "ghcr.io/edgetx/edgetx-dev:pr-24",
|
||||
"runArgs": [ "--ipc=host"],
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
|
||||
@@ -24,7 +24,7 @@ on:
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: Release
|
||||
QT_VERSION: "5.15.2"
|
||||
QT_VERSION: "6.9.0"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -61,6 +61,7 @@ jobs:
|
||||
AQT_CONFIG: ${{ github.workspace }}/tools/aqt-settings.ini
|
||||
with:
|
||||
version: ${{ env.QT_VERSION }}
|
||||
modules: 'qtmultimedia qtserialport'
|
||||
setup-python: 'false'
|
||||
cache: true
|
||||
cache-key-prefix: 'install-qt-action-macOS'
|
||||
|
||||
@@ -5,7 +5,7 @@ on:
|
||||
- cron: '0 2 * * *' # run at 2 AM UTC
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
concurrency:
|
||||
group: 'nightly'
|
||||
cancel-in-progress: true
|
||||
|
||||
|
||||
@@ -25,9 +25,9 @@ env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: Release
|
||||
CMAKE_GENERATOR: "MSYS Makefiles"
|
||||
QT_VERSION: "5.15.2"
|
||||
MINGW_VERSION: "win64_mingw81"
|
||||
MINGW_PATH: "mingw81_64"
|
||||
QT_VERSION: "6.9.0"
|
||||
MINGW_VERSION: "win64_mingw"
|
||||
MINGW_PATH: "mingw_64"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -83,6 +83,7 @@ jobs:
|
||||
cache-key-prefix: 'install-qt-action-win64'
|
||||
version: ${{ env.QT_VERSION }}
|
||||
arch: ${{ env.MINGW_VERSION }}
|
||||
modules: 'qtmultimedia qtserialport'
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{github.workspace}}
|
||||
|
||||
@@ -142,7 +142,7 @@ if(NATIVE_BUILD)
|
||||
include(NativeTargets)
|
||||
else()
|
||||
# Prevent CMake warnings
|
||||
set(IGNORE "${SDL2_LIBRARY_PATH}" "${LIBSSL1_ROOT_DIR}" "${OPENSSL_ROOT_DIR}")
|
||||
set(IGNORE "${SDL2_LIBRARY_PATH}" "${LIBUSB1_ROOT_DIR}" "${OPENSSL_ROOT_DIR}")
|
||||
endif()
|
||||
|
||||
add_subdirectory(${RADIO_SRC_DIR})
|
||||
|
||||
@@ -5,7 +5,7 @@ include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
maxLibQt
|
||||
GIT_REPOSITORY https://github.com/edgetx/maxLibQt
|
||||
GIT_TAG ac1988ffd005cd15a8449b92150ce6c08574a4f1
|
||||
GIT_TAG 6dfbfc41e258cd2446e1fd1f547e6c5d742aa2c0
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(maxLibQt)
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# - try to find libssl-1 library
|
||||
|
||||
if (DEFINED ENV{LIBSSL1_ROOT_DIR})
|
||||
set(LIBSSL1_ROOT_DIR "$ENV{LIBSSL1_ROOT_DIR}")
|
||||
endif()
|
||||
|
||||
find_library(LIBSSL1_LIBRARY
|
||||
NAMES
|
||||
libssl.so.1.1
|
||||
libssl-1_1.dll
|
||||
libssl-1_1.dylib
|
||||
HINTS
|
||||
"${LIBSSL1_ROOT_DIR}")
|
||||
|
||||
get_filename_component(LIBSSL1_LIBRARY_PATH ${LIBSSL1_LIBRARY} PATH)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(LIBSSL1
|
||||
DEFAULT_MSG
|
||||
LIBSSL1_LIBRARY_PATH)
|
||||
|
||||
if(LIBSSL1_FOUND)
|
||||
set(LIBSSL1_LIBRARY_DIR "${LIBSSL1_LIBRARY_PATH}")
|
||||
mark_as_advanced(LIBSSL1_ROOT_DIR)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBSSL1_LIBRARY_PATH)
|
||||
@@ -16,16 +16,9 @@ find_library(LIBUSB1_LIBRARY
|
||||
HINTS
|
||||
"${LIBUSB1_ROOT_DIR}")
|
||||
|
||||
get_filename_component(LIBUSB1_LIBRARY_PATH ${LIBUSB1_LIBRARY} PATH)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(LIBUSB1
|
||||
DEFAULT_MSG
|
||||
LIBUSB1_LIBRARY_PATH)
|
||||
LIBUSB1_LIBRARY)
|
||||
|
||||
if(LIBUSB1_FOUND)
|
||||
set(LIBUSB1_LIBRARY_DIR "${LIBUSB1_LIBRARY_PATH}")
|
||||
mark_as_advanced(LIBUSB1_ROOT_DIR)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBUSB1_LIBRARY_PATH)
|
||||
mark_as_advanced(LIBUSB1_LIBRARY)
|
||||
|
||||
@@ -24,19 +24,20 @@ else()
|
||||
message(STATUS "SDL not found! Simulator audio, and joystick inputs, will not work.")
|
||||
endif()
|
||||
|
||||
if(Qt5Core_FOUND AND NOT DISABLE_COMPANION)
|
||||
if(Qt6Core_FOUND AND NOT DISABLE_COMPANION)
|
||||
# environment variable set in github workflows and build-edgetx Dockerfile
|
||||
if(DEFINED ENV{LIBUSB1_ROOT_DIR})
|
||||
set(LIBUSB1_ROOT_DIR "$ENV{LIBUSB1_ROOT_DIR}")
|
||||
endif()
|
||||
|
||||
find_package(Libusb1)
|
||||
|
||||
if(LIBUSB1_FOUND)
|
||||
find_package(Dfuutil)
|
||||
endif()
|
||||
|
||||
if(LINUX)
|
||||
find_package(Libssl1)
|
||||
endif()
|
||||
|
||||
# OpenSSL
|
||||
# environment variable set in github workflows and build-edgetx Dockerfile
|
||||
if (DEFINED ENV{OPENSSL_ROOT_DIR})
|
||||
if(DEFINED ENV{OPENSSL_ROOT_DIR})
|
||||
set(OPENSSL_ROOT_DIR "$ENV{OPENSSL_ROOT_DIR}")
|
||||
endif()
|
||||
|
||||
@@ -61,7 +62,7 @@ add_custom_target(tests-radio
|
||||
DEPENDS gtests-radio
|
||||
)
|
||||
|
||||
if(Qt5Core_FOUND AND NOT DISABLE_COMPANION)
|
||||
if(Qt6Core_FOUND AND NOT DISABLE_COMPANION)
|
||||
add_subdirectory(${COMPANION_SRC_DIRECTORY})
|
||||
add_custom_target(tests-companion
|
||||
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-companion
|
||||
|
||||
@@ -1,29 +1,27 @@
|
||||
if(APPLE AND DEFINED ENV{HOMEBREW_PREFIX} AND EXISTS $ENV{HOMEBREW_PREFIX}/opt/qt@5)
|
||||
if(APPLE AND DEFINED ENV{HOMEBREW_PREFIX})
|
||||
# If Homebrew is used, HOMEBREW_PREFIX should be defined
|
||||
list(APPEND CMAKE_PREFIX_PATH "$ENV{HOMEBREW_PREFIX}/opt/qt@5")
|
||||
if(EXISTS $ENV{HOMEBREW_PREFIX}/opt/qt@6)
|
||||
list(APPEND CMAKE_PREFIX_PATH "$ENV{HOMEBREW_PREFIX}/opt/qt@6")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core)
|
||||
|
||||
find_package(Qt5Core QUIET)
|
||||
find_package(Qt5Widgets QUIET)
|
||||
find_package(Qt5Xml QUIET)
|
||||
find_package(Qt5LinguistTools QUIET)
|
||||
find_package(Qt5PrintSupport QUIET)
|
||||
find_package(Qt5Multimedia QUIET)
|
||||
find_package(Qt5Svg QUIET)
|
||||
find_package(Qt5SerialPort QUIET)
|
||||
if(Qt6_FOUND)
|
||||
message(STATUS "Qt Version: ${Qt6_VERSION}")
|
||||
|
||||
if(Qt5Core_FOUND)
|
||||
message(STATUS "Qt Version: ${Qt5Core_VERSION}")
|
||||
# call after Qt6Core package is found
|
||||
qt_standard_project_setup()
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Widgets LinguistTools Multimedia PrintSupport SerialPort Svg Xml)
|
||||
|
||||
### Get locations of Qt binary executables & libs (libs are for distros, not for linking)
|
||||
# first set up some hints
|
||||
get_target_property(QtCore_LOCATION Qt5::Core LOCATION)
|
||||
get_filename_component(qt_core_path ${QtCore_LOCATION} PATH)
|
||||
get_target_property(QtCore_LOCATION Qt::Core LOCATION)
|
||||
cmake_path(GET QtCore_LOCATION ROOT_PATH qt_core_path)
|
||||
if(APPLE)
|
||||
get_filename_component(qt_core_path "${qt_core_path}/.." ABSOLUTE)
|
||||
set(qt_core_path "${qt_core_path}/..")
|
||||
cmake_path(ABSOLUTE_PATH qt_core_path OUTPUT_VARIABLE qt_core_path)
|
||||
endif()
|
||||
|
||||
set(QT_LIB_DIR ${qt_core_path} CACHE PATH "Path to Qt libraries (.dll|.framework|.so).")
|
||||
@@ -63,5 +61,5 @@ if(Qt5Core_FOUND)
|
||||
list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_ENABLE=0)
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "Qt not found! Companion and Simulator builds disabled.")
|
||||
message(WARNING "Required Qt version not found! Companion, Simulator and libsim builds disabled.")
|
||||
endif()
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
set(SIMULATOR_INSTALL_PREFIX "" CACHE STRING "Alternative simulator library search path")
|
||||
|
||||
set(COMPANION_NAME "companion")
|
||||
set(SIMULATOR_NAME "simulator")
|
||||
set(APP_NAME_SUFFIX "")
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "(Linux|FreeBSD)")
|
||||
set(APP_NAME_SUFFIX ${VERSION_MAJOR}${VERSION_MINOR})
|
||||
set(COMPANION_NAME "companion${APP_NAME_SUFFIX}")
|
||||
set(SIMULATOR_NAME "simulator${APP_NAME_SUFFIX}")
|
||||
set(APP_NAME_SUFFIX "${VERSION_MAJOR}${VERSION_MINOR}")
|
||||
set(COMPANION_NAME "${COMPANION_NAME}${APP_NAME_SUFFIX}")
|
||||
set(SIMULATOR_NAME "${SIMULATOR_NAME}${APP_NAME_SUFFIX}")
|
||||
# by default cmake sets CMAKE_INSTALL_PREFIX to /usr/local however linuxdeploy works best with '/usr' as base directory
|
||||
if (${CMAKE_INSTALL_PREFIX} MATCHES "/usr/local")
|
||||
set(CMAKE_INSTALL_PREFIX "/usr")
|
||||
@@ -14,21 +18,14 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "(Linux|FreeBSD)")
|
||||
set(SIMULATOR_LIB_PATH "../lib/${COMPANION_NAME}")
|
||||
endif()
|
||||
message(STATUS "Simulators library search path: " ${SIMULATOR_LIB_PATH})
|
||||
else()
|
||||
set(COMPANION_NAME "companion")
|
||||
set(SIMULATOR_NAME "simulator")
|
||||
endif()
|
||||
|
||||
# This the name that the user will see in the generated DMG and what the application
|
||||
# will be called under /Applications. We include the version string to make installing
|
||||
# different versions for different eeproms easier, i.e. without manually renaming
|
||||
set(COMPANION_OSX_APP_BUNDLE_NAME "EdgeTX Companion ${VERSION_MAJOR}.${VERSION_MINOR}")
|
||||
|
||||
option(DEBUG_STORAGE_IMPORT "Turn on debug output for storage import") # Disabled by default
|
||||
if(DEBUG_STORAGE_IMPORT)
|
||||
add_definitions(-DDEBUG_STORAGE_IMPORT)
|
||||
message(STATUS "Storage import debugging enabled")
|
||||
endif()
|
||||
|
||||
if(DEBUG)
|
||||
add_definitions(-DDEBUG)
|
||||
endif()
|
||||
@@ -93,8 +90,6 @@ include_directories(
|
||||
############# Do macro replacements on input files #############
|
||||
|
||||
configure_file(${COMPANION_SRC_DIRECTORY}/version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY)
|
||||
configure_file(${COMPANION_SRC_DIRECTORY}/companion.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/companion.desktop @ONLY)
|
||||
configure_file(${COMPANION_SRC_DIRECTORY}/simulator.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/simulator.desktop @ONLY)
|
||||
|
||||
############# Translations ###############
|
||||
|
||||
@@ -106,7 +101,7 @@ foreach(language ${LANGUAGES})
|
||||
list(APPEND companion_TS translations/companion_${language}.ts)
|
||||
endforeach(language)
|
||||
# .ts -> .qm
|
||||
qt5_add_translation(companion_QM ${companion_TS})
|
||||
qt_add_translation(companion_QM ${companion_TS})
|
||||
|
||||
# add Qt translations if found
|
||||
if(QT_TRANSLATIONS_DIR)
|
||||
@@ -139,20 +134,20 @@ else()
|
||||
endif()
|
||||
|
||||
############# Import radio hardware definitions ###############
|
||||
|
||||
set(HWDEFS_DIR "${CMAKE_CURRENT_BINARY_DIR}/../../radio/src")
|
||||
set(HWDEFS_TMPL "${COMPANION_SRC_DIRECTORY}/hwdefs.qrc.in")
|
||||
set(HWDEFS_PHDR "HWDEF_JSON_LIST")
|
||||
set(HWDEFS_QRC "${CMAKE_CURRENT_BINARY_DIR}/hwdefs.qrc")
|
||||
set(HWDEFS_CMD "${COMPANION_SRC_DIRECTORY}/../util/generate_hwdefs_qrc.py")
|
||||
|
||||
# qrc used by Companion and Simulator
|
||||
add_custom_command(OUTPUT ${HWDEFS_QRC}
|
||||
COMMAND ${HWDEFS_CMD} -d ${HWDEFS_DIR}
|
||||
-t ${HWDEFS_TMPL}
|
||||
-p ${HWDEFS_PHDR}
|
||||
-o ${HWDEFS_QRC}
|
||||
DEPENDS ${HWDEFS_TMPL}
|
||||
)
|
||||
)
|
||||
|
||||
############# Common lib ###############
|
||||
|
||||
@@ -175,8 +170,8 @@ set(common_RESOURCES
|
||||
${HWDEFS_QRC}
|
||||
)
|
||||
|
||||
qt5_wrap_cpp(common_SRCS ${common_MOC_HDRS})
|
||||
qt5_add_resources(common_RCC ${common_RESOURCES})
|
||||
qt_wrap_cpp(common_SRCS ${common_MOC_HDRS})
|
||||
qt_add_resources(common_RCC ${common_RESOURCES})
|
||||
|
||||
add_library(common ${common_SRCS} ${common_RCC})
|
||||
|
||||
@@ -187,10 +182,10 @@ target_link_libraries(common
|
||||
simulation
|
||||
storage
|
||||
maxLibQt
|
||||
Qt5::Core
|
||||
Qt5::Xml
|
||||
Qt5::Widgets
|
||||
Qt5::SerialPort
|
||||
Qt::Core
|
||||
Qt::Xml
|
||||
Qt::Widgets
|
||||
Qt::SerialPort
|
||||
${SDL2_LIBRARIES}
|
||||
${WIN_LINK_LIBRARIES}
|
||||
)
|
||||
@@ -201,7 +196,6 @@ set(CPN_COMMON_LIB common)
|
||||
|
||||
include(FetchMiniz)
|
||||
include(FetchYamlCpp)
|
||||
|
||||
include(FetchMaxLibQt)
|
||||
|
||||
add_subdirectory(datamodels)
|
||||
@@ -274,8 +268,10 @@ if(WIN32)
|
||||
set(icon_RC images/winicons/icon.rc)
|
||||
endif()
|
||||
|
||||
add_executable(${COMPANION_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${companion_SRCS} ${companion_HDRS} ${icon_RC})
|
||||
target_link_libraries(${COMPANION_NAME} PRIVATE ${CPN_COMMON_LIB} generaledit modeledit qcustomplot miniz updates)
|
||||
add_executable(${COMPANION_NAME}
|
||||
MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${companion_SRCS} ${companion_HDRS} ${icon_RC})
|
||||
target_link_libraries(${COMPANION_NAME}
|
||||
PRIVATE ${CPN_COMMON_LIB} generaledit modeledit qcustomplot miniz updates)
|
||||
|
||||
PrintTargetReport("${COMPANION_NAME}")
|
||||
|
||||
@@ -283,8 +279,10 @@ PrintTargetReport("${COMPANION_NAME}")
|
||||
|
||||
set(simu_SRCS simulator.cpp )
|
||||
|
||||
add_executable(${SIMULATOR_NAME} MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${simu_SRCS} ${icon_RC})
|
||||
target_link_libraries(${SIMULATOR_NAME} PRIVATE ${CPN_COMMON_LIB})
|
||||
add_executable(${SIMULATOR_NAME}
|
||||
MACOSX_BUNDLE ${WIN_EXECUTABLE_TYPE} ${simu_SRCS} ${icon_RC})
|
||||
target_link_libraries(${SIMULATOR_NAME}
|
||||
PRIVATE ${CPN_COMMON_LIB})
|
||||
|
||||
add_subdirectory(tests)
|
||||
|
||||
@@ -292,317 +290,337 @@ add_subdirectory(tests)
|
||||
|
||||
# the current flavour is not automatically added if build in the current cmake iteration, so always
|
||||
# add its library name to be sure
|
||||
if(PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS)
|
||||
set(FLAVOUR x7access)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
|
||||
set(FLAVOUR t12)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TLITE)
|
||||
set(FLAVOUR tlite)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TLITEF4)
|
||||
set(FLAVOUR tlitef4)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TPRO)
|
||||
set(FLAVOUR tpro)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TPROV2)
|
||||
set(FLAVOUR tprov2)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TPROS)
|
||||
set(FLAVOUR tpros)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL BUMBLEBEE)
|
||||
set(FLAVOUR bumblebee)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T20)
|
||||
set(FLAVOUR t20)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T20V2)
|
||||
set(FLAVOUR t20v2)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
|
||||
set(FLAVOUR tx12)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12MK2)
|
||||
set(FLAVOUR tx12mk2)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL ZORRO)
|
||||
set(FLAVOUR zorro)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL BOXER)
|
||||
set(FLAVOUR boxer)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL GX12)
|
||||
set(FLAVOUR gx12)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL POCKET)
|
||||
set(FLAVOUR pocket)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL LR3PRO)
|
||||
set(FLAVOUR lr3pro)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL COMMANDO8)
|
||||
set(FLAVOUR commando8)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T8)
|
||||
set(FLAVOUR t8)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL MT12)
|
||||
set(FLAVOUR mt12)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL V14)
|
||||
set(FLAVOUR v14)
|
||||
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
|
||||
set(FLAVOUR x9d+2019)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS)
|
||||
set(FLAVOUR x10express)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S)
|
||||
set(FLAVOUR tx16s)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL F16)
|
||||
set(FLAVOUR f16)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL V16)
|
||||
set(FLAVOUR v16)
|
||||
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T14)
|
||||
set(FLAVOUR t14)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T15)
|
||||
set(FLAVOUR t15)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T16)
|
||||
set(FLAVOUR t16)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T18)
|
||||
set(FLAVOUR t18)
|
||||
elseif(PCB STREQUAL PL18 AND PCBREV STREQUAL EL18)
|
||||
set(FLAVOUR el18)
|
||||
elseif(PCB STREQUAL PL18 AND PCBREV STREQUAL PL18EV)
|
||||
set(FLAVOUR pl18ev)
|
||||
elseif(PCB STREQUAL PL18 AND PCBREV STREQUAL PL18U)
|
||||
set(FLAVOUR pl18u)
|
||||
elseif(PCB STREQUAL PL18)
|
||||
set(FLAVOUR pl18)
|
||||
elseif(PCB STREQUAL ST16)
|
||||
set(FLAVOR st16)
|
||||
else()
|
||||
string(TOLOWER ${PCB} FLAVOUR)
|
||||
string(TOLOWER ${PCB} FLAVOUR)
|
||||
|
||||
if(PCBREV)
|
||||
if(PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS)
|
||||
set(FLAVOUR x7access)
|
||||
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
|
||||
set(FLAVOUR x9d+2019)
|
||||
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS)
|
||||
set(FLAVOUR x10express)
|
||||
else()
|
||||
string(TOLOWER ${PCBREV} FLAVOUR)
|
||||
endif()
|
||||
endif(PCBREV)
|
||||
|
||||
set(COMPANION_TARGETS_DIR_ROOT "${COMPANION_SRC_DIRECTORY}/../targets")
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(COMPANION_TARGETS_DIR "${COMPANION_TARGETS_DIR_ROOT}/linux")
|
||||
elseif(APPLE)
|
||||
set(COMPANION_TARGETS_DIR "${COMPANION_TARGETS_DIR_ROOT}/mac")
|
||||
elseif(WIN32)
|
||||
set(COMPANION_TARGETS_DIR "${COMPANION_TARGETS_DIR_ROOT}/windows")
|
||||
endif()
|
||||
|
||||
include(FindDfuutil)
|
||||
include(FindLibusb1)
|
||||
include(FindOpenSSL)
|
||||
# updated license file
|
||||
set(LICENSE_FILE "${CMAKE_CURRENT_BINARY_DIR}/license.txt")
|
||||
configure_file("${COMPANION_TARGETS_DIR_ROOT}/license.txt.in" ${LICENSE_FILE} @ONLY)
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
message(STATUS "install " ${CMAKE_BINARY_DIR} " to " ${CMAKE_INSTALL_PREFIX})
|
||||
install(TARGETS ${COMPANION_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
|
||||
install(TARGETS ${SIMULATOR_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/plugins/ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${COMPANION_NAME})
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/companion.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications RENAME companion${APP_NAME_SUFFIX}.desktop)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/simulator.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications RENAME simulator${APP_NAME_SUFFIX}.desktop)
|
||||
install(FILES images/linuxicons/16x16/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/22x22/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/22x22/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/24x24/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/24x24/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/32x32/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/48x48/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/128x128/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/128x128/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/256x256/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/512x512/companion.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/512x512/apps RENAME companion${APP_NAME_SUFFIX}.png)
|
||||
install(FILES images/linuxicons/scalable/companion.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps RENAME companion${APP_NAME_SUFFIX}.svg)
|
||||
install(FILES ../targets/linux/45-companion-taranis.rules DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/udev/rules.d RENAME 45-companion${APP_NAME_SUFFIX}-taranis.rules)
|
||||
install(FILES ../targets/linux/45-usbasp.rules DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/udev/rules.d RENAME 45-companion${APP_NAME_SUFFIX}-usbasp.rules)
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
message(STATUS "Install " ${CMAKE_BINARY_DIR} " to " ${CMAKE_INSTALL_PREFIX})
|
||||
install(TARGETS ${COMPANION_NAME}
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})
|
||||
install(TARGETS ${SIMULATOR_NAME}
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
if(LIBSSL1_FOUND)
|
||||
install(DIRECTORY ${LIBSSL1_LIBRARY_DIR}/ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib FILES_MATCHING PATTERN "libcrypto.so.*" PATTERN "libssl.so.*")
|
||||
# configure and set variables used by package script
|
||||
set(COMPANION_DESKTOP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${COMPANION_NAME}.desktop)
|
||||
configure_file(${COMPANION_TARGETS_DIR}/companion.desktop.in ${COMPANION_DESKTOP_FILE} @ONLY)
|
||||
|
||||
set(SIMULATOR_DESKTOP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SIMULATOR_NAME}.desktop)
|
||||
configure_file(${COMPANION_TARGETS_DIR}/simulator.desktop.in ${SIMULATOR_DESKTOP_FILE} @ONLY)
|
||||
|
||||
# libsim*.so files
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/plugins/
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${COMPANION_NAME})
|
||||
|
||||
# application icons
|
||||
set(icon_sizes "16;22;24;32;48;64;128;256;512")
|
||||
foreach(icon_size ${icon_sizes})
|
||||
install(FILES "images/linuxicons/${icon_size}x${icon_size}/companion.png"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/${icon_size}x${icon_size}/apps"
|
||||
RENAME "${COMPANION_NAME}.png")
|
||||
endforeach()
|
||||
|
||||
unset(icon_size)
|
||||
unset(icon_sizes)
|
||||
|
||||
install(FILES "images/linuxicons/scalable/companion.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps"
|
||||
RENAME "${COMPANION_NAME}.svg")
|
||||
|
||||
# udev rules
|
||||
install(FILES "${COMPANION_TARGETS_DIR}/45-companion-taranis.rules"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/udev/rules.d"
|
||||
RENAME "45-${COMPANION_NAME}-taranis.rules")
|
||||
|
||||
install(FILES "${COMPANION_TARGETS_DIR}/45-usbasp.rules"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/udev/rules.d"
|
||||
RENAME "45-${COMPANION_NAME}-usbasp.rules")
|
||||
|
||||
if(OPENSSL_FOUND)
|
||||
get_filename_component(OPENSSL_SSL_LIBRARY_DIR ${OPENSSL_SSL_LIBRARY} DIRECTORY)
|
||||
install(DIRECTORY ${OPENSSL_SSL_LIBRARY_DIR}/
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
|
||||
FILES_MATCHING
|
||||
PATTERN "libcrypto.so.*"
|
||||
PATTERN "libssl.so.*")
|
||||
endif()
|
||||
|
||||
if(LIBUSB1_FOUND)
|
||||
install(DIRECTORY ${LIBUSB1_LIBRARY_DIR}/ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib FILES_MATCHING PATTERN "libusb-1.0.so*")
|
||||
get_filename_component(LIBUSB1_LIBRARY_DIR ${LIBUSB1_LIBRARY} DIRECTORY)
|
||||
install(DIRECTORY ${LIBUSB1_LIBRARY_DIR}/
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
|
||||
FILES_MATCHING PATTERN "libusb-1.0.so.*")
|
||||
if(DFU_UTIL_FOUND)
|
||||
install(FILES "${DFU_UTIL_PATH}" DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
|
||||
# dfuutil is an app
|
||||
install(FILES "${DFU_UTIL_PATH}"
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Linux specific code
|
||||
set(OperatingSystem "Linux")
|
||||
# Shortcut target
|
||||
add_custom_target(companion DEPENDS ${COMPANION_NAME})
|
||||
add_custom_target(simulator DEPENDS ${SIMULATOR_NAME})
|
||||
|
||||
elseif(WIN32)
|
||||
set(INSTALL_DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_BUILD_TYPE}")
|
||||
message(STATUS "Install to " ${INSTALL_DESTINATION})
|
||||
# companion & simulator binaries
|
||||
install(TARGETS ${COMPANION_NAME} DESTINATION ${INSTALL_DESTINATION})
|
||||
install(TARGETS ${SIMULATOR_NAME} DESTINATION ${INSTALL_DESTINATION})
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/plugins/ DESTINATION ${INSTALL_DESTINATION})
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/_install")
|
||||
message(STATUS "Install to " ${CMAKE_INSTALL_PREFIX})
|
||||
|
||||
# companion and simulator apps
|
||||
install(TARGETS
|
||||
${COMPANION_NAME}
|
||||
${SIMULATOR_NAME}
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
# install libsim dlls into same directory as apps
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/plugins/
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}
|
||||
COMPONENT Runtime)
|
||||
|
||||
install(FILES ${LICENSE_FILE}
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
# supporting utilities
|
||||
if(LIBUSB1_FOUND)
|
||||
cmake_path(GET LIBUSB1_LIBRARY
|
||||
PARENT_PATH
|
||||
LIBUSB1_LIBRARY_DIR)
|
||||
|
||||
if(MINGW)
|
||||
# finds dll.a directory but we need dlls but should check extension just to be sure and future proof
|
||||
set(LIBUSB1_LIBRARY_DIR "${LIBUSB1_LIBRARY_DIR}/../bin")
|
||||
endif()
|
||||
|
||||
set(LIBUSB1_LIBRARY_FILE "${LIBUSB1_LIBRARY_DIR}/libusb-1.0.dll")
|
||||
|
||||
if(EXISTS "${LIBUSB1_LIBRARY_FILE}")
|
||||
install(FILES "${LIBUSB1_LIBRARY_FILE}" DESTINATION ${INSTALL_DESTINATION})
|
||||
install(FILES "${LIBUSB1_LIBRARY_FILE}"
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}
|
||||
COMPONENT Runtime)
|
||||
endif()
|
||||
|
||||
if(DFU_UTIL_FOUND)
|
||||
install(FILES "${DFU_UTIL_PATH}" DESTINATION ${INSTALL_DESTINATION})
|
||||
install(FILES "${DFU_UTIL_PATH}"
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}
|
||||
COMPONENT Runtime)
|
||||
endif()
|
||||
endif()
|
||||
endif(LIBUSB1_FOUND)
|
||||
|
||||
if(OPENSSL_FOUND)
|
||||
if ((OPENSSL_VERSION VERSION_LESS "1.2.0" AND Qt5Core_VERSION VERSION_LESS "6.0.0") OR (OPENSSL_VERSION VERSION_GREATER "3.0.0" AND Qt5Core_VERSION VERSION_GREATER_EQUAL "6.0.0"))
|
||||
get_filename_component(OPENSSL_SSL_LIBRARY_DIR ${OPENSSL_SSL_LIBRARY} DIRECTORY)
|
||||
if(MINGW)
|
||||
# the dlls are stored in the bin directory
|
||||
set(OPENSSL_SSL_LIBRARY_DIR "${OPENSSL_SSL_LIBRARY_DIR}/../bin")
|
||||
endif()
|
||||
if(EXISTS "${OPENSSL_SSL_LIBRARY_DIR}")
|
||||
# install only files Qt networking requires
|
||||
install(DIRECTORY ${OPENSSL_SSL_LIBRARY_DIR}/ DESTINATION ${INSTALL_DESTINATION} FILES_MATCHING PATTERN "libcrypto-*.dll" PATTERN "libssl-*.dll")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
cmake_path(GET OPENSSL_SSL_LIBRARY
|
||||
PARENT_PATH
|
||||
OPENSSL_SSL_LIBRARY_DIR)
|
||||
|
||||
if(NOT OPENSSL_FOUND OR Qt5Core_VERSION VERSION_LESS "6.0.0")
|
||||
if(MINGW AND $ENV{MSYSTEM} STREQUAL "MINGW32")
|
||||
install(FILES "${COMPANION_SRC_DIRECTORY}/../targets/windows/libcrypto-1_1.dll" DESTINATION ${INSTALL_DESTINATION})
|
||||
install(FILES "${COMPANION_SRC_DIRECTORY}/../targets/windows/libssl-1_1.dll" DESTINATION ${INSTALL_DESTINATION})
|
||||
else()
|
||||
# MINGW64 or assume 64 bit native
|
||||
install(FILES "${COMPANION_SRC_DIRECTORY}/../targets/windows/libcrypto-1_1-x64.dll" DESTINATION ${INSTALL_DESTINATION})
|
||||
install(FILES "${COMPANION_SRC_DIRECTORY}/../targets/windows/libssl-1_1-x64.dll" DESTINATION ${INSTALL_DESTINATION})
|
||||
if(MINGW)
|
||||
# the dlls are stored in the bin directory
|
||||
set(OPENSSL_SSL_LIBRARY_DIR "${OPENSSL_SSL_LIBRARY_DIR}/../bin")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(LICENSE_FILE "${CMAKE_CURRENT_BINARY_DIR}/license.txt")
|
||||
configure_file("${COMPANION_SRC_DIRECTORY}/../targets/windows/license.txt.in" ${LICENSE_FILE} @ONLY)
|
||||
install(FILES "${LICENSE_FILE}" DESTINATION ${INSTALL_DESTINATION})
|
||||
if(EXISTS "${OPENSSL_SSL_LIBRARY_DIR}")
|
||||
install(DIRECTORY ${OPENSSL_SSL_LIBRARY_DIR}/
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}
|
||||
COMPONENT Runtime
|
||||
FILES_MATCHING
|
||||
PATTERN "libcrypto-*.dll"
|
||||
PATTERN "libssl-*.dll")
|
||||
|
||||
endif()
|
||||
endif(OPENSSL_FOUND)
|
||||
|
||||
if(SDL2_FOUND AND DEFINED SDL2_LIB_PATH)
|
||||
install(FILES "${SDL2_LIB_PATH}" DESTINATION ${INSTALL_DESTINATION})
|
||||
install(FILES "${SDL2_LIB_PATH}"
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}
|
||||
COMPONENT Runtime)
|
||||
endif()
|
||||
|
||||
# Qt dlls (using windeployqt)
|
||||
## Qt translations are already packaged into our custom qrc. Also don't need software rendering engines.
|
||||
set(wdqtopts --no-translations --no-opengl-sw --no-system-d3d-compiler --no-angle)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
#set(wdqtopts ${wdqtopts} --release) # release builds aren't always properly detected with mingw
|
||||
set(wdqtopts ${wdqtopts} --debug) # workaround for bug in Qt 5.15 windeployqt.exe
|
||||
endif()
|
||||
set(wdqtopts ${wdqtopts} -dir "\"${INSTALL_DESTINATION}\"" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${COMPANION_NAME}.exe" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${SIMULATOR_NAME}.exe")
|
||||
list(JOIN wdqtopts " " wdqtopts)
|
||||
elseif(APPLE)
|
||||
# Qt + Cmake + Mac is poorly documented. A lot of this is guesswork
|
||||
# and trial and error. Do not hesitate to fix it for the better
|
||||
set_target_properties(${COMPANION_NAME} PROPERTIES
|
||||
MACOSX_RPATH TRUE
|
||||
MACOSX_BUNDLE TRUE
|
||||
MACOSX_BUNDLE_INFO_PLIST ${COMPANION_TARGETS_DIR}/MacOSXBundleInfo.plist.in
|
||||
|
||||
# Add installer command to execute windeployqt
|
||||
message(STATUS "windeployqt command: ${QT_BIN_DIR}/windeployqt.exe ${wdqtopts}")
|
||||
endif() # WIN32 install
|
||||
INSTALL_RPATH "@executable_path/../Frameworks"
|
||||
BUILD_WITH_INSTALL_RPATH TRUE
|
||||
)
|
||||
|
||||
# This the name that the user will see in the generated DMG and what the application
|
||||
# will be called under /Applications. We include the version string to make installing
|
||||
# different versions side-by-side
|
||||
set(COMPANION_OSX_APP_BUNDLE_NAME "EdgeTX Companion ${VERSION_FAMILY}")
|
||||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.edgetx.companion")
|
||||
|
||||
set(companion_app_dir "companion.app")
|
||||
set(companion_res_dir "${companion_app_dir}/Contents/Resources")
|
||||
|
||||
# Only Companion is distributed for macOS
|
||||
install(TARGETS ${COMPANION_NAME}
|
||||
BUNDLE DESTINATION . COMPONENT Runtime)
|
||||
|
||||
# libsims
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/plugins/
|
||||
DESTINATION "${companion_res_dir}"
|
||||
COMPONENT Runtime
|
||||
)
|
||||
|
||||
# menu file
|
||||
install(DIRECTORY ${COMPANION_TARGETS_DIR}/qt_menu.nib
|
||||
DESTINATION "${companion_res_dir}"
|
||||
COMPONENT Runtime
|
||||
)
|
||||
|
||||
# Add icon
|
||||
set(MAC_ICON_FILE ${COMPANION_SRC_DIRECTORY}/images/iconmac.icns)
|
||||
set_source_files_properties(
|
||||
${MAC_ICON_FILE}
|
||||
PROPERTIES MACOSX_PACKAGE_LOCATION Resources
|
||||
)
|
||||
|
||||
install(FILES ${MAC_ICON_FILE}
|
||||
DESTINATION ${companion_res_dir}
|
||||
COMPONENT Runtime)
|
||||
|
||||
if(DFU_UTIL_FOUND)
|
||||
# Copy dfu-util, resolve symlink first
|
||||
file(REAL_PATH "${DFU_UTIL_PATH}" DFU_UTIL_ABSOLUTE_PATH)
|
||||
install(PROGRAMS ${DFU_UTIL_ABSOLUTE_PATH}
|
||||
DESTINATION ${companion_res_dir}
|
||||
COMPONENT Runtime)
|
||||
endif(DFU_UTIL_FOUND)
|
||||
endif()
|
||||
|
||||
############# Packaging ####################
|
||||
|
||||
# Create Windows installer with NSIS
|
||||
if(WIN32)
|
||||
find_program(NSIS_EXE makensis.exe PATHS
|
||||
"C:/Program Files/NSIS"
|
||||
"C:/Program Files (x86)/NSIS"
|
||||
"C:/Programs/NSIS"
|
||||
"${WIN_EXTRA_LIBS_PATH}/NSIS"
|
||||
)
|
||||
|
||||
if (NSIS_EXE)
|
||||
file(TO_NATIVE_PATH "${INSTALL_DESTINATION}" NSIS_DISTRO) # all files in here will be included in installer
|
||||
set(NSI_FILE "${PROJECT_BINARY_DIR}/companion/companion.nsi")
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/../targets/windows/companion.nsi.in" "${NSI_FILE}" @ONLY)
|
||||
|
||||
add_custom_target(installer
|
||||
# The 'install' target prepares all the distro files, make sure it has been executed first.
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --target install --config Release
|
||||
COMMAND "${QT_BIN_DIR}/windeployqt.exe" "${wdqtopts}"
|
||||
COMMAND "${NSIS_EXE}" "${NSI_FILE}"
|
||||
DEPENDS "${NSI_FILE}"
|
||||
COMMENT "Building Windows NSIS installer..."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
string(TOLOWER "${PROJECT_NAME}" PROJECT_NAME_LOWERCASE)
|
||||
|
||||
# Variables common to all CPack generators
|
||||
set(CPACK_GENERATOR)
|
||||
set(CPACK_PACKAGE_NAME "companion${APP_NAME_SUFFIX}")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Models and settings editor for the EdgeTX open source firmware")
|
||||
string(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_PACKAGE_NAME_LOWERCASE)
|
||||
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Models and settings editor for the ${PROJECT_NAME} open source firmware")
|
||||
set(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}")
|
||||
set(CPACK_PACKAGE_CONTACT "${PROJECT_NAME} Project Steering Committee <psc@${PROJECT_NAME_LOWERCASE}.org>")
|
||||
set(CPACK_PACKAGE_HOMEPAGE_URL "https://${PROJECT_NAME_LOWERCASE}.org")
|
||||
set(CPACK_PACKAGE_VERSION "${VERSION_FAMILY}")
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
|
||||
set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_REVISION})
|
||||
set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
|
||||
# The file stripping is deliberately disabled, with the stripped file we get
|
||||
# very poor trace-backs from the users when they report Companion crash
|
||||
set(CPACK_STRIP_FILES FALSE)
|
||||
|
||||
# Qt5 + Cmake + Mac is poorly documented. A lot of this is guesswork
|
||||
# and trial and error. Do not hesitate to fix it for the better
|
||||
IF(APPLE)
|
||||
set(plugin_dest_dir ${COMPANION_NAME}.app/Contents/Plugins)
|
||||
set(qtconf_dest_dir ${COMPANION_NAME}.app/Contents/Resources)
|
||||
set(APPS "\${CMAKE_INSTALL_PREFIX}/${COMPANION_NAME}.app")
|
||||
set(companion_res_dir ${COMPANION_NAME}.app/Contents/Resources)
|
||||
if(WIN32)
|
||||
set(companion_executable_path "\${CMAKE_INSTALL_BINDIR}/$<TARGET_FILE_NAME:companion>")
|
||||
set(simulator_executable_path "\${CMAKE_INSTALL_BINDIR}/$<TARGET_FILE_NAME:simulator>")
|
||||
|
||||
set_target_properties(${COMPANION_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Companion ${VERSION_MAJOR}.${VERSION_MINOR}")
|
||||
set_target_properties(${SIMULATOR_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Simulator ${VERSION_MAJOR}.${VERSION_MINOR}")
|
||||
|
||||
# Use a non standard Info.plist that adds Retina support flags
|
||||
set_target_properties(${COMPANION_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/companion/targets/mac/MacOSXBundleInfo.plist.in)
|
||||
set_target_properties(${SIMULATOR_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${PROJECT_SOURCE_DIR}/companion/targets/mac/MacOSXBundleInfo.plist.in)
|
||||
|
||||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.edgetx.companion")
|
||||
|
||||
INSTALL(TARGETS ${COMPANION_NAME}
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
RUNTIME DESTINATION bin COMPONENT Runtime
|
||||
qt_generate_deploy_script(
|
||||
TARGET companion
|
||||
OUTPUT_SCRIPT qt_deploy_script
|
||||
CONTENT "
|
||||
set(QT_DEPLOY_PREFIX ${CMAKE_INSTALL_PREFIX})
|
||||
qt_deploy_runtime_dependencies(
|
||||
EXECUTABLE ${companion_executable_path}
|
||||
ADDITIONAL_EXECUTABLES ${simulator_executable_path}
|
||||
NO_TRANSLATIONS
|
||||
NO_COMPILER_RUNTIME
|
||||
GENERATE_QT_CONF
|
||||
VERBOSE
|
||||
)
|
||||
"
|
||||
)
|
||||
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/plugins/ DESTINATION "${companion_res_dir}" COMPONENT Runtime)
|
||||
# Create Windows installer with NSIS
|
||||
# TODO use in-built CPack NSIS
|
||||
find_program(NSIS_EXE makensis.exe
|
||||
PATHS
|
||||
"C:/Program Files/NSIS"
|
||||
"C:/Program Files (x86)/NSIS"
|
||||
"C:/Programs/NSIS"
|
||||
"${WIN_EXTRA_LIBS_PATH}/NSIS"
|
||||
)
|
||||
|
||||
# Write qt.conf to tell qt where to find it plugins
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
|
||||
"[Paths]\nPlugins = Plugins\n")
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
|
||||
DESTINATION "${companion_res_dir}"
|
||||
COMPONENT Runtime)
|
||||
if(NSIS_EXE)
|
||||
# list(APPEND CPACK_GENERATOR "NSIS")
|
||||
# Set CPACK_NSIS_variables
|
||||
|
||||
# menu file
|
||||
install(DIRECTORY ${PROJECT_SOURCE_DIR}/companion/targets/mac/qt_menu.nib DESTINATION "${companion_res_dir}" COMPONENT Runtime)
|
||||
cmake_path(NATIVE_PATH CMAKE_INSTALL_PREFIX NORMALIZE NSIS_DISTRO) # all files in here will be included in installer
|
||||
cmake_path(NATIVE_PATH COMPANION_TARGETS_DIR NORMALIZE NSIS_TARGETS_DIR) # all files in here will be included in installer
|
||||
set(NSI_FILE "${PROJECT_BINARY_DIR}/companion/companion.nsi")
|
||||
configure_file("${COMPANION_TARGETS_DIR}/companion.nsi.in" "${NSI_FILE}" @ONLY)
|
||||
|
||||
# manually add the required plugins
|
||||
foreach (plugin ${Qt5Multimedia_PLUGINS} ${Qt5PrintSupport_PLUGINS} ${Qt5Gui_PLUGINS} ${Qt5Svg_PLUGINS})
|
||||
get_target_property(QPA_PLUGIN ${plugin} LOCATION)
|
||||
get_filename_component(QPA_PLUGIN_FILENAME ${QPA_PLUGIN} NAME)
|
||||
# Todo is there a nicer way to get the QT Plugin directory name?!
|
||||
get_filename_component(QPA_PLUGIN_DIRECTORY ${QPA_PLUGIN} DIRECTORY)
|
||||
get_filename_component(QPA_PLUGIN_DIRECTORY ${QPA_PLUGIN_DIRECTORY} NAME)
|
||||
|
||||
install(FILES ${QPA_PLUGIN} DESTINATION "${plugin_dest_dir}/${QPA_PLUGIN_DIRECTORY}/" COMPONENT Runtime)
|
||||
|
||||
list(APPEND bundle_qt_libs "\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/${QPA_PLUGIN_DIRECTORY}/${QPA_PLUGIN_FILENAME}")
|
||||
endforeach()
|
||||
|
||||
# Add icon
|
||||
set(MACOSX_BUNDLE_ICON_FILE iconmac.icns)
|
||||
set(MAC_ICON_FILE ${COMPANION_SRC_DIRECTORY}/images/${MACOSX_BUNDLE_ICON_FILE})
|
||||
SET_SOURCE_FILES_PROPERTIES(${MAC_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||
set(${COMPANION_SOURCES} ${COMPANION_SOURCES} ${PROJECT_SOURCE_DIR}/images/${MACOSX_BUNDLE_ICON_FILE})
|
||||
install(FILES ${MAC_ICON_FILE} DESTINATION ${companion_res_dir} COMPONENT Runtime)
|
||||
|
||||
# Copy dfu-util, resolve symlink first
|
||||
if(DFU_UTIL_FOUND)
|
||||
get_filename_component(DFU_UTIL_ABSOLUTE_PATH ${DFU_UTIL_PATH} REALPATH)
|
||||
install(PROGRAMS ${DFU_UTIL_ABSOLUTE_PATH} DESTINATION ${companion_res_dir} COMPONENT Runtime)
|
||||
|
||||
set(bundle_tools_path "\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/dfu-util;")
|
||||
# The 'install' target prepares all the distro files, make sure it has been executed first.
|
||||
add_custom_target(installer
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${CMAKE_BINARY_DIR}" --target install --config Release
|
||||
COMMAND "${CMAKE_COMMAND}" -P "${qt_deploy_script}"
|
||||
COMMAND "${NSIS_EXE}" "${NSI_FILE}"
|
||||
DEPENDS "${NSI_FILE}" "${qt_deploy_script}"
|
||||
COMMENT "Building Windows NSIS installer..."
|
||||
)
|
||||
endif()
|
||||
|
||||
if(OPENSSL_FOUND)
|
||||
# Copy openssl, resolve symlink first
|
||||
#get_filename_component(OPENSSL_ABSOLUTE_PATH ${OPENSSL_SSL_LIBRARY} REALPATH)
|
||||
#install(FILES ${OPENSSL_ABSOLUTE_PATH} DESTINATION ${companion_res_dir} COMPONENT Runtime)
|
||||
endif()
|
||||
|
||||
# Include depencies (adding frameworks, fixing the embbeded libraries)
|
||||
# I get write errors without setting BU_CHMOD_BUNDLE_ITEMS even though it is
|
||||
# technically a hack (that is already is in the Bundle library ...)
|
||||
install(CODE "
|
||||
include(BundleUtilities)
|
||||
file(GLOB bundle_simulator_libs \"\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/libedgetx-*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
|
||||
set(BU_CHMOD_BUNDLE_ITEMS on)
|
||||
fixup_bundle(\"${APPS}\" \"\${bundle_simulator_libs};${bundle_qt_libs};${bundle_tools_path}\" \"${QT_LIB_DIR}\")
|
||||
file(RENAME \"\${CMAKE_INSTALL_PREFIX}/${COMPANION_NAME}.app\" \"\${CMAKE_INSTALL_PREFIX}/${COMPANION_OSX_APP_BUNDLE_NAME}.app\")
|
||||
" COMPONENT Runtime)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
elseif(APPLE)
|
||||
set(CPACK_GENERATOR "DragNDrop")
|
||||
# set(CPACK_GENERATOR "TGZ") # for quick testing
|
||||
set(CPACK_BINARY_DRAGNDROP ON)
|
||||
set(CPACK_DMG_BACKGROUND_IMAGE ${COMPANION_SRC_DIRECTORY}/images/splash_dmg.png)
|
||||
set(CPACK_DMG_VOLUME_NAME "EdgeTX Companion")
|
||||
set(CPACK_DMG_DS_STORE ${PROJECT_SOURCE_DIR}/companion/targets/mac/DS_Store)
|
||||
set(CPACK_PACKAGE_FILE_NAME "edgetx-${CPACK_PACKAGE_NAME_LOWERCASE}-${VERSION}")
|
||||
endif(APPLE)
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(CPACK_DMG_VOLUME_NAME "${PROJECT_NAME} Companion")
|
||||
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME_LOWERCASE}-${CPACK_PACKAGE_NAME_LOWERCASE}-${VERSION}")
|
||||
set(CPACK_DMG_DS_STORE ${COMPANION_TARGETS_DIR}/DS_Store)
|
||||
|
||||
qt_generate_deploy_script(
|
||||
TARGET companion
|
||||
OUTPUT_SCRIPT qt_deploy_companion
|
||||
CONTENT "
|
||||
qt_deploy_runtime_dependencies(
|
||||
EXECUTABLE ${companion_app_dir}
|
||||
ADDITIONAL_EXECUTABLES ${companion_res_dir}/dfu-util
|
||||
NO_TRANSLATIONS
|
||||
NO_COMPILER_RUNTIME
|
||||
GENERATE_QT_CONF
|
||||
)
|
||||
"
|
||||
)
|
||||
|
||||
# Run macdeployqt
|
||||
install(SCRIPT ${qt_deploy_companion} COMPONENT Runtime)
|
||||
|
||||
# Fix Code Signing and rename bundle
|
||||
install(CODE "
|
||||
set(app_dir \"\${CMAKE_INSTALL_PREFIX}/${companion_app_dir}\")
|
||||
execute_process(COMMAND \${CMAKE_COMMAND} -E echo \"Re-signing: \${app_dir}\")
|
||||
execute_process(
|
||||
COMMAND codesign --remove-signature \${app_dir}
|
||||
COMMAND codesign --force --deep -s - \${app_dir}
|
||||
)
|
||||
file(RENAME \"\${app_dir}\" \"\${CMAKE_INSTALL_PREFIX}/${COMPANION_OSX_APP_BUNDLE_NAME}.app\")
|
||||
" COMPONENT Runtime)
|
||||
|
||||
else()
|
||||
set(LINUXDEPLOY_APPIMAGE "linuxdeploy-x86_64.AppImage")
|
||||
set(LINUXDEPLOY_PLUGIN_QT "linuxdeploy-plugin-qt-x86_64.AppImage")
|
||||
set(LINUXDEPLOY_URL "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous")
|
||||
@@ -610,7 +628,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(LINUXDEPLOY_DIRECTORY "${CMAKE_BINARY_DIR}/linuxdeploy")
|
||||
set(LINUXDEPLOY_APP "${LINUXDEPLOY_DIRECTORY}/usr/bin/linuxdeploy")
|
||||
|
||||
if (NOT EXISTS "${LINUXDEPLOY_DIRECTORY}")
|
||||
if(NOT EXISTS "${LINUXDEPLOY_DIRECTORY}")
|
||||
message(STATUS "Downloading linuxdeploy and plugins...")
|
||||
|
||||
file(DOWNLOAD "${LINUXDEPLOY_URL}/${LINUXDEPLOY_APPIMAGE}" "${CMAKE_BINARY_DIR}/${LINUXDEPLOY_APPIMAGE}")
|
||||
@@ -642,16 +660,17 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
|
||||
# test installation
|
||||
#execute_process(
|
||||
# COMMAND ${LINUXDEPLOY_APP} --list-plugins
|
||||
# WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
execute_process(
|
||||
COMMAND ${LINUXDEPLOY_APP} --list-plugins
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
endif()
|
||||
|
||||
list(APPEND CPACK_GENERATOR "External")
|
||||
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
set(CPACK_GENERATOR "External")
|
||||
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/CPackLinuxDeploy.cmake.in "${CMAKE_BINARY_DIR}/CPackExternal.cmake" @ONLY)
|
||||
set(APPIMAGE_DIR "${CPACK_PACKAGE_DIRECTORY}/_CPack_Packages/Linux/External/AppImage")
|
||||
configure_file("${COMPANION_TARGETS_DIR}/CPackLinuxDeploy.cmake.in" "${CMAKE_BINARY_DIR}/CPackExternal.cmake" @ONLY)
|
||||
set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake")
|
||||
endif()
|
||||
|
||||
include(CPack)
|
||||
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
set(APP_DIR "@CPACK_PACKAGE_DIRECTORY@/_CPack_Packages/Linux/External/AppImage")
|
||||
|
||||
execute_process(COMMAND @CMAKE_MAKE_PROGRAM@ DESTDIR=${APP_DIR} install
|
||||
WORKING_DIRECTORY @CMAKE_BINARY_DIR@)
|
||||
|
||||
set(cpn_desktop_file ${APP_DIR}@CMAKE_INSTALL_PREFIX@/share/applications/@COMPANION_NAME@.desktop)
|
||||
#set(icon_file ${APP_DIR}@CMAKE_INSTALL_PREFIX@/share/applications/@COMPANION_NAME@.desktop)
|
||||
|
||||
# This is done by cmake install target
|
||||
# setup Companion application
|
||||
# add -v0 to linuxdeploy for debug info
|
||||
execute_process(COMMAND env NO_APPSTREAM=1 @LINUXDEPLOY_APP@ --appdir ${APP_DIR} -e @COMPANION_NAME@ -d ${cpn_desktop_file} --plugin qt --output appimage
|
||||
WORKING_DIRECTORY @CMAKE_BINARY_DIR@)
|
||||
@@ -450,8 +450,8 @@ void AppPreferencesDialog::initSettings()
|
||||
}
|
||||
});
|
||||
|
||||
connect(ui->chkDelDecompress, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
connect(ui->chkDelDecompress, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
if (ui->chkDecompressDirUseDwnld->isChecked()) {
|
||||
ui->chkDelDownloads->setEnabled(false);
|
||||
ui->chkDelDownloads->setChecked(false);
|
||||
|
||||
@@ -59,7 +59,7 @@ class MyProxyStyle : public QProxyStyle
|
||||
|
||||
void importError()
|
||||
{
|
||||
QMessageBox::critical(nullptr, CPN_STR_APP_NAME, QCoreApplication::translate("Companion", "The saved settings could not be imported, please try again or continue with current settings."), QMessageBox::Ok, 0);
|
||||
QMessageBox::critical(nullptr, CPN_STR_APP_NAME, QCoreApplication::translate("Companion", "The saved settings could not be imported, please try again or continue with current settings."), QMessageBox::Ok, QMessageBox::NoButton);
|
||||
}
|
||||
|
||||
void checkSettingsImport(bool force = false)
|
||||
@@ -72,19 +72,23 @@ void checkSettingsImport(bool force = false)
|
||||
if (!found && !force)
|
||||
return;
|
||||
|
||||
QString msg;
|
||||
if (previousVersion.isEmpty()) {
|
||||
const QString impFileBtn = QCoreApplication::translate("Companion", "Import from File");
|
||||
const QString impNoneBtn = QCoreApplication::translate("Companion", "Do not import");
|
||||
|
||||
QString msg;
|
||||
|
||||
if (found)
|
||||
msg = QCoreApplication::translate("Companion", "We have found possible Companion settings backup file(s).\nDo you want to import settings from a file?");
|
||||
else
|
||||
msg = QCoreApplication::translate("Companion", "Import settings from a file, or start with current values.");
|
||||
|
||||
const int ret = QMessageBox::question(nullptr, CPN_STR_APP_NAME, msg, impNoneBtn, impFileBtn, 0, 0);
|
||||
QMessageBox msgBox(QMessageBox::Question, CPN_STR_APP_NAME, msg);
|
||||
msgBox.addButton(impFileBtn, QMessageBox::AcceptRole);
|
||||
QPushButton *btnCancel = msgBox.addButton(impNoneBtn, QMessageBox::RejectRole);
|
||||
msgBox.exec();
|
||||
|
||||
if (!ret)
|
||||
if (msgBox.clickedButton() == btnCancel)
|
||||
return;
|
||||
}
|
||||
else {
|
||||
@@ -131,11 +135,6 @@ void printHelpText()
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
||||
/* From doc: This attribute must be set before Q(Gui)Application is constructed. */
|
||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
#endif
|
||||
|
||||
QApplication app(argc, argv);
|
||||
app.setApplicationName(APP_COMPANION);
|
||||
app.setOrganizationName(COMPANY);
|
||||
|
||||
@@ -70,8 +70,6 @@ target_include_directories(${PROJECT_NAME}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
PUBLIC
|
||||
"${CMAKE_CURRENT_LIST_DIR}"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/er9x"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/ersky9x"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/opentx"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/edgetx"
|
||||
)
|
||||
|
||||
@@ -365,7 +365,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
|
||||
return ((IS_TARANIS_X9LITE(board) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_X9LITES(board)) ||
|
||||
IS_TARANIS_X9DP_2019(board) || IS_TARANIS_X7_ACCESS(board) || IS_RADIOMASTER_ZORRO(board) ||
|
||||
IS_RADIOMASTER_TX12_MK2(board) || IS_RADIOMASTER_BOXER(board) || IS_RADIOMASTER_POCKET(board) ||
|
||||
IS_RADIOMASTER_MT12(board) || IS_RADIOMASTER_GX12(board) || IS_JUMPER_T20(board) ||
|
||||
IS_RADIOMASTER_MT12(board) || IS_RADIOMASTER_GX12(board) || IS_JUMPER_T20(board) ||
|
||||
IS_JUMPER_BUMBLEBEE(board)) || IS_FAMILY_T16(board) || IS_FAMILY_HORUS(board) ||
|
||||
(getCapability(board, HasExternalModuleSupport) && (IS_TARANIS(board) && !IS_FAMILY_T12(board))));
|
||||
|
||||
@@ -726,31 +726,25 @@ AbstractStaticItemModel * Boards::switchTypeItemModel()
|
||||
QList<int> Boards::getSupportedInternalModules(Board::Type board)
|
||||
{
|
||||
QList<int> modules;
|
||||
modules = {(int)MODULE_TYPE_NONE};
|
||||
modules.append((int)MODULE_TYPE_NONE);
|
||||
if (IS_TARANIS_X9DP_2019(board) || IS_TARANIS_X7_ACCESS(board)) {
|
||||
modules.append({(int)MODULE_TYPE_ISRM_PXX2});
|
||||
modules.append((int)MODULE_TYPE_ISRM_PXX2);
|
||||
} else if (IS_FLYSKY_NV14(board)) {
|
||||
modules.append({(int)MODULE_TYPE_FLYSKY_AFHDS2A});
|
||||
modules.append((int)MODULE_TYPE_FLYSKY_AFHDS2A);
|
||||
} else if (IS_FLYSKY_EL18(board)) {
|
||||
modules.append({
|
||||
(int)MODULE_TYPE_FLYSKY_AFHDS3,
|
||||
(int)MODULE_TYPE_CROSSFIRE,
|
||||
});
|
||||
modules.append((int)MODULE_TYPE_FLYSKY_AFHDS3);
|
||||
modules.append((int)MODULE_TYPE_CROSSFIRE);
|
||||
} else if (IS_RADIOMASTER_MT12(board)) {
|
||||
modules.append({
|
||||
(int)MODULE_TYPE_CROSSFIRE,
|
||||
(int)MODULE_TYPE_MULTIMODULE,
|
||||
});
|
||||
modules.append((int)MODULE_TYPE_CROSSFIRE);
|
||||
modules.append((int)MODULE_TYPE_MULTIMODULE);
|
||||
} else if (IS_FAMILY_HORUS_OR_T16(board) || IS_FAMILY_T12(board) ||
|
||||
(IS_TARANIS_SMALL(board) && IS_ACCESS_RADIO(board))) {
|
||||
modules.append({
|
||||
(int)MODULE_TYPE_XJT_PXX1,
|
||||
(int)MODULE_TYPE_ISRM_PXX2,
|
||||
(int)MODULE_TYPE_CROSSFIRE,
|
||||
(int)MODULE_TYPE_MULTIMODULE,
|
||||
});
|
||||
modules.append((int)MODULE_TYPE_XJT_PXX1);
|
||||
modules.append((int)MODULE_TYPE_ISRM_PXX2);
|
||||
modules.append((int)MODULE_TYPE_CROSSFIRE);
|
||||
modules.append((int)MODULE_TYPE_MULTIMODULE);
|
||||
} else if (IS_TARANIS(board)) {
|
||||
modules.append({(int)MODULE_TYPE_XJT_PXX1});
|
||||
modules.append((int)MODULE_TYPE_XJT_PXX1);
|
||||
}
|
||||
|
||||
return modules;
|
||||
|
||||
@@ -965,7 +965,7 @@ void ModelData::updateTypeValueRef(R & curRef, const T type, const int idxAdj, c
|
||||
|
||||
newRef.value += updRefInfo.shift;
|
||||
|
||||
if (newRef.value < (updRefInfo.index1 + idxAdj) || newRef.value > (updRefInfo.maxindex + idxAdj)) {
|
||||
if ((newRef.value < (updRefInfo.index1 + idxAdj)) || (newRef.value > (updRefInfo.maxindex + idxAdj))) {
|
||||
if (defClear)
|
||||
newRef.clear();
|
||||
else {
|
||||
|
||||
@@ -72,14 +72,13 @@ void RadioData::fixModelFilenames()
|
||||
|
||||
QString RadioData::getNextModelFilename()
|
||||
{
|
||||
const bool hasSDCard = Boards::getCapability(getCurrentFirmware()->getBoard(), Board::HasSDCard);
|
||||
char filename[sizeof(ModelData::filename)];
|
||||
int index = 0;
|
||||
int8_t index = 0;
|
||||
bool found = true;
|
||||
while (found) {
|
||||
sprintf(filename, "model%d.%s", ++index, hasSDCard ? "yml" : "bin");
|
||||
sprintf(filename, "model%d.yml", ++index);
|
||||
found = false;
|
||||
for (unsigned int i=0; i<models.size(); i++) {
|
||||
for (unsigned int i = 0; i < models.size(); i++) {
|
||||
if (strcmp(filename, models[i].filename) == 0) {
|
||||
found = true;
|
||||
break;
|
||||
|
||||
@@ -181,7 +181,7 @@ bool RawSwitch::isAvailable(const ModelData * const model, const GeneralSettings
|
||||
board = getCurrentBoard();
|
||||
|
||||
Boards b(board);
|
||||
div_t sw;
|
||||
div_t sw = {0, 0};
|
||||
|
||||
if (type == SWITCH_TYPE_SWITCH && abs(index) > b.getCapability(Board::SwitchesPositions))
|
||||
return false;
|
||||
|
||||
@@ -58,9 +58,8 @@ SourceNumRefEditor::SourceNumRefEditor(int & srcNumValue, QCheckBox * chkUseSour
|
||||
model(model),
|
||||
lock(false)
|
||||
{
|
||||
if (chkUseSource) {
|
||||
connect(chkUseSource, &QCheckBox::stateChanged, this, &SourceNumRefEditor::chkUseSourceChanged);
|
||||
}
|
||||
if (chkUseSource)
|
||||
connect(chkUseSource, &QCheckBox::checkStateChanged, this, &SourceNumRefEditor::chkUseSourceChanged);
|
||||
|
||||
if (sbxValue) {
|
||||
sbxValue->setMinimum(minValue);
|
||||
|
||||
@@ -21,7 +21,7 @@ add_library(${PROJECT_NAME}
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PRIVATE
|
||||
${CPN_COMMON_LIB}
|
||||
Qt5::Multimedia
|
||||
Qt::Multimedia
|
||||
)
|
||||
|
||||
target_include_directories(${PROJECT_NAME}
|
||||
|
||||
@@ -439,7 +439,7 @@ void GeneralSetupPanel::populateVoiceLangCB()
|
||||
{ NULL, NULL }};
|
||||
|
||||
b->clear();
|
||||
for (int i = 0; strings[i][0] != NULL; i++) {
|
||||
for (int i = 0; !strings[i][0].isNull(); i++) {
|
||||
b->addItem(strings[i][0],strings[i][1]);
|
||||
if (generalSettings.ttsLanguage == strings[i][1]) {
|
||||
b->setCurrentIndex(b->count() - 1);
|
||||
|
||||
@@ -446,8 +446,7 @@ void HardwarePanel::addFlex(int index)
|
||||
|
||||
AutoComboBox *type = new AutoComboBox(this);
|
||||
setFlexTypeModel(type, index);
|
||||
int & flexType = (int &)config.flexType;
|
||||
type->setField(flexType, this);
|
||||
type->setField(config.flexType, this);
|
||||
|
||||
connect(type, &AutoComboBox::currentDataChanged, [=] (int val) {
|
||||
AbstractItemModel *mdl = editorItemModels->getItemModel(AbstractItemModel::IMID_FlexSwitches);
|
||||
@@ -531,8 +530,7 @@ void HardwarePanel::addSwitch(int index)
|
||||
else
|
||||
type->setModel(tabFilteredModels->getItemModel(FIM_SWITCHTYPE3POS));
|
||||
|
||||
int & swtype = (int &)config.type;
|
||||
type->setField(swtype, this);
|
||||
type->setField(config.type, this);
|
||||
params->append(type);
|
||||
|
||||
if (generalSettings.isSwitchFlex(index)) {
|
||||
|
||||
@@ -371,13 +371,14 @@ void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
|
||||
simuData->setCurrentModel(modelIdx);
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
SimulatorMainWindow * dialog = new SimulatorMainWindow(parent, simulatorId, flags);
|
||||
dialog->setWindowModality(Qt::ApplicationModal);
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
QObject::connect(dialog, &SimulatorMainWindow::destroyed, [simuData] (void) {
|
||||
#ifdef __APPLE__
|
||||
simulatorRunning = false;
|
||||
#endif
|
||||
// TODO simuData and Horus tmp directory is deleted on simulator close OR we could use it to get back data from the simulation
|
||||
delete simuData;
|
||||
});
|
||||
@@ -389,70 +390,14 @@ void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
|
||||
QMessageBox::critical(NULL, QCoreApplication::translate("Companion", "Simulator Error"), resultMsg);
|
||||
dialog->deleteLater();
|
||||
} else if (dialog->setRadioData(simuData)) {
|
||||
#ifdef __APPLE__
|
||||
simulatorRunning = true;
|
||||
#endif
|
||||
dialog->show();
|
||||
} else {
|
||||
QMessageBox::critical(NULL, QCoreApplication::translate("Companion", "Data Load Error"), QCoreApplication::translate("Companion", "Error occurred while starting simulator."));
|
||||
dialog->deleteLater();
|
||||
}
|
||||
#else
|
||||
// the directory will be automatically deleted when QTemporaryDir goes out of scope
|
||||
QTemporaryDir tmpDir(QDir::tempPath() + "/etx-XXXXXX");
|
||||
if (tmpDir.isValid()) {
|
||||
qDebug() << "Created temporary settings directory" << tmpDir.path();
|
||||
}
|
||||
else {
|
||||
QString resultMsg = QCoreApplication::translate("Companion", "Error creating temporary directory for models and settings.");
|
||||
QMessageBox::critical(NULL, QCoreApplication::translate("Companion", "Simulator Error"), resultMsg);
|
||||
return;
|
||||
}
|
||||
|
||||
simuData->fixModelFilenames();
|
||||
Storage storage(tmpDir.path());
|
||||
if (!storage.write(*simuData)) {
|
||||
QString resultMsg = QCoreApplication::translate("Companion", "Error writing models and settings to temporary directory.");
|
||||
QMessageBox::critical(NULL, QCoreApplication::translate("Companion", "Simulator Error"), resultMsg);
|
||||
return;
|
||||
}
|
||||
|
||||
const QString path = QCoreApplication::applicationDirPath();
|
||||
|
||||
#if defined Q_OS_WIN
|
||||
const QString program = "simulator.exe";
|
||||
#elif defined Q_OS_APPLE
|
||||
const QString program = "simulator.dmg";
|
||||
#else
|
||||
const QString program = QString("simulator%1%2").arg(VERSION_MAJOR).arg(VERSION_MINOR);
|
||||
#endif
|
||||
|
||||
QStringList arguments;
|
||||
arguments << "--profile" << g.currentProfile().name()
|
||||
<< "--start-with" << "folder"
|
||||
<< "--flags" << QString::number(flags)
|
||||
<< tmpDir.path();
|
||||
|
||||
QProcess *simu = new QProcess(parent);
|
||||
|
||||
qDebug() << "Launching simulator with command:" << QDir::toNativeSeparators(path % "/" % program) << arguments;
|
||||
|
||||
// wait for the simulator to finish
|
||||
int result = simu->execute(path % "/" % program, arguments);
|
||||
|
||||
QString resultMsg;
|
||||
|
||||
if (result == -2)
|
||||
resultMsg = QCoreApplication::translate("Companion", "Unable to start.");
|
||||
else if (result == -1)
|
||||
resultMsg = QCoreApplication::translate("Companion", "Crashed.");
|
||||
else if (result > 0)
|
||||
resultMsg = QCoreApplication::translate("Companion", "Exited with result code:") % QString(result);
|
||||
|
||||
if (result != 0)
|
||||
QMessageBox::critical(NULL, QCoreApplication::translate("Companion", "Simulator Error"), resultMsg);
|
||||
|
||||
if (simuData)
|
||||
delete simuData;
|
||||
#endif
|
||||
}
|
||||
|
||||
QPixmap makePixMap(const QImage & image)
|
||||
|
||||
|
After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 22 KiB |
@@ -1,361 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="673.22906"
|
||||
width="1345.6667"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="opentx_2_logo.svg"
|
||||
inkscape:export-filename="/home/kernen/github/opentx/companion/src/images/originals/logotypes/opentx_2_logo.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<defs
|
||||
id="defs78">
|
||||
<linearGradient
|
||||
id="linearGradient3821"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#009000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3823" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3815"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3817" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3807"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3809" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3801"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3803" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3795"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3797" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3789"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3791" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3783"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#009000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3785" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3783"
|
||||
id="linearGradient3787"
|
||||
x1="8399.5"
|
||||
y1="9800"
|
||||
x2="17600.5"
|
||||
y2="9800"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3789"
|
||||
id="linearGradient3793"
|
||||
x1="1499.5"
|
||||
y1="9800"
|
||||
x2="7800.5"
|
||||
y2="9800"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3795"
|
||||
id="linearGradient3799"
|
||||
x1="1499.5"
|
||||
y1="9800"
|
||||
x2="7800.5"
|
||||
y2="9800"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3801"
|
||||
id="linearGradient3805"
|
||||
x1="1488.8206"
|
||||
y1="3830.8831"
|
||||
x2="17507.216"
|
||||
y2="3830.8831"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3807"
|
||||
id="linearGradient3811"
|
||||
x1="1488.3206"
|
||||
y1="3830.8831"
|
||||
x2="17507.716"
|
||||
y2="3830.8831"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3815"
|
||||
id="linearGradient3819"
|
||||
x1="-531.16998"
|
||||
y1="236.981"
|
||||
x2="-307.17701"
|
||||
y2="236.981"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3821"
|
||||
id="linearGradient3825"
|
||||
x1="0"
|
||||
y1="9500"
|
||||
x2="19000"
|
||||
y2="9500"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="775"
|
||||
id="namedview76"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.36046316"
|
||||
inkscape:cx="1169.5417"
|
||||
inkscape:cy="345.32082"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-1e-4,0)" />
|
||||
<g
|
||||
id="g10"
|
||||
class="com.sun.star.drawing.CustomShape"
|
||||
transform="scale(0.03543311,0.03543311)">
|
||||
<path
|
||||
style="fill:#000000"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path12"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z" />
|
||||
<path
|
||||
style="fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path14"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z" />
|
||||
</g>
|
||||
<g
|
||||
id="g16"
|
||||
class="com.sun.star.drawing.PolyPolygonShape"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,0,86.000062)"
|
||||
style="fill-opacity:1;fill:url(#linearGradient3793);stroke:url(#linearGradient3799)">
|
||||
<path
|
||||
style="fill:url(#linearGradient3793);fill-opacity:1;stroke:url(#linearGradient3799)"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path18"
|
||||
d="m 1500,4800 6300,0 0,2000 -2000,0 0,8000 -2300,0 0,-8000 -2000,0 0,-800 0,-1200 z" />
|
||||
<path
|
||||
style="fill:url(#linearGradient3793);stroke:url(#linearGradient3799);fill-opacity:1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path20"
|
||||
d="m 1500,4800 6300,0 0,2000 -2000,0 0,8000 -2300,0 0,-8000 -2000,0 0,-800 0,-1200 z" />
|
||||
<text
|
||||
style="fill:url(#linearGradient3793);fill-opacity:1;stroke:url(#linearGradient3799)"
|
||||
id="text22"
|
||||
class="TextShape">
|
||||
<tspan
|
||||
style="font-size:635px;font-weight:400;fill:url(#linearGradient3793);font-family:'Liberation Sans, sans-serif';fill-opacity:1;stroke:url(#linearGradient3799)"
|
||||
id="tspan24"
|
||||
class="TextParagraph"
|
||||
font-size="635px"
|
||||
font-weight="400">
|
||||
<tspan
|
||||
style="fill:url(#linearGradient3793);fill-opacity:1;stroke:url(#linearGradient3799)"
|
||||
id="tspan26"
|
||||
x="3228"
|
||||
y="10021"
|
||||
class="TextPosition">
|
||||
<tspan
|
||||
style="fill:url(#linearGradient3793);fill-opacity:1;stroke:url(#linearGradient3799)"
|
||||
id="tspan28" />
|
||||
</tspan>
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
<g
|
||||
style="fill:#009000;stroke:url(#linearGradient3787);fill-opacity:1"
|
||||
id="g30"
|
||||
class="com.sun.star.drawing.PolyPolygonShape"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,0,86.000062)">
|
||||
<g
|
||||
style="fill:#009000;stroke:url(#linearGradient3787);fill-opacity:1"
|
||||
id="g32">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path34"
|
||||
d="m 17400,4800 -2600,0 -1800,3100 -1900,-3100 -2600,0 3000,5000 -3100,5000 2500,0 2100,-3300 2000,3300 2600,0 -3200,-5000 3000,-5000 z"
|
||||
style="stroke:url(#linearGradient3787);fill:#009000;fill-opacity:1" />
|
||||
<path
|
||||
style="stroke:url(#linearGradient3787);fill:#009000;fill-opacity:1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path36"
|
||||
d="m 17400,4800 -2600,0 -1800,3100 -1900,-3100 -2600,0 3000,5000 -3100,5000 2500,0 2100,-3300 2000,3300 2600,0 -3200,-5000 3000,-5000 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g38"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-0.5005,-0.50049)"
|
||||
style="stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)">
|
||||
<g
|
||||
id="g40"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-155.20944,2159.0131)"
|
||||
style="stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)">
|
||||
<g
|
||||
style="line-height:125%;stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)"
|
||||
id="g42"
|
||||
line-height="125%">
|
||||
<path
|
||||
style="fill:url(#linearGradient3811);stroke:url(#linearGradient3805);fill-opacity:1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path44"
|
||||
d="m 3549,442.74 c -291.04,0.003 -516.77,107.49 -677.17,322.46 -160.4,214.98 -240.61,517.59 -240.61,907.85 0,388.61 80.2,690.4 240.61,905.37 160.4,214.97 386.12,322.46 677.17,322.46 292.69,6e-4 519.24,-107.49 679.65,-322.46 160.4,-214.97 240.6,-516.76 240.61,-905.37 0,-390.26 -80.205,-692.88 -240.61,-907.85 -160.4,-214.92 -386.9,-322.41 -679.6,-322.41 m 0,-692.05 c 595.31,0.004 1061.6,170.33 1399,510.98 337.34,340.65 506.01,811.12 506.02,1411.4 0,598.62 -168.68,1068.3 -506.02,1408.9 -337.35,340.65 -803.67,510.98 -1399,510.98 -593.66,-1e-4 -1060,-170.33 -1399,-510.98 -337.34,-340.65 -506.02,-810.29 -506.02,-1408.9 -2e-4,-600.27 168.67,-1070.7 506.02,-1411.4 339,-340.65 805.32,-510.97 1399,-510.98" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g46"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-493.87614,2159.0131)"
|
||||
style="stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)">
|
||||
<g
|
||||
style="line-height:125%;stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)"
|
||||
id="g48"
|
||||
line-height="125%">
|
||||
<path
|
||||
style="fill:url(#linearGradient3811);stroke:url(#linearGradient3805);fill-opacity:1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path50"
|
||||
d="m 6748.3,-182.34 1585,0 c 471.29,0.004 832.61,105.01 1084,315.02 253,208.36 379.51,506.02 379.51,892.97 0,388.61 -126.51,687.92 -379.51,897.93 -251.36,208.36 -612.68,312.54 -1084,312.54 h -630.04 v 1284.9 h -954.98 v -3703.3 m 954.98,692.05 0,1034.4 528.34,0 c 185.21,0 328.25,-44.646 429.12,-133.95 100.87,-90.948 151.31,-219.11 151.31,-384.47 0,-165.36 -50.439,-292.69 -151.31,-381.99 C 8559.85,554.466 8416.81,509.82 8231.6,509.81 h -528.34" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g52"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-832.54284,2159.0131)"
|
||||
style="stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)">
|
||||
<g
|
||||
style="line-height:125%;stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)"
|
||||
id="g54"
|
||||
line-height="125%">
|
||||
<path
|
||||
style="fill:url(#linearGradient3811);stroke:url(#linearGradient3805);fill-opacity:1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path56"
|
||||
d="m 11162,-117.34 2577.2,0 0,721.82 -1622.2,0 0,689.57 1525.5,0 0,721.82 -1525.5,0 0,848.32 1676.8,0 0,721.82 -2631.8,0 0,-3703.3" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g58"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-1227.6538,2159.0131)"
|
||||
style="stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)">
|
||||
<g
|
||||
style="line-height:125%;stroke:url(#linearGradient3805);fill-opacity:1;fill:url(#linearGradient3811)"
|
||||
id="g60"
|
||||
line-height="125%">
|
||||
<path
|
||||
style="fill:url(#linearGradient3811);stroke:url(#linearGradient3805);fill-opacity:1"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path62"
|
||||
d="m 15416,-117.34 1066.6,0 1346.9,2540 0,-2540 905.37,0 0,3703.3 -1066.6,0 -1346.9,-2540 0,2540 -905.37,0 0,-3703.3" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="fill:#009000;stroke:url(#linearGradient3825);fill-opacity:1"
|
||||
id="g64"
|
||||
class="com.sun.star.drawing.CustomShape"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,672.43766,0)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path66"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z"
|
||||
style="stroke:url(#linearGradient3825);fill:#009000;fill-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path68"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z"
|
||||
style="stroke:url(#linearGradient3825);fill:#009000;fill-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3819)"
|
||||
id="g70"
|
||||
transform="matrix(1.1733935,0,0,1.0743315,1501.2227,81.174002)">
|
||||
<rect
|
||||
id="rect72"
|
||||
x="-531.16998"
|
||||
y="59.701"
|
||||
width="82.833"
|
||||
height="354.56"
|
||||
style="stroke:url(#linearGradient3819)" />
|
||||
<rect
|
||||
id="rect74"
|
||||
x="-390.01001"
|
||||
y="59.701"
|
||||
width="82.833"
|
||||
height="354.56"
|
||||
style="stroke:url(#linearGradient3819)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 72 KiB |
@@ -1,334 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="2947.7456"
|
||||
height="673.15546"
|
||||
id="svg3088"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="opentx_companion_logo.svg"
|
||||
inkscape:export-filename="/home/kernen/github/opentx/companion/src/images/originals/logotypes/opentx_companion_logo.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<defs
|
||||
id="defs3090">
|
||||
<linearGradient
|
||||
id="linearGradient3820"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3822" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3820"
|
||||
id="linearGradient3824"
|
||||
x1="0"
|
||||
y1="9500"
|
||||
x2="19000"
|
||||
y2="9500"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3820"
|
||||
id="linearGradient3826"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="0"
|
||||
y1="9500"
|
||||
x2="19000"
|
||||
y2="9500" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3820"
|
||||
id="linearGradient3828"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="0"
|
||||
y1="9500"
|
||||
x2="19000"
|
||||
y2="9500" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3820"
|
||||
id="linearGradient3830"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="0"
|
||||
y1="9500"
|
||||
x2="19000"
|
||||
y2="9500" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="1493.6349"
|
||||
inkscape:cy="154.38925"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="775"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata3093">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(1428.6413,109.23949)">
|
||||
<g
|
||||
style="fill:#000000;fill-rule:evenodd;stroke:url(#linearGradient3824)"
|
||||
id="g101-6"
|
||||
class="com.sun.star.drawing.CustomShape"
|
||||
transform="matrix(0.15513634,0,0,0.03542737,-1428.5637,-109.22178)">
|
||||
<g
|
||||
style="fill:#000000;stroke:url(#linearGradient3830)"
|
||||
id="g103-1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path105-1"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z"
|
||||
style="fill:#000000;stroke:url(#linearGradient3826)" />
|
||||
<path
|
||||
style="fill:#000000;stroke:url(#linearGradient3828)"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path107-6"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-1429.9603,-109.96665)"
|
||||
id="g33">
|
||||
<g
|
||||
class="Master_Slide"
|
||||
id="g35" />
|
||||
</g>
|
||||
<g
|
||||
style="fill:#ffffff"
|
||||
id="g45"
|
||||
class="com.sun.star.drawing.PolyPolygonShape"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-1429.9602,-23.966588)"
|
||||
inkscape:export-filename="/home/kjell/github/opentx/companion/src/images/originals/opentx_logo_blue3.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<g
|
||||
id="g47">
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path49"
|
||||
d="m 1500,4800 6300,0 0,2000 -2000,0 0,8000 -2300,0 0,-8000 -2000,0 0,-800 0,-1200 z" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:#ffffff"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path51"
|
||||
d="m 1500,4800 6300,0 0,2000 -2000,0 0,8000 -2300,0 0,-8000 -2000,0 0,-800 0,-1200 z" />
|
||||
<text
|
||||
style="fill:#ffffff"
|
||||
id="text53"
|
||||
class="TextShape">
|
||||
<tspan
|
||||
style="font-size:635px;font-weight:400;fill:#ffffff;font-family:'Liberation Sans, sans-serif'"
|
||||
id="tspan55"
|
||||
class="TextParagraph"
|
||||
font-weight="400"
|
||||
font-size="635px">
|
||||
<tspan
|
||||
style="fill:#ffffff"
|
||||
id="tspan57"
|
||||
class="TextPosition"
|
||||
x="3228"
|
||||
y="10021">
|
||||
<tspan
|
||||
style="fill:#ffffff"
|
||||
id="tspan59" />
|
||||
</tspan>
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="fill:#009100"
|
||||
id="g61"
|
||||
class="com.sun.star.drawing.PolyPolygonShape"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-1429.9602,-23.966588)"
|
||||
inkscape:export-filename="/home/kjell/github/opentx/companion/src/images/originals/opentx_logo_blue3.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<g
|
||||
style="fill:#009100"
|
||||
id="g63">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path65"
|
||||
d="m 17400,4800 -2600,0 -1800,3100 -1900,-3100 -2600,0 3000,5000 -3100,5000 2500,0 2100,-3300 2000,3300 2600,0 -3200,-5000 3000,-5000 z"
|
||||
style="fill:#009100" />
|
||||
<path
|
||||
style="fill:#009100;stroke:#336633"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path67"
|
||||
d="m 17400,4800 -2600,0 -1800,3100 -1900,-3100 -2600,0 3000,5000 -3100,5000 2500,0 2100,-3300 2000,3300 2600,0 -3200,-5000 3000,-5000 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3158"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-1430.4607,-110.46714)">
|
||||
<g
|
||||
transform="translate(-155.20944,2159.0131)"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
id="g69">
|
||||
<g
|
||||
id="text71"
|
||||
style="line-height:125%">
|
||||
<path
|
||||
id="path3128"
|
||||
style="line-height:125%;fill:#ffffff;font-family:Sans"
|
||||
d="m 3549.0078,442.73828 c -291.0435,0.003 -516.766,107.48995 -677.168,322.46094 -160.4049,214.9765 -240.6067,517.59338 -240.6054,907.85158 0,388.6082 80.2005,690.3983 240.6054,905.3711 160.402,214.9747 386.1245,322.4615 677.168,322.4609 292.6929,6e-4 519.2421,-107.4862 679.6484,-322.4609 160.4007,-214.9728 240.6024,-516.7629 240.6055,-905.3711 0,-390.2582 -80.2048,-692.87508 -240.6055,-907.85158 C 4068.2499,550.22823 3841.7007,442.74136 3549.0078,442.73828 m 0,-692.05078 c 595.3098,0.004 1061.6374,170.329121 1398.9844,510.97656 337.3398,340.65396 506.0115,811.11574 506.0156,1411.38674 0,598.621 -168.6758,1068.256 -506.0156,1408.9062 -337.347,340.6512 -803.6746,510.9765 -1398.9844,510.9766 -593.6604,-10e-5 -1059.9881,-170.3254 -1398.9844,-510.9766 -337.3441,-340.6502 -506.0158,-810.2852 -506.0156,-1408.9062 -2e-4,-600.271 168.6715,-1070.73278 506.0156,-1411.38674 338.9963,-340.647439 805.324,-510.97279 1398.9844,-510.97656"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-493.87614,2159.0131)"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
id="g77">
|
||||
<g
|
||||
id="text79"
|
||||
style="line-height:125%">
|
||||
<path
|
||||
id="path3131"
|
||||
style="line-height:125%;fill:#ffffff;font-family:Sans"
|
||||
d="m 6748.3281,-182.33984 1585.0196,0 c 471.2865,0.004 832.6077,105.010105 1083.9648,315.01953 253.0044,208.36255 379.5082,506.0185 379.5117,892.96871 0,388.6089 -126.5073,687.9185 -379.5117,897.9297 -251.3571,208.3608 -612.6783,312.5404 -1083.9648,312.5391 l -630.0391,0 0,1284.8828 -954.9805,0 0,-3703.33984 m 954.9805,692.05078 0,1034.35546 528.3398,0 c 185.2062,0 328.2465,-44.6464 429.1211,-133.9453 100.8699,-90.9483 151.3061,-219.1057 151.3086,-384.4727 0,-165.36189 -50.4387,-292.69249 -151.3086,-381.99215 -100.8746,-89.29391 -243.9149,-133.9423 -429.1211,-133.94531 l -528.3398,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-832.54284,2159.0131)"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
id="g85">
|
||||
<g
|
||||
id="text87"
|
||||
style="line-height:125%">
|
||||
<path
|
||||
id="path3134"
|
||||
style="line-height:125%;fill:#ffffff;font-family:Sans"
|
||||
d="m 11162.328,-117.33984 2577.207,0 0,721.8164 -1622.226,0 0,689.57034 1525.488,0 0,721.8164 -1525.488,0 0,848.3203 1676.796,0 0,721.8164 -2631.777,0 0,-3703.33984"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-1227.6538,2159.0131)"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
id="g93">
|
||||
<g
|
||||
id="text95"
|
||||
style="line-height:125%">
|
||||
<path
|
||||
id="path3137"
|
||||
style="line-height:125%;fill:#ffffff;font-family:Sans"
|
||||
d="m 15416.328,-117.33984 1066.602,0 1346.894,2540.00004 0,-2540.00004 905.371,0 0,3703.33984 -1066.601,0 -1346.895,-2540 0,2540 -905.371,0 0,-3703.33984"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="fill:#009100;fill-rule:evenodd;stroke:none"
|
||||
id="g101"
|
||||
class="com.sun.star.drawing.CustomShape"
|
||||
transform="matrix(0.119783,0,0,0.03543311,-757.34494,-109.96665)">
|
||||
<g
|
||||
style="fill:#009100;stroke:none"
|
||||
id="g103">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path105"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z"
|
||||
style="fill:#009100;stroke:none" />
|
||||
<path
|
||||
style="fill:#009100;stroke:none"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path107"
|
||||
d="M 9500,19000 0,19000 0,0 H 19000 V 19000 H 9500 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
style="font-size:1128.88891602px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;font-family:Sans"
|
||||
id="text109"
|
||||
transform="matrix(0.03543311,0,0,0.03543311,-1430.4607,-110.46714)">
|
||||
<path
|
||||
d="m 26770.213,12704.757 c -301.887,156.637 -616.585,274.826 -944.093,354.569 -327.518,79.742 -669.271,119.613 -1025.259,119.613 -1062.286,0 -1903.852,-296.186 -2524.702,-888.558 -620.852,-595.219 -931.278,-1401.186 -931.277,-2417.9036 0,-1019.5594 310.425,-1825.5264 931.277,-2417.9036 620.85,-595.2139 1462.416,-892.8236 2524.702,-892.8301 355.988,0.01 697.741,39.8777 1025.259,119.6136 327.508,79.7487 642.206,197.9382 944.093,354.5689 l 0,1320.0216 c -304.735,-207.895 -605.193,-360.2597 -901.374,-457.0949 -296.191,-96.8248 -608.04,-145.2398 -935.549,-145.2451 -586.68,0.01 -1048.046,187.9694 -1384.1,563.8928 -336.06,375.9328 -504.088,894.2579 -504.086,1554.9768 0,657.8776 168.026,1174.7786 504.086,1550.7046 336.054,375.93 797.42,563.894 1384.1,563.893 327.509,10e-4 639.358,-48.414 935.549,-145.245 296.181,-96.829 596.639,-249.194 901.374,-457.095 l 0,1320.022"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3140"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 31050.672,7753.6078 c -501.242,0.01 -889.985,185.1214 -1166.233,555.3489 -276.253,370.237 -414.378,891.41 -414.376,1563.5207 0,669.2696 138.123,1189.0186 414.376,1559.2486 276.248,370.234 664.991,555.35 1166.233,555.349 504.081,10e-4 894.249,-185.115 1170.504,-555.349 276.245,-370.23 414.371,-889.979 414.376,-1559.2486 0,-672.1107 -138.131,-1193.2837 -414.376,-1563.5207 -276.255,-370.2275 -666.423,-555.3436 -1170.504,-555.3489 m 0,-1191.8641 c 1025.254,0.01 1828.373,293.3443 2409.359,880.0144 580.974,586.6813 871.464,1396.9202 871.471,2430.7193 0,1030.9576 -290.497,1839.7726 -871.471,2426.4476 -580.986,586.676 -1384.105,880.014 -2409.359,880.014 -1022.415,0 -1825.534,-293.338 -2409.36,-880.014 -580.981,-586.675 -871.471,-1395.49 -871.471,-2426.4476 0,-1033.7991 290.49,-1844.038 871.471,-2430.7193 583.826,-586.6701 1386.945,-880.0079 2409.36,-880.0144"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3142"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 35570.357,6677.0854 2093.238,0 1452.451,3413.2596 1460.995,-3413.2596 2088.966,0 0,6377.9686 -1554.977,0 0,-4664.9309 -1469.538,3438.8909 -1042.347,0 -1469.539,-3438.8909 0,4664.9309 -1559.249,0 0,-6377.9686"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3144"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 44285.063,6677.0854 2729.754,0 c 811.659,0.01 1433.934,180.8506 1866.826,542.5331 435.73,358.8463 653.597,871.4755 653.603,1537.8892 0,669.2703 -217.873,1184.7474 -653.603,1546.4333 -432.892,358.843 -1055.167,538.263 -1866.826,538.261 l -1085.067,0 0,2212.852 -1644.687,0 0,-6377.9686 m 1644.687,1191.8641 0,1781.3884 909.918,0 c 318.966,0 565.313,-76.891 739.041,-230.6834 173.721,-156.6331 260.583,-377.3484 260.587,-662.1468 0,-284.7897 -86.866,-504.0811 -260.587,-657.8748 -173.728,-153.7838 -420.075,-230.6782 -739.041,-230.6834 l -909.918,0"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3146"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 53760.168,11893.093 -2571.693,0 -405.832,1161.961 -1653.23,0 2362.368,-6377.9686 1960.809,0 2362.369,6377.9686 -1653.231,0 -401.56,-1161.961 m -2161.589,-1183.32 1747.213,0 -871.47,-2537.5175 -875.743,2537.5175"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3148"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 56656.528,6677.0854 1836.923,0 2319.65,4374.4406 0,-4374.4406 1559.249,0 0,6377.9686 -1836.924,0 -2319.649,-4374.4407 0,4374.4407 -1559.249,0 0,-6377.9686"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3150"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 63987.134,6677.0854 1644.687,0 0,6377.9686 -1644.687,0 0,-6377.9686"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3152"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 70164.321,7753.6078 c -501.241,0.01 -889.985,185.1214 -1166.232,555.3489 -276.253,370.237 -414.378,891.41 -414.376,1563.5207 0,669.2696 138.123,1189.0186 414.376,1559.2486 276.247,370.234 664.991,555.35 1166.232,555.349 504.082,10e-4 894.25,-185.115 1170.505,-555.349 276.245,-370.23 414.37,-889.979 414.376,-1559.2486 0,-672.1107 -138.131,-1193.2837 -414.376,-1563.5207 -276.255,-370.2275 -666.423,-555.3436 -1170.505,-555.3489 m 0,-1191.8641 c 1025.255,0.01 1828.374,293.3443 2409.36,880.0144 580.974,586.6813 871.464,1396.9202 871.471,2430.7193 0,1030.9576 -290.497,1839.7726 -871.471,2426.4476 -580.986,586.676 -1384.105,880.014 -2409.36,880.014 -1022.414,0 -1825.533,-293.338 -2409.359,-880.014 -580.981,-586.675 -871.471,-1395.49 -871.471,-2426.4476 0,-1033.7991 290.49,-1844.038 871.471,-2430.7193 583.826,-586.6701 1386.945,-880.0079 2409.359,-880.0144"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3154"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 74684.005,6677.0854 1836.923,0 2319.649,4374.4406 0,-4374.4406 1559.249,0 0,6377.9686 -1836.923,0 -2319.65,-4374.4407 0,4374.4407 -1559.248,0 0,-6377.9686"
|
||||
style="font-size:8748.88085938px;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Saab;-inkscape-font-specification:Saab Bold"
|
||||
id="path3156"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 20 KiB |
@@ -1,340 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:ooo="http://xml.openoffice.org/svg/export"
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.2"
|
||||
width="190mm"
|
||||
height="190mm"
|
||||
viewBox="0 0 19000 19000"
|
||||
preserveAspectRatio="xMidYMid"
|
||||
fill-rule="evenodd"
|
||||
clip-path="url(#presentation_clip_path)"
|
||||
stroke-width="28.222"
|
||||
stroke-linejoin="round"
|
||||
xml:space="preserve"
|
||||
id="svg3347"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="opentx_logo.svg"><metadata
|
||||
id="metadata3491"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="775"
|
||||
id="namedview3489"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.20481287"
|
||||
inkscape:cx="-1144.0445"
|
||||
inkscape:cy="70.041471"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g3399" /><defs
|
||||
class="ClipPathGroup"
|
||||
id="defs3349"><linearGradient
|
||||
id="linearGradient3844"
|
||||
osb:paint="solid"><stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3846" /></linearGradient><linearGradient
|
||||
id="linearGradient3838"
|
||||
osb:paint="solid"><stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3840" /></linearGradient><linearGradient
|
||||
id="linearGradient3826"
|
||||
osb:paint="solid"><stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3828" /></linearGradient><linearGradient
|
||||
id="linearGradient3820"
|
||||
osb:paint="solid"><stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3822" /></linearGradient><linearGradient
|
||||
id="linearGradient3814"
|
||||
osb:paint="solid"><stop
|
||||
style="stop-color:#009000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3816" /></linearGradient><clipPath
|
||||
id="presentation_clip_path"
|
||||
clipPathUnits="userSpaceOnUse"><rect
|
||||
x="0"
|
||||
y="0"
|
||||
width="19000"
|
||||
height="19000"
|
||||
id="rect3352" /></clipPath><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3814"
|
||||
id="linearGradient3818"
|
||||
x1="8385.889"
|
||||
y1="9800"
|
||||
x2="17614.111"
|
||||
y2="9800"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3820"
|
||||
id="linearGradient3824"
|
||||
x1="1485.889"
|
||||
y1="9800"
|
||||
x2="7814.111"
|
||||
y2="9800"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3826"
|
||||
id="linearGradient3830"
|
||||
x1="15416.328"
|
||||
y1="1734.3301"
|
||||
x2="18735.195"
|
||||
y2="1734.3301"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3826"
|
||||
id="linearGradient3832"
|
||||
x1="11162.328"
|
||||
y1="1734.3301"
|
||||
x2="13794.105"
|
||||
y2="1734.3301"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3826"
|
||||
id="linearGradient3834"
|
||||
x1="6748.3281"
|
||||
y1="1669.3301"
|
||||
x2="9796.8242"
|
||||
y2="1669.3301"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3826"
|
||||
id="linearGradient3836"
|
||||
x1="1644.0078"
|
||||
y1="1671.8105"
|
||||
x2="5454.0078"
|
||||
y2="1671.8105"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3838"
|
||||
id="linearGradient3842"
|
||||
x1="-14.111"
|
||||
y1="9500"
|
||||
x2="19014.111"
|
||||
y2="9500"
|
||||
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3844"
|
||||
id="linearGradient3848"
|
||||
x1="-14.111"
|
||||
y1="9500"
|
||||
x2="19014.111"
|
||||
y2="9500"
|
||||
gradientUnits="userSpaceOnUse" /></defs><defs
|
||||
class="TextShapeIndex"
|
||||
id="defs3354"><g
|
||||
ooo:slide="id1"
|
||||
ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10"
|
||||
id="g3356" /></defs><defs
|
||||
class="EmbeddedBulletChars"
|
||||
id="defs3358"><g
|
||||
id="bullet-char-template(57356)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"
|
||||
id="path3361" /></g><g
|
||||
id="bullet-char-template(57354)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"
|
||||
id="path3364" /></g><g
|
||||
id="bullet-char-template(10146)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"
|
||||
id="path3367" /></g><g
|
||||
id="bullet-char-template(10132)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"
|
||||
id="path3370" /></g><g
|
||||
id="bullet-char-template(10007)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"
|
||||
id="path3373" /></g><g
|
||||
id="bullet-char-template(10004)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"
|
||||
id="path3376" /></g><g
|
||||
id="bullet-char-template(9679)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"
|
||||
id="path3379" /></g><g
|
||||
id="bullet-char-template(8226)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"
|
||||
id="path3382" /></g><g
|
||||
id="bullet-char-template(8211)"
|
||||
transform="scale(0.00048828125,-0.00048828125)"><path
|
||||
d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"
|
||||
id="path3385" /></g></defs><defs
|
||||
class="TextEmbeddedBitmaps"
|
||||
id="defs3387" /><g
|
||||
id="g3389"><g
|
||||
id="id2"
|
||||
class="Master_Slide"><g
|
||||
id="bg-id2"
|
||||
class="Background" /><g
|
||||
id="bo-id2"
|
||||
class="BackgroundObjects" /></g></g><g
|
||||
id="g3399"
|
||||
class="Page"><g
|
||||
class="com.sun.star.drawing.CustomShape"
|
||||
id="g3403"
|
||||
style="stroke:url(#linearGradient3842);fill-opacity:1;fill:url(#linearGradient3848)"><g
|
||||
id="id3"
|
||||
style="stroke:url(#linearGradient3842);fill-opacity:1;fill:url(#linearGradient3848)"><path
|
||||
d="M 9500,19000 0,19000 0,0 l 19000,0 0,19000 -9500,0 z"
|
||||
id="path3406"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient3848);stroke:url(#linearGradient3842);fill-opacity:1" /><path
|
||||
d="M 9500,19000 0,19000 0,0 l 19000,0 0,19000 -9500,0 z"
|
||||
id="path3408"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient3848);stroke:url(#linearGradient3842);fill-opacity:1" /></g></g><g
|
||||
class="com.sun.star.drawing.PolyPolygonShape"
|
||||
id="g3410"
|
||||
transform="translate(0,2427.1101)"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)"><g
|
||||
id="id4"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)"><path
|
||||
d="m 1500,4800 6300,0 0,2000 -2000,0 0,8000 -2300,0 0,-8000 -2000,0 0,-800 0,-1200 z"
|
||||
id="path3413"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)" /><path
|
||||
d="m 1500,4800 6300,0 0,2000 -2000,0 0,8000 -2300,0 0,-8000 -2000,0 0,-800 0,-1200 z"
|
||||
id="path3415"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)" /><text
|
||||
class="TextShape"
|
||||
id="text3417"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)"><tspan
|
||||
class="TextParagraph"
|
||||
font-size="635px"
|
||||
font-weight="400"
|
||||
id="tspan3419"
|
||||
style="font-size:635px;font-weight:400;fill:#ffffff;font-family:'Liberation Sans, sans-serif';stroke:url(#linearGradient3824)"><tspan
|
||||
class="TextPosition"
|
||||
x="3228"
|
||||
y="10021"
|
||||
id="tspan3421"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)"><tspan
|
||||
id="tspan3423"
|
||||
style="fill:#ffffff;stroke:url(#linearGradient3824)" /></tspan></tspan></text>
|
||||
</g></g><g
|
||||
class="com.sun.star.drawing.PolyPolygonShape"
|
||||
id="g3425"
|
||||
transform="translate(0,2427.1101)"
|
||||
style="fill:#009000;fill-opacity:1;stroke:url(#linearGradient3818)"><g
|
||||
id="id5"
|
||||
style="fill:#009000;fill-opacity:1;stroke:url(#linearGradient3818)"><path
|
||||
d="m 17400,4800 -2600,0 -1800,3100 -1900,-3100 -2600,0 3000,5000 -3100,5000 2500,0 2100,-3300 2000,3300 2600,0 -3200,-5000 3000,-5000 z"
|
||||
id="path3428"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#009000;stroke:url(#linearGradient3818);fill-opacity:1" /><path
|
||||
d="m 17400,4800 -2600,0 -1800,3100 -1900,-3100 -2600,0 3000,5000 -3100,5000 2500,0 2100,-3300 2000,3300 2600,0 -3200,-5000 3000,-5000 z"
|
||||
id="path3430"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#009000;stroke:url(#linearGradient3818);fill-opacity:1" /></g></g><g
|
||||
id="g3445"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-169.33334,2144.8881)"
|
||||
style="stroke:url(#linearGradient3836)"><g
|
||||
id="id7"
|
||||
style="stroke:url(#linearGradient3836)"><text
|
||||
style="line-height:125%;stroke:url(#linearGradient3836)"
|
||||
id="text3448"
|
||||
class="TextShape"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Bold;stroke:url(#linearGradient3836)"
|
||||
id="tspan3450"
|
||||
font-weight="700"
|
||||
font-size="3104px"
|
||||
class="TextParagraph"><tspan
|
||||
id="tspan3452"
|
||||
y="3521"
|
||||
x="1391"
|
||||
class="TextPosition"
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;stroke:url(#linearGradient3836);font-family:Sans;-inkscape-font-specification:Sans Bold">O</tspan></tspan></text>
|
||||
</g></g><g
|
||||
id="g3456"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-508.00004,2144.8881)"
|
||||
style="stroke:url(#linearGradient3834)"><g
|
||||
id="id8"
|
||||
style="stroke:url(#linearGradient3834)"><text
|
||||
style="line-height:125%;stroke:url(#linearGradient3834)"
|
||||
id="text3459"
|
||||
class="TextShape"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Bold;stroke:url(#linearGradient3834)"
|
||||
id="tspan3461"
|
||||
font-weight="700"
|
||||
font-size="3104px"
|
||||
class="TextParagraph"><tspan
|
||||
id="tspan3463"
|
||||
y="3521"
|
||||
x="6282"
|
||||
class="TextPosition"
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;stroke:url(#linearGradient3834);font-family:Sans;-inkscape-font-specification:Sans Bold">P</tspan></tspan></text>
|
||||
</g></g><g
|
||||
id="g3467"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-846.66674,2144.8881)"
|
||||
style="stroke:url(#linearGradient3832)"><g
|
||||
id="id9"
|
||||
style="stroke:url(#linearGradient3832)"><text
|
||||
style="line-height:125%;stroke:url(#linearGradient3832)"
|
||||
id="text3470"
|
||||
class="TextShape"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Bold;stroke:url(#linearGradient3832)"
|
||||
id="tspan3472"
|
||||
font-weight="700"
|
||||
font-size="3104px"
|
||||
class="TextParagraph"><tspan
|
||||
id="tspan3474"
|
||||
y="3586"
|
||||
x="10696"
|
||||
class="TextPosition"
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;stroke:url(#linearGradient3832);font-family:Sans;-inkscape-font-specification:Sans Bold">E</tspan></tspan></text>
|
||||
</g></g><g
|
||||
id="g3478"
|
||||
class="com.sun.star.drawing.TextShape"
|
||||
transform="translate(-1241.7777,2144.8881)"
|
||||
style="stroke:url(#linearGradient3830)"><g
|
||||
id="id10"
|
||||
style="stroke:url(#linearGradient3830)"><text
|
||||
style="line-height:125%;stroke:url(#linearGradient3830)"
|
||||
id="text3481"
|
||||
class="TextShape"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Bold;stroke:url(#linearGradient3830)"
|
||||
id="tspan3483"
|
||||
font-weight="700"
|
||||
font-size="3104px"
|
||||
class="TextParagraph"><tspan
|
||||
id="tspan3485"
|
||||
y="3586"
|
||||
x="14950"
|
||||
class="TextPosition"
|
||||
style="font-size:5080px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;stroke:url(#linearGradient3830);font-family:Sans;-inkscape-font-specification:Sans Bold">N</tspan></tspan></text>
|
||||
</g></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 513 B |
|
Before Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 871 B |
|
Before Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
@@ -80,8 +80,7 @@ LogsDialog::LogsDialog(QWidget *parent) :
|
||||
timeTicker->setDateTimeFormat("hh:mm:ss.zzz");
|
||||
axisRect->axis(QCPAxis::atBottom)->setTicker(timeTicker);
|
||||
QDateTime now = QDateTime::currentDateTime();
|
||||
axisRect->axis(QCPAxis::atBottom)->setRange(now.addSecs(-60 * 60 * 2).toTime_t(), now.toTime_t());
|
||||
|
||||
axisRect->axis(QCPAxis::atBottom)->setRange(now.addSecs(-60 * 60 * 2).toMSecsSinceEpoch(), now.toMSecsSinceEpoch());
|
||||
axisRect->axis(QCPAxis::atLeft)->setTickLabels(false);
|
||||
axisRect->addAxis(QCPAxis::atLeft);
|
||||
axisRect->addAxis(QCPAxis::atRight);
|
||||
@@ -884,13 +883,12 @@ void LogsDialog::plotLogs()
|
||||
if (plotCoords.max_y < y) plotCoords.max_y = y;
|
||||
|
||||
if (time_str.contains('.')) {
|
||||
time = QDateTime::fromString(time_str, "yyyy-MM-dd HH:mm:ss.zzz")
|
||||
.toTime_t();
|
||||
time = QDateTime::fromString(time_str, "yyyy-MM-dd HH:mm:ss.zzz").toMSecsSinceEpoch();
|
||||
time += time_str.mid(time_str.indexOf('.')).toDouble();
|
||||
} else {
|
||||
time = QDateTime::fromString(time_str, "yyyy-MM-dd HH:mm:ss")
|
||||
.toTime_t();
|
||||
time = QDateTime::fromString(time_str, "yyyy-MM-dd HH:mm:ss").toMSecsSinceEpoch();
|
||||
}
|
||||
|
||||
plotCoords.x.push_back(time);
|
||||
|
||||
if(plots.min_x == INVALID_MIN)
|
||||
|
||||
@@ -1426,7 +1426,7 @@ void MainWindow::importAppSettings()
|
||||
// Do the import
|
||||
QSettings fromSettings(impFile, QSettings::IniFormat);
|
||||
if (!g.importSettings(&fromSettings)) {
|
||||
QMessageBox::critical(this, CPN_STR_APP_NAME, tr("The settings could not be imported."), QMessageBox::Ok, 0);
|
||||
QMessageBox::critical(this, CPN_STR_APP_NAME, tr("The settings could not be imported."), QMessageBox::Ok);
|
||||
return;
|
||||
}
|
||||
resultMsg = tr("<html>" \
|
||||
|
||||
@@ -1426,7 +1426,7 @@ void MdiChild::setCurrentFile(const QString & fileName)
|
||||
|
||||
void MdiChild::forceNewFilename(const QString & suffix, const QString & ext)
|
||||
{
|
||||
curFile.replace(QRegExp("\\.(eepe|bin|hex|otx|etx)$"), suffix + "." + ext);
|
||||
curFile.replace(QRegularExpression("\\.(eepe|bin|hex|otx|etx)$"), suffix + "." + ext);
|
||||
}
|
||||
|
||||
bool MdiChild::convertStorage(Board::Type from, Board::Type to, bool newFile)
|
||||
@@ -1518,8 +1518,7 @@ void MdiChild::writeSettings(StatusDialog * status, bool toRadio) // write to T
|
||||
|
||||
QCheckBox *cb = new QCheckBox(tr("Do not show this message again"));
|
||||
msgbox.setCheckBox(cb);
|
||||
connect(cb, &QCheckBox::stateChanged, [=](const int &state){ g.confirmWriteModelsAndSettings(!state); });
|
||||
|
||||
connect(cb, &QCheckBox::checkStateChanged, [=](const int &state){ g.confirmWriteModelsAndSettings(!state); });
|
||||
if (msgbox.exec() == QMessageBox::Abort)
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ set(${PROJECT_NAME}_NAMES
|
||||
AddHeadersSources()
|
||||
|
||||
# AUTOMOC does not detect so manually process
|
||||
qt5_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
qt_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
${${PROJECT_NAME}_HDRS}
|
||||
)
|
||||
|
||||
@@ -39,7 +39,7 @@ add_library(${PROJECT_NAME}
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PRIVATE
|
||||
${CPN_COMMON_LIB}
|
||||
Qt5::Multimedia
|
||||
Qt::Multimedia
|
||||
)
|
||||
|
||||
target_include_directories(${PROJECT_NAME}
|
||||
|
||||
@@ -31,6 +31,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model,
|
||||
functions(model ? model->customFn : generalSettings.customFn),
|
||||
mediaPlayerCurrent(-1),
|
||||
mediaPlayer(nullptr),
|
||||
audioOutput(new QAudioOutput()),
|
||||
modelsUpdateCnt(0)
|
||||
{
|
||||
lock = true;
|
||||
@@ -245,16 +246,16 @@ CustomFunctionsPanel::~CustomFunctionsPanel()
|
||||
delete tabFilterFactory;
|
||||
}
|
||||
|
||||
void CustomFunctionsPanel::onMediaPlayerStateChanged(QMediaPlayer::State state)
|
||||
void CustomFunctionsPanel::onMediaPlayerPlaybackStateChanged(QMediaPlayer::PlaybackState state)
|
||||
{
|
||||
if (state != QMediaPlayer::PlayingState)
|
||||
stopSound(mediaPlayerCurrent);
|
||||
}
|
||||
|
||||
void CustomFunctionsPanel::onMediaPlayerError(QMediaPlayer::Error error)
|
||||
void CustomFunctionsPanel::onMediaPlayerErrorOccurred(QMediaPlayer::Error error, const QString &errorString)
|
||||
{
|
||||
stopSound(mediaPlayerCurrent);
|
||||
QMessageBox::critical(this, CPN_STR_TTL_ERROR, tr("Error occurred while trying to play sound, possibly the file is already opened. (Err: %1 [%2])").arg(mediaPlayer ? mediaPlayer->errorString() : "").arg(error));
|
||||
QMessageBox::critical(this, CPN_STR_TTL_ERROR, tr("Error occurred while trying to play sound, possibly the file is already opened. (Err: %1 [%2])").arg(errorString).arg(error));
|
||||
}
|
||||
|
||||
bool CustomFunctionsPanel::playSound(int index)
|
||||
@@ -288,13 +289,16 @@ bool CustomFunctionsPanel::playSound(int index)
|
||||
if (mediaPlayer)
|
||||
stopSound(mediaPlayerCurrent);
|
||||
|
||||
mediaPlayer = new QMediaPlayer(this, QMediaPlayer::LowLatency);
|
||||
mediaPlayer = new QMediaPlayer(this);
|
||||
mediaPlayer->setAudioOutput(audioOutput);
|
||||
|
||||
if (functions[index].func == FuncPlaySound)
|
||||
mediaPlayer->setMedia(QUrl(path.prepend("qrc")));
|
||||
mediaPlayer->setSource(QUrl(path.prepend("qrc")));
|
||||
else
|
||||
mediaPlayer->setMedia(QUrl::fromLocalFile(path));
|
||||
connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &CustomFunctionsPanel::onMediaPlayerStateChanged);
|
||||
connect(mediaPlayer, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>(&QMediaPlayer::error), this, &CustomFunctionsPanel::onMediaPlayerError);
|
||||
mediaPlayer->setSource(QUrl::fromLocalFile(path));
|
||||
|
||||
connect(mediaPlayer, &QMediaPlayer::playbackStateChanged, this, &CustomFunctionsPanel::onMediaPlayerPlaybackStateChanged);
|
||||
connect(mediaPlayer, &QMediaPlayer::errorOccurred, this, &CustomFunctionsPanel::onMediaPlayerErrorOccurred);
|
||||
mediaPlayerCurrent = index;
|
||||
mediaPlayer->play();
|
||||
return true;
|
||||
@@ -304,7 +308,9 @@ void CustomFunctionsPanel::stopSound(int index)
|
||||
{
|
||||
if (index > -1 && index < (int)DIM(playBT))
|
||||
playBT[index]->setChecked(false);
|
||||
|
||||
mediaPlayerCurrent = -1;
|
||||
|
||||
if (mediaPlayer) {
|
||||
disconnect(mediaPlayer, 0, this, 0);
|
||||
mediaPlayer->stop();
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "filtereditemmodels.h"
|
||||
|
||||
#include <QMediaPlayer>
|
||||
#include <QAudioOutput>
|
||||
|
||||
class TimerEdit;
|
||||
|
||||
@@ -53,8 +54,9 @@ class CustomFunctionsPanel : public GenericPanel
|
||||
bool playSound(int index);
|
||||
void stopSound(int index);
|
||||
void toggleSound(bool play);
|
||||
void onMediaPlayerStateChanged(QMediaPlayer::State state);
|
||||
void onMediaPlayerError(QMediaPlayer::Error error);
|
||||
void onMediaPlayerPlaybackStateChanged(QMediaPlayer::PlaybackState state);
|
||||
void onMediaPlayerErrorOccurred(QMediaPlayer::Error error, const QString &errorString);
|
||||
|
||||
void cmDelete();
|
||||
void cmCopy();
|
||||
void cmPaste();
|
||||
@@ -107,6 +109,7 @@ class CustomFunctionsPanel : public GenericPanel
|
||||
QComboBox * fswtchRepeat[CPN_MAX_SPECIAL_FUNCTIONS];
|
||||
QComboBox * fswtchGVmode[CPN_MAX_SPECIAL_FUNCTIONS];
|
||||
QMediaPlayer * mediaPlayer;
|
||||
QAudioOutput * audioOutput;
|
||||
|
||||
int selectedIndex;
|
||||
int fswCapability;
|
||||
|
||||
@@ -391,41 +391,53 @@ void InputsPanel::expoAdd()
|
||||
gm_openExpo(index);
|
||||
}
|
||||
|
||||
QAction * InputsPanel::addAct(const QString & icon, const QString & text, const char * slot, const QKeySequence & shortcut, bool enabled)
|
||||
{
|
||||
QAction * newAction = new QAction(this);
|
||||
newAction->setMenuRole(QAction::NoRole);
|
||||
newAction->setText(text);
|
||||
newAction->setIcon(CompanionIcon(icon));
|
||||
newAction->setShortcut(shortcut);
|
||||
newAction->setEnabled(enabled);
|
||||
connect(newAction, SIGNAL(triggered()), this, slot);
|
||||
return newAction;
|
||||
}
|
||||
|
||||
void InputsPanel::expolistWidget_customContextMenuRequested(QPoint pos)
|
||||
{
|
||||
QPoint globalPos = ExposlistWidget->mapToGlobal(pos);
|
||||
|
||||
const QClipboard *clipboard = QApplication::clipboard();
|
||||
const QMimeData *mimeData = clipboard->mimeData();
|
||||
bool hasData = mimeData->hasFormat(MIMETYPE_EXPO);
|
||||
bool hasClipData = mimeData->hasFormat(MIMETYPE_EXPO);
|
||||
|
||||
selectedIdx = getIndexFromSelected();
|
||||
inputIdx = getInputIndexFromSelected();
|
||||
|
||||
QMenu contextMenu;
|
||||
QMenu *contextMenuLines = contextMenu.addMenu(tr("Lines"));
|
||||
contextMenuLines->addAction(CompanionIcon("add.png"), tr("&Add"), this, SLOT(expoAdd()), tr("Ctrl+A"));
|
||||
contextMenuLines->addAction(CompanionIcon("edit.png"), tr("&Edit"), this, SLOT(expoOpen()), tr("Enter"));
|
||||
contextMenuLines->addAction(addAct("add.png", tr("&Add"), SLOT(expoAdd()), tr("Ctrl+A")));
|
||||
contextMenuLines->addAction(addAct("edit.png", tr("&Edit"), SLOT(expoOpen()), tr("Enter")));
|
||||
contextMenuLines->addSeparator();
|
||||
contextMenuLines->addAction(CompanionIcon("clear.png"), tr("&Delete"), this, SLOT(exposDelete()), tr("Delete"));
|
||||
contextMenuLines->addAction(CompanionIcon("copy.png"), tr("&Copy"), this, SLOT(exposCopy()), tr("Ctrl+C"));
|
||||
contextMenuLines->addAction(CompanionIcon("cut.png"), tr("&Cut"), this, SLOT(exposCut()), tr("Ctrl+X"));
|
||||
contextMenuLines->addAction(CompanionIcon("paste.png"), tr("&Paste"), this, SLOT(exposPaste()), tr("Ctrl+V"))->setEnabled(hasData);
|
||||
contextMenuLines->addAction(CompanionIcon("duplicate.png"), tr("Du&plicate"), this, SLOT(exposDuplicate()), tr("Ctrl+U"));
|
||||
contextMenuLines->addAction(addAct("clear.png", tr("&Delete"), SLOT(exposDelete()), tr("Delete")));
|
||||
contextMenuLines->addAction(addAct("copy.png", tr("&Copy"), SLOT(exposCopy()), tr("Ctrl+C")));
|
||||
contextMenuLines->addAction(addAct("cut.png", tr("&Cut"), SLOT(exposCut()), tr("Ctrl+X")));
|
||||
contextMenuLines->addAction(addAct("paste.png", tr("&Paste"), SLOT(exposPaste()), tr("Ctrl+V"), hasClipData));
|
||||
contextMenuLines->addAction(addAct("duplicate.png", tr("Du&plicate"), SLOT(exposDuplicate()), tr("Ctrl+U")));
|
||||
contextMenuLines->addSeparator();
|
||||
contextMenuLines->addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(moveExpoUp()), tr("Ctrl+Up"));
|
||||
contextMenuLines->addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(moveExpoDown()), tr("Ctrl+Down"));
|
||||
contextMenuLines->addAction(addAct("moveup.png", tr("Move Up"), SLOT(moveExpoUp()), tr("Ctrl+Up")));
|
||||
contextMenuLines->addAction(addAct("movedown.png", tr("Move Down"), SLOT(moveExpoDown()), tr("Ctrl+Down")));
|
||||
|
||||
QMenu *contextMenuInputs = contextMenu.addMenu(tr("Input"));
|
||||
contextMenuInputs->addAction(CompanionIcon("arrow-right.png"), tr("Insert"), this, SLOT(cmInputInsert()))->setEnabled(cmInputInsertAllowed());
|
||||
contextMenuInputs->addAction(CompanionIcon("arrow-left.png"), tr("Delete"), this, SLOT(cmInputDelete()));
|
||||
contextMenuInputs->addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(cmInputMoveUp()))->setEnabled(cmInputMoveUpAllowed());
|
||||
contextMenuInputs->addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(cmInputMoveDown()))->setEnabled(cmInputMoveDownAllowed());
|
||||
contextMenuInputs->addAction(addAct("arrow-right.png", tr("Insert"), SLOT(cmInputInsert()), 0, cmInputInsertAllowed()));
|
||||
contextMenuInputs->addAction(addAct("arrow-left.png", tr("Delete"), SLOT(cmInputDelete()), 0));
|
||||
contextMenuInputs->addAction(addAct("moveup.png", tr("Move Up"), SLOT(cmInputMoveUp()), 0, cmInputMoveUpAllowed()));
|
||||
contextMenuInputs->addAction(addAct("movedown.png", tr("Move Down"), SLOT(cmInputMoveDown()), 0, cmInputMoveDownAllowed()));
|
||||
contextMenuInputs->addSeparator();
|
||||
contextMenuInputs->addAction(CompanionIcon("clear.png"), tr("Clear"), this, SLOT(cmInputClear()))->setEnabled(isExpoIndex(selectedIdx));
|
||||
contextMenuInputs->addAction(addAct("clear.png", tr("Clear"), SLOT(cmInputClear()), 0, isExpoIndex(selectedIdx)));
|
||||
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"), this, SLOT(clearExpos()));
|
||||
contextMenu.addAction(addAct( "clear.png", tr("Clear All"), SLOT(clearExpos())));
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addActions(ExposlistWidget->actions());
|
||||
contextMenu.exec(globalPos);
|
||||
|
||||
@@ -96,4 +96,5 @@ class InputsPanel : public ModelPanel
|
||||
int getInputIndexFromSelected();
|
||||
void updateItemModels();
|
||||
void connectItemModelEvents(const int id);
|
||||
QAction * addAct(const QString & icon, const QString & text, const char * slot, const QKeySequence & shortcut = 0, bool enabled = true);
|
||||
};
|
||||
|
||||
@@ -131,7 +131,7 @@ void MixersListWidget::dropEvent(QDropEvent * event)
|
||||
else {
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
dropMimeData(indexAt(event->pos()).row(), event->mimeData(), event->dropAction());
|
||||
dropMimeData(indexAt(event->position().toPoint()).row(), event->mimeData(), event->dropAction());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -419,27 +419,39 @@ void MixesPanel::mixerAdd()
|
||||
gm_openMix(index);
|
||||
}
|
||||
|
||||
QAction * MixesPanel::addAct(const QString & icon, const QString & text, const char * slot, const QKeySequence & shortcut, bool enabled)
|
||||
{
|
||||
QAction * newAction = new QAction(this);
|
||||
newAction->setMenuRole(QAction::NoRole);
|
||||
newAction->setText(text);
|
||||
newAction->setIcon(CompanionIcon(icon));
|
||||
newAction->setShortcut(shortcut);
|
||||
newAction->setEnabled(enabled);
|
||||
connect(newAction, SIGNAL(triggered()), this, slot);
|
||||
return newAction;
|
||||
}
|
||||
|
||||
void MixesPanel::mixerlistWidget_customContextMenuRequested(QPoint pos)
|
||||
{
|
||||
QPoint globalPos = mixersListWidget->mapToGlobal(pos);
|
||||
|
||||
const QClipboard *clipboard = QApplication::clipboard();
|
||||
const QMimeData *mimeData = clipboard->mimeData();
|
||||
bool hasData = mimeData->hasFormat("application/x-companion-mix");
|
||||
bool hasClipData = mimeData->hasFormat("application/x-companion-mix");
|
||||
|
||||
QMenu contextMenu;
|
||||
contextMenu.addAction(CompanionIcon("add.png"), tr("&Add"), this, SLOT(mixerAdd()), tr("Ctrl+A"));
|
||||
contextMenu.addAction(CompanionIcon("edit.png"), tr("&Edit"), this, SLOT(mixerOpen()), tr("Enter"));
|
||||
contextMenu.addAction(CompanionIcon("fuses.png"), tr("&Toggle highlight"), this, SLOT(mixerHighlight()), tr("Ctrl+T"));
|
||||
contextMenu.addAction(addAct("add.png", tr("&Add"), SLOT(mixerAdd()), tr("Ctrl+A")));
|
||||
contextMenu.addAction(addAct("edit.png", tr("&Edit"), SLOT(mixerOpen()), tr("Enter")));
|
||||
contextMenu.addAction(addAct("fuses.png", tr("&Toggle highlight"), SLOT(mixerHighlight()), tr("Ctrl+T")));
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addAction(CompanionIcon("clear.png"), tr("&Delete"), this, SLOT(mixersDelete()), tr("Delete"));
|
||||
contextMenu.addAction(CompanionIcon("copy.png"), tr("&Copy"), this, SLOT(mixersCopy()), tr("Ctrl+C"));
|
||||
contextMenu.addAction(CompanionIcon("cut.png"), tr("C&ut"), this, SLOT(mixersCut()), tr("Ctrl+X"));
|
||||
contextMenu.addAction(CompanionIcon("paste.png"), tr("&Paste"), this, SLOT(mixersPaste()), tr("Ctrl+V"))->setEnabled(hasData);
|
||||
contextMenu.addAction(CompanionIcon("duplicate.png"), tr("Du&plicate"), this, SLOT(mixersDuplicate()), tr("Ctrl+U"));
|
||||
contextMenu.addAction(addAct("clear.png", tr("&Delete"), SLOT(mixersDelete()), tr("Delete")));
|
||||
contextMenu.addAction(addAct("copy.png", tr("&Copy"), SLOT(mixersCopy()), tr("Ctrl+C")));
|
||||
contextMenu.addAction(addAct("cut.png", tr("C&ut"), SLOT(mixersCut()), tr("Ctrl+X")));
|
||||
contextMenu.addAction(addAct("paste.png", tr("&Paste"), SLOT(mixersPaste()), tr("Ctrl+V"), hasClipData));
|
||||
contextMenu.addAction(addAct("duplicate.png", tr("Du&plicate"), SLOT(mixersDuplicate()), tr("Ctrl+U")));
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(moveMixUp()), tr("Ctrl+Up"));
|
||||
contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(moveMixDown()), tr("Ctrl+Down"));
|
||||
contextMenu.addAction(addAct("moveup.png", tr("Move Up"), SLOT(moveMixUp()), tr("Ctrl+Up")));
|
||||
contextMenu.addAction(addAct("movedown.png", tr("Move Down"), SLOT(moveMixDown()), tr("Ctrl+Down")));
|
||||
contextMenu.addSeparator();
|
||||
contextMenu.addActions(mixersListWidget->actions());
|
||||
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _MIXES_H_
|
||||
#define _MIXES_H_
|
||||
#pragma once
|
||||
|
||||
#include "modeledit.h"
|
||||
#include "mixerslistwidget.h"
|
||||
@@ -84,6 +83,5 @@ class MixesPanel : public ModelPanel
|
||||
QString getMixerText(int dest, bool newChannel);
|
||||
void connectItemModelEvents(const int id);
|
||||
void updateItemModels();
|
||||
QAction * addAct(const QString & icon, const QString & text, const char * slot, const QKeySequence & shortcut = 0, bool enabled = true);
|
||||
};
|
||||
|
||||
#endif // _MIXES_H_
|
||||
|
||||
@@ -550,7 +550,7 @@ QString MultiModelPrinter::printOutputs()
|
||||
for (int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
int count = 0;
|
||||
for (int k=0; k < modelPrinterMap.size(); k++)
|
||||
count = std::max(count, modelPrinterMap.value(k).first->mixes(i).size());
|
||||
count = std::max(count, (int)modelPrinterMap.value(k).first->mixes(i).size());
|
||||
if (!count)
|
||||
continue;
|
||||
columns.appendRowStart();
|
||||
@@ -606,7 +606,7 @@ QString MultiModelPrinter::printInputs()
|
||||
for (int i=0; i<std::max(4, firmware->getCapability(VirtualInputs)); i++) {
|
||||
int count = 0;
|
||||
for (int k=0; k < modelPrinterMap.size(); k++) {
|
||||
count = std::max(count, modelPrinterMap.value(k).first->expos(i).size());
|
||||
count = std::max(count, (int)modelPrinterMap.value(k).first->expos(i).size());
|
||||
}
|
||||
if (count > 0) {
|
||||
columns.appendRowStart();
|
||||
@@ -636,7 +636,7 @@ QString MultiModelPrinter::printMixers()
|
||||
for (int i=0; i<firmware->getCapability(Outputs); i++) {
|
||||
int count = 0;
|
||||
for (int k=0; k < modelPrinterMap.size(); k++) {
|
||||
count = std::max(count, modelPrinterMap.value(k).first->mixes(i).size());
|
||||
count = std::max(count, (int)modelPrinterMap.value(k).first->mixes(i).size());
|
||||
}
|
||||
if (count > 0) {
|
||||
columns.appendRowStart();
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
#include <QElapsedTimer>
|
||||
#include <QMutexLocker>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include <QNtfsPermissionCheckGuard>
|
||||
#endif
|
||||
|
||||
#define SYNC_MAX_ERRORS 50 // give up after this many errors per destination
|
||||
|
||||
// a flood of log messages can make the UI unresponsive so we'll introduce a dynamic sleep period based on log frequency (values in [us])
|
||||
@@ -34,10 +38,6 @@
|
||||
#define PAUSE_MINTM 100UL
|
||||
#define PAUSE_MAXTM 75000UL
|
||||
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(5, 5, 0))
|
||||
#define QtInfoMsg QtMsgType(4)
|
||||
#endif
|
||||
|
||||
#define PRINT_CREATE(str) emitProgressMessage((str), QtInfoMsg)
|
||||
#define PRINT_REPLACE(str) emitProgressMessage((str), QtWarningMsg)
|
||||
//#define PRINT_DELETE(str) emitProgressMessage((str), QtCriticalMsg) // unused
|
||||
@@ -46,13 +46,6 @@
|
||||
#define PRINT_INFO(str) emit progressMessage((str)) // this is always emitted regardless of logLevel option
|
||||
#define PRINT_SEP() PRINT_INFO(QString(70, '='))
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
|
||||
#define FILTER_RE_SYNTX QRegExp::Wildcard
|
||||
#else
|
||||
#define FILTER_RE_SYNTX QRegExp::WildcardUnix
|
||||
#endif
|
||||
|
||||
SyncProcess::SyncProcess(const SyncProcess::SyncOptions & options) :
|
||||
m_options(options),
|
||||
m_pauseTime(PAUSE_MINTM),
|
||||
@@ -60,6 +53,10 @@ SyncProcess::SyncProcess(const SyncProcess::SyncOptions & options) :
|
||||
{
|
||||
qRegisterMetaType<SyncProcess::SyncStatus>();
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
QNtfsPermissionCheckGuard permissionGuard; // check is enabled
|
||||
#endif
|
||||
|
||||
if (m_options.compareType == OVERWR_ALWAYS && (m_options.direction == SYNC_A2B_B2A || m_options.direction == SYNC_B2A_A2B))
|
||||
m_options.compareType = OVERWR_IF_DIFF;
|
||||
|
||||
@@ -72,23 +69,18 @@ SyncProcess::SyncProcess(const SyncProcess::SyncOptions & options) :
|
||||
|
||||
if (!m_options.excludeFilter.isEmpty()) {
|
||||
for (const QString & f : m_options.excludeFilter.split(',', Qt::SkipEmptyParts))
|
||||
m_excludeFilters.append(QRegExp(f, ((m_dirFilters & QDir::CaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive), FILTER_RE_SYNTX));
|
||||
m_excludeFilters.append(QRegularExpression(QRegularExpression::wildcardToRegularExpression(f),
|
||||
((m_dirFilters & QDir::CaseSensitive) ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption)));
|
||||
}
|
||||
|
||||
if (m_options.flags & OPT_DRY_RUN)
|
||||
testRunStr = tr("[TEST RUN] ");
|
||||
|
||||
//qDebug() << m_options;
|
||||
#ifdef Q_OS_WIN
|
||||
qt_ntfs_permission_lookup++; // global enable NTFS permissions checking
|
||||
#endif
|
||||
}
|
||||
} // for Q_OS_WIN as the permissionGuard goes out of scope the check is disabled
|
||||
|
||||
SyncProcess::~SyncProcess()
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
qt_ntfs_permission_lookup--; // global revert NTFS permissions checking
|
||||
#endif
|
||||
}
|
||||
|
||||
void SyncProcess::stop()
|
||||
@@ -193,8 +185,8 @@ SyncProcess::FileFilterResult SyncProcess::fileFilter(const QFileInfo & fileInfo
|
||||
return FILE_OVERSIZE;
|
||||
|
||||
if (!m_excludeFilters.isEmpty() && (!(m_dirFilters & QDir::AllDirs) || fileInfo.isFile())) {
|
||||
for (QVector<QRegExp>::const_iterator it = m_excludeFilters.constBegin(), end = m_excludeFilters.constEnd(); it != end; ++it) {
|
||||
if (QRegExp(*it).exactMatch(fileInfo.fileName()))
|
||||
for (QVector<QRegularExpression>::const_iterator it = m_excludeFilters.constBegin(), end = m_excludeFilters.constEnd(); it != end; ++it) {
|
||||
if (QRegularExpression(*it).match(fileInfo.fileName()).hasMatch())
|
||||
return FILE_EXCLUDE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef PROCESS_SYNC_H
|
||||
#define PROCESS_SYNC_H
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QDateTime>
|
||||
@@ -28,7 +27,7 @@
|
||||
#include <QDir>
|
||||
#include <QDirIterator>
|
||||
#include <QReadWriteLock>
|
||||
#include <QRegExp>
|
||||
#include <QRegularExpression>
|
||||
#include <QVector>
|
||||
|
||||
class SyncProcess : public QObject
|
||||
@@ -139,7 +138,7 @@ class SyncProcess : public QObject
|
||||
SyncStatus m_stat;
|
||||
QReadWriteLock stopReqMutex;
|
||||
QString testRunStr;
|
||||
QVector<QRegExp> m_excludeFilters;
|
||||
QVector<QRegularExpression> m_excludeFilters;
|
||||
QStringList m_dirIteratorFilters;
|
||||
QDir::Filters m_dirFilters;
|
||||
QDateTime m_startTime;
|
||||
@@ -151,5 +150,3 @@ Q_DECLARE_METATYPE(SyncProcess::SyncOptions)
|
||||
Q_DECLARE_TYPEINFO(SyncProcess::SyncOptions, Q_MOVABLE_TYPE);
|
||||
Q_DECLARE_METATYPE(SyncProcess::SyncStatus)
|
||||
Q_DECLARE_TYPEINFO(SyncProcess::SyncStatus, Q_PRIMITIVE_TYPE);
|
||||
|
||||
#endif // PROCESS_SYNC_H
|
||||
|
||||
@@ -32,7 +32,7 @@ set(${PROJECT_NAME}_HDRS
|
||||
)
|
||||
|
||||
# AUTOMOC does not detect so manually process
|
||||
qt5_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
qt_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
${${PROJECT_NAME}_HDRS}
|
||||
)
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ class AutoBitMappedComboBox : public QComboBox, public AutoWidget
|
||||
void setField(RawSwitch & field, GenericPanel * panel = nullptr);
|
||||
|
||||
void setAutoIndexes();
|
||||
void setModel(QAbstractItemModel * model);
|
||||
void setModel(QAbstractItemModel * model) override;
|
||||
|
||||
signals:
|
||||
void currentDataChanged(int value);
|
||||
|
||||
@@ -24,12 +24,10 @@
|
||||
AutoComboBox::AutoComboBox(QWidget * parent):
|
||||
QComboBox(parent),
|
||||
AutoWidget(),
|
||||
m_field(nullptr),
|
||||
m_next(0),
|
||||
m_hasModel(false),
|
||||
m_rawSource(nullptr),
|
||||
m_rawSwitch(nullptr)
|
||||
m_hasModel(false)
|
||||
{
|
||||
initField();
|
||||
connect(this, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &AutoComboBox::onCurrentIndexChanged);
|
||||
}
|
||||
|
||||
@@ -37,82 +35,104 @@ AutoComboBox::~AutoComboBox()
|
||||
{
|
||||
}
|
||||
|
||||
void AutoComboBox::initField()
|
||||
{
|
||||
m_field = nullptr;
|
||||
m_rawSource = nullptr;
|
||||
m_rawSwitch = nullptr;
|
||||
m_curveType = nullptr;
|
||||
m_flexType = nullptr;
|
||||
m_switchType = nullptr;
|
||||
}
|
||||
|
||||
void AutoComboBox::clear()
|
||||
{
|
||||
if (m_hasModel)
|
||||
return;
|
||||
|
||||
setLock(true);
|
||||
QComboBox::clear();
|
||||
m_next = 0;
|
||||
setLock(false);
|
||||
if (!m_hasModel) {
|
||||
setLock(true);
|
||||
QComboBox::clear();
|
||||
m_next = 0;
|
||||
setLock(false);
|
||||
}
|
||||
}
|
||||
|
||||
void AutoComboBox::insertItems(int index, const QStringList & items)
|
||||
{
|
||||
if (m_hasModel)
|
||||
return;
|
||||
if (!m_hasModel) {
|
||||
foreach(QString item, items)
|
||||
addItem(item);
|
||||
|
||||
foreach(QString item, items) {
|
||||
addItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
void AutoComboBox::addItem(const QString & item)
|
||||
{
|
||||
if (m_hasModel)
|
||||
return;
|
||||
|
||||
addItem(item, m_next++);
|
||||
if (!m_hasModel)
|
||||
addItem(item, m_next++);
|
||||
}
|
||||
|
||||
void AutoComboBox::addItem(const QString & item, int value)
|
||||
{
|
||||
if (m_hasModel)
|
||||
return;
|
||||
|
||||
setLock(true);
|
||||
QComboBox::addItem(item, value);
|
||||
setLock(false);
|
||||
updateValue();
|
||||
if (!m_hasModel) {
|
||||
setLock(true);
|
||||
QComboBox::addItem(item, value);
|
||||
setLock(false);
|
||||
updateValue();
|
||||
}
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(unsigned int & field, GenericPanel * panel)
|
||||
{
|
||||
m_field = (int *)&field;
|
||||
m_rawSource = nullptr;
|
||||
m_rawSwitch = nullptr;
|
||||
setFieldInit(panel);
|
||||
m_field = (int *)&field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(int & field, GenericPanel * panel)
|
||||
{
|
||||
m_field = &field;
|
||||
m_rawSource = nullptr;
|
||||
m_rawSwitch = nullptr;
|
||||
setFieldInit(panel);
|
||||
m_field = &field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(RawSource & field, GenericPanel * panel)
|
||||
{
|
||||
m_rawSource = &field;
|
||||
m_rawSwitch = nullptr;
|
||||
m_field = nullptr;
|
||||
setFieldInit(panel);
|
||||
m_rawSource = &field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(RawSwitch & field, GenericPanel * panel)
|
||||
{
|
||||
m_rawSwitch = &field;
|
||||
m_rawSource = nullptr;
|
||||
m_field = nullptr;
|
||||
setFieldInit(panel);
|
||||
m_rawSwitch = &field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(CurveData::CurveType & field, GenericPanel * panel)
|
||||
{
|
||||
setFieldInit(panel);
|
||||
m_curveType = &field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(Board::FlexType & field, GenericPanel * panel)
|
||||
{
|
||||
setFieldInit(panel);
|
||||
m_flexType = &field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setField(Board::SwitchType & field, GenericPanel * panel)
|
||||
{
|
||||
setFieldInit(panel);
|
||||
m_switchType = &field;
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setFieldInit(GenericPanel * panel)
|
||||
{
|
||||
initField();
|
||||
setPanel(panel);
|
||||
updateValue();
|
||||
}
|
||||
|
||||
void AutoComboBox::setModel(QAbstractItemModel * model)
|
||||
@@ -126,19 +146,16 @@ void AutoComboBox::setModel(QAbstractItemModel * model)
|
||||
|
||||
void AutoComboBox::setAutoIndexes()
|
||||
{
|
||||
if (m_hasModel)
|
||||
return;
|
||||
if (!m_hasModel) {
|
||||
for (int i = 0; i < count(); ++i)
|
||||
setItemData(i, i);
|
||||
|
||||
for (int i = 0; i < count(); ++i)
|
||||
setItemData(i, i);
|
||||
updateValue();
|
||||
updateValue();
|
||||
}
|
||||
}
|
||||
|
||||
void AutoComboBox::updateValue()
|
||||
{
|
||||
if (!m_field && !m_rawSource && !m_rawSwitch)
|
||||
return;
|
||||
|
||||
setLock(true);
|
||||
|
||||
if (m_field)
|
||||
@@ -147,6 +164,12 @@ void AutoComboBox::updateValue()
|
||||
setCurrentIndex(findData(m_rawSource->toValue()));
|
||||
else if (m_rawSwitch)
|
||||
setCurrentIndex(findData(m_rawSwitch->toValue()));
|
||||
else if (m_curveType)
|
||||
setCurrentIndex(findData(*m_curveType));
|
||||
else if (m_flexType)
|
||||
setCurrentIndex(findData(*m_flexType));
|
||||
else if (m_switchType)
|
||||
setCurrentIndex(findData(*m_switchType));
|
||||
|
||||
setLock(false);
|
||||
}
|
||||
@@ -158,21 +181,24 @@ void AutoComboBox::onCurrentIndexChanged(int index)
|
||||
|
||||
bool ok;
|
||||
const int val = itemData(index).toInt(&ok);
|
||||
if (!ok)
|
||||
return;
|
||||
|
||||
if (m_field && *m_field != val) {
|
||||
*m_field = val;
|
||||
}
|
||||
else if (m_rawSource && m_rawSource->toValue() != val) {
|
||||
*m_rawSource = RawSource(val);
|
||||
}
|
||||
else if (m_rawSwitch && m_rawSwitch->toValue() != val) {
|
||||
*m_rawSwitch = RawSwitch(val);
|
||||
}
|
||||
else
|
||||
return;
|
||||
if (ok) {
|
||||
if (m_field && *m_field != val)
|
||||
*m_field = val;
|
||||
else if (m_rawSource && m_rawSource->toValue() != val)
|
||||
*m_rawSource = RawSource(val);
|
||||
else if (m_rawSwitch && m_rawSwitch->toValue() != val)
|
||||
*m_rawSwitch = RawSwitch(val);
|
||||
else if (m_curveType && *m_curveType != val)
|
||||
*m_curveType = (CurveData::CurveType)val;
|
||||
else if (m_flexType && *m_flexType != val)
|
||||
*m_flexType = (Board::FlexType)val;
|
||||
else if (m_switchType && *m_switchType != val)
|
||||
*m_switchType = (Board::SwitchType)val;
|
||||
else
|
||||
return;
|
||||
|
||||
emit currentDataChanged(val);
|
||||
dataChanged();
|
||||
emit currentDataChanged(val);
|
||||
dataChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,9 +24,15 @@
|
||||
#include "autowidget.h"
|
||||
#include "rawsource.h"
|
||||
#include "rawswitch.h"
|
||||
#include "curvedata.h"
|
||||
#include "boards.h"
|
||||
|
||||
#include <QComboBox>
|
||||
|
||||
/*
|
||||
NOTE: Q_OBJECT classes cannot be templated and since we use signals we have no choice but to
|
||||
take this approach or create a class per data type
|
||||
*/
|
||||
class AutoComboBox : public QComboBox, public AutoWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -48,9 +54,12 @@ class AutoComboBox : public QComboBox, public AutoWidget
|
||||
void setField(int & field, GenericPanel * panel = nullptr);
|
||||
void setField(RawSource & field, GenericPanel * panel = nullptr);
|
||||
void setField(RawSwitch & field, GenericPanel * panel = nullptr);
|
||||
void setField(CurveData::CurveType & field, GenericPanel * panel = nullptr);
|
||||
void setField(Board::FlexType & field, GenericPanel * panel = nullptr);
|
||||
void setField(Board::SwitchType & field, GenericPanel * panel = nullptr);
|
||||
|
||||
void setAutoIndexes();
|
||||
void setModel(QAbstractItemModel * model);
|
||||
void setModel(QAbstractItemModel * model) override;
|
||||
|
||||
signals:
|
||||
void currentDataChanged(int value);
|
||||
@@ -59,11 +68,15 @@ class AutoComboBox : public QComboBox, public AutoWidget
|
||||
void onCurrentIndexChanged(int index);
|
||||
|
||||
private:
|
||||
int *m_field;
|
||||
int m_next;
|
||||
bool m_hasModel;
|
||||
int *m_field;
|
||||
RawSource *m_rawSource;
|
||||
RawSwitch *m_rawSwitch;
|
||||
CurveData::CurveType *m_curveType;
|
||||
Board::FlexType *m_flexType;
|
||||
Board::SwitchType *m_switchType;
|
||||
|
||||
void initField();
|
||||
void setFieldInit(GenericPanel * panel);
|
||||
};
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "autohexspinbox.h"
|
||||
#include <QRegularExpressionValidator>
|
||||
|
||||
AutoHexSpinBox::AutoHexSpinBox(QWidget * parent):
|
||||
QSpinBox(parent),
|
||||
@@ -56,7 +57,7 @@ void AutoHexSpinBox::setRange(const unsigned int min, const unsigned int max)
|
||||
|
||||
m_length = QString("%1").arg(max, 0, 16).size();
|
||||
|
||||
m_validator = new QRegExpValidator(QRegExp(QString("[0-9A-Fa-f]{1,%1}").arg(m_length)), this);
|
||||
m_validator = new QRegularExpressionValidator(QRegularExpression(QString("[0-9A-Fa-f]{1,%1}").arg(m_length)), this);
|
||||
}
|
||||
|
||||
void AutoHexSpinBox::updateValue()
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <QSpinBox>
|
||||
#include <QString>
|
||||
|
||||
class QRegExpValidator;
|
||||
class QRegularExpressionValidator;
|
||||
|
||||
class AutoHexSpinBox : public QSpinBox, public AutoWidget
|
||||
{
|
||||
@@ -57,6 +57,6 @@ class AutoHexSpinBox : public QSpinBox, public AutoWidget
|
||||
|
||||
private:
|
||||
unsigned int *m_field;
|
||||
QRegExpValidator *m_validator;
|
||||
QRegularExpressionValidator *m_validator;
|
||||
unsigned int m_length;
|
||||
};
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "autowidget.h"
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QRegExpValidator>
|
||||
|
||||
class AutoLineEdit: public QLineEdit, public AutoWidget
|
||||
{
|
||||
|
||||
@@ -144,7 +144,7 @@ CurveDialog::CurveDialog(QWidget * parent, ModelData & model, const int curveIdx
|
||||
int id = dialogFilterFactory->registerItemModel(new FilteredItemModel(CurveData::typeItemModel()),
|
||||
"Curve Type");
|
||||
ui->curveType->setModel(dialogFilterFactory->getItemModel(id));
|
||||
ui->curveType->setField((int &)curve.type);
|
||||
ui->curveType->setField(curve.type);
|
||||
connect(ui->curveType, &AutoComboBox::currentDataChanged, this, [&] () { on_curveTypeChanged(ui->curveType->currentIndex()) ;});
|
||||
|
||||
id = dialogFilterFactory->registerItemModel(new FilteredItemModel(CurveData::pointsItemModel()),
|
||||
|
||||
@@ -81,7 +81,7 @@ void CurveImageWidget::draw()
|
||||
|
||||
QImage image = curveImage->get();
|
||||
if (index < 0)
|
||||
image = image.mirrored(true, false);
|
||||
image = image.flipped(Qt::Horizontal);
|
||||
setPixmap(QPixmap::fromImage(image.scaled(height(), width())));
|
||||
|
||||
delete curveImage;
|
||||
|
||||
@@ -47,7 +47,7 @@ set(${PROJECT_NAME}_HDRS
|
||||
)
|
||||
|
||||
# AUTOMOC does not detect so manually process
|
||||
qt5_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
qt_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
${${PROJECT_NAME}_HDRS}
|
||||
)
|
||||
|
||||
@@ -58,7 +58,7 @@ add_library(${PROJECT_NAME}
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
PRIVATE
|
||||
${CPN_COMMON_LIB}
|
||||
Qt5::Svg
|
||||
Qt::Svg
|
||||
)
|
||||
|
||||
target_include_directories(${PROJECT_NAME}
|
||||
|
||||
@@ -172,8 +172,8 @@ void DebugOutput::processBytesReceived()
|
||||
const int sbValue = ui->console->verticalScrollBar()->value();
|
||||
const bool sbAtBottom = (sbValue == ui->console->verticalScrollBar()->maximum());
|
||||
|
||||
while (m_dataBufferDevice && m_dataBufferDevice->bytesAvailable() > 0) {
|
||||
text = m_dataBufferDevice->read(qint64(text.capacity()));
|
||||
while (m_dataBufferDevice && m_dataBufferDevice->bytesAvailable() > 0) { // Note: bytesAvailable() returns a boolean - TODO why?
|
||||
text = m_dataBufferDevice->read(DEBUG_OUTPUT_WIDGET_OUT_BUFF_SIZE);
|
||||
if (text.isEmpty())
|
||||
break;
|
||||
ui->console->moveCursor(QTextCursor::End);
|
||||
@@ -326,9 +326,9 @@ QRegularExpression DebugOutput::makeRegEx(const QString & input, bool * isExlusi
|
||||
}
|
||||
// no, convert arbitrary string to regex
|
||||
else {
|
||||
output.replace(QRegExp("^\\\\/"), "/"); // remove escape before fwd-slash ("\/...")
|
||||
output.replace(QRegularExpression("^\\\\/"), "/"); // remove escape before fwd-slash ("\/...")
|
||||
// escape all special chars except * and ?
|
||||
output.replace(QRegExp("(\\\\|\\.|\\+|\\^|\\$|\\||\\)|\\(|\\]|\\[|\\}|\\{)"), "\\\\1");
|
||||
output.replace(QRegularExpression("(\\\\|\\.|\\+|\\^|\\$|\\||\\)|\\(|\\]|\\[|\\}|\\{)"), "\\\\1");
|
||||
output.replace("\\*", "\x30").replace("\\?", "\x31"); // save escaped wildcard chars
|
||||
output.replace("*", ".*").replace("?", "."); // convert common wildcards
|
||||
output.replace("\x30", "\\\\*").replace("\x31", "\\\\?"); // replace escaped wildcard chars
|
||||
|
||||
@@ -375,10 +375,10 @@ void joystickDialog::on_okButton_clicked()
|
||||
|
||||
if (started && step < 4) {
|
||||
int resp = QMessageBox::warning(this, CPN_STR_TTL_WARNING, tr("Calibration not complete, save anyway?"),
|
||||
QDialogButtonBox::Ok | QMessageBox::Default, QDialogButtonBox::Cancel | QMessageBox::Escape, QMessageBox::NoButton);
|
||||
if (resp == QDialogButtonBox::Cancel)
|
||||
QMessageBox::Ok | QMessageBox::Cancel);
|
||||
if (resp == QMessageBox::Cancel)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
g.clearJSData();
|
||||
|
||||
|
||||
@@ -292,11 +292,7 @@ QWidget * RadioOutputsWidget::createLogicalSwitch(QWidget * parent, int switchNo
|
||||
QFont font = swtch->font();
|
||||
font.setBold(true);
|
||||
swtch->setFont(font);
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0)
|
||||
swtch->setMinimumWidth(swtch->fontMetrics().width("99") + 10);
|
||||
#else
|
||||
swtch->setMinimumWidth(swtch->fontMetrics().horizontalAdvance("99") + 10);
|
||||
#endif
|
||||
font.setBold(false);
|
||||
swtch->setFont(font);
|
||||
swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0')));
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "simulatedgps.h"
|
||||
#include <QtMath>
|
||||
#include <QDebug>
|
||||
#include <QTimeZone>
|
||||
|
||||
SimulatedGPS::SimulatedGPS()
|
||||
{
|
||||
@@ -109,7 +110,7 @@ void SimulatedGPS::update()
|
||||
return;
|
||||
}
|
||||
|
||||
dt = QDateTime::currentDateTime().toTimeSpec(Qt::UTC);
|
||||
dt = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());
|
||||
emitDateTimeChange();
|
||||
|
||||
double b2 = lat;
|
||||
@@ -140,7 +141,7 @@ void SimulatedGPS::update()
|
||||
lat = b3;
|
||||
lon = c3;
|
||||
|
||||
emitPositionChange();
|
||||
emitPositionChange();
|
||||
}
|
||||
|
||||
void SimulatedGPS::emitPositionChange()
|
||||
|
||||
@@ -73,7 +73,7 @@ void SimulatorLoader::registerSimulators()
|
||||
}
|
||||
|
||||
#if defined(__APPLE__)
|
||||
dir = QLibraryInfo::location(QLibraryInfo::PrefixPath) + "/Resources";
|
||||
dir.setPath(QLibraryInfo::path(QLibraryInfo::PrefixPath) + "/Resources");
|
||||
#else
|
||||
if (QDir::isAbsolutePath(SIMULATOR_LIB_SEARCH_PATH)) {
|
||||
dir.setPath(SIMULATOR_LIB_SEARCH_PATH);
|
||||
|
||||
@@ -397,7 +397,7 @@ QString convertGPSDate(QString input)
|
||||
// output is dd-MM-yyyy hh:mm:ss
|
||||
QString localDateString = dateParts[2] + "-" + dateParts[1] + "-20" + dateParts[0] + " " + dateTime[1];
|
||||
QString format("dd-MM-yyyy hh:mm:ss");
|
||||
QDateTime utcDate = QDateTime::fromString(localDateString, format).toTimeSpec(Qt::UTC);
|
||||
QDateTime utcDate = QDateTime::fromString(localDateString, format).toTimeZone(QTimeZone::UTC);
|
||||
return utcDate.toString(format);
|
||||
}
|
||||
|
||||
@@ -601,7 +601,7 @@ uint32_t TelemetryProviderFrSky::getNextGPSPacketData(uint32_t packetType)
|
||||
|
||||
void TelemetryProviderFrSky::setGPSDateTime(QString dateTime)
|
||||
{
|
||||
QDateTime dt = QDateTime::currentDateTime().toTimeSpec(Qt::UTC); // default to current systemtime
|
||||
QDateTime dt = QDateTime::currentDateTime().toTimeZone(QTimeZone::UTC); // default to current systemtime
|
||||
if (!dateTime.startsWith('*')) {
|
||||
QString format("dd-MM-yyyy hh:mm:ss");
|
||||
dt = QDateTime::fromString(dateTime, format);
|
||||
@@ -679,9 +679,9 @@ void TelemetryProviderFrSky::on_saveTelemetryvalues_clicked()
|
||||
out << ui -> cell6 -> text();
|
||||
out<<"\r\n";
|
||||
out << ui -> cell7 -> text();
|
||||
out<<"\r\n";
|
||||
out<<"\r\n";
|
||||
out << ui -> cell8 -> text();
|
||||
out<<"\r\n";
|
||||
out<<"\r\n";
|
||||
out << ui -> aspeed -> text();
|
||||
out<<"\r\n";
|
||||
out << ui -> gps_alt -> text();
|
||||
@@ -830,7 +830,7 @@ void TelemetryProviderFrSky::on_loadTelemetryvalues_clicked()
|
||||
n = in.readLine();
|
||||
ns = n.toDouble();
|
||||
ui -> cell7 -> setValue(ns);
|
||||
|
||||
|
||||
n = in.readLine();
|
||||
ns = n.toDouble();
|
||||
ui -> cell8 -> setValue(ns);
|
||||
|
||||
@@ -401,7 +401,7 @@ QString convertItemValue(QString sourceUnit, QString destUnit, QString value)
|
||||
return value;
|
||||
|
||||
int i = 0;
|
||||
while (conversions[i].source != NULL) {
|
||||
while (!conversions[i].source.isNull()) {
|
||||
if (conversions[i].source == sourceUnit && conversions[i].destination == destUnit) {
|
||||
return ((conversions[i].converter)(value));
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ class ButtonsWidget : public QWidget
|
||||
void paintEvent(QPaintEvent *)
|
||||
{
|
||||
QStyleOption opt;
|
||||
opt.init(this);
|
||||
opt.initFrom(this);
|
||||
QPainter p(this);
|
||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <QMessageBox>
|
||||
#include <QString>
|
||||
#include <QTextStream>
|
||||
#include <QRegularExpression>
|
||||
#if defined(JOYSTICKS) || defined(SIMU_AUDIO)
|
||||
#include <SDL.h>
|
||||
#undef main
|
||||
@@ -148,8 +149,8 @@ CommandLineParseResult cliOptions(SimulatorOptions * simOptions, int * profileId
|
||||
#ifdef Q_OS_WIN
|
||||
// For backwards compat. with QxtCommandOptions, convert Windows-style CLI switches (/opt) since QCommandLineParser doesn't support them
|
||||
for (int i=0; i < args.size(); ++i) {
|
||||
args[i].replace(QRegExp("^/([^\\s]{2,10})$"), "--\\1"); // long opts
|
||||
args[i].replace(QRegExp("^/([^\\s]){1}$"), "-\\1"); // short opts
|
||||
args[i].replace(QRegularExpression("^/([^\\s]{2,10})$"), "--\\1"); // long opts
|
||||
args[i].replace(QRegularExpression("^/([^\\s]){1}$"), "-\\1"); // short opts
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -202,7 +203,7 @@ CommandLineParseResult cliOptions(SimulatorOptions * simOptions, int * profileId
|
||||
|
||||
if (cliOptions.positionalArguments().size()) {
|
||||
QString datasrc = cliOptions.positionalArguments().at(0);
|
||||
if (datasrc.contains(QRegExp(".*\\.[\\w]{2,6}$"))) {
|
||||
if (datasrc.contains(QRegularExpression(".*\\.[\\w]{2,6}$"))) {
|
||||
simOptions->dataFile = datasrc;
|
||||
simOptions->startupDataType = SimulatorOptions::START_WITH_FILE;
|
||||
}
|
||||
@@ -252,9 +253,6 @@ CommandLineParseResult cliOptions(SimulatorOptions * simOptions, int * profileId
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
/* From doc: This attribute must be set before Q(Gui)Application is constructed. */
|
||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
|
||||
QApplication app(argc, argv);
|
||||
app.setApplicationName(APP_SIMULATOR);
|
||||
app.setApplicationVersion(VERSION);
|
||||
|
||||
@@ -92,7 +92,7 @@ void SplashLibraryDialog::getFileList()
|
||||
QDir myRes(":/images/library");
|
||||
QStringList tmp = myRes.entryList();
|
||||
for (int i = 0; i < tmp.size(); i++) {
|
||||
QFileInfo fileInfo = tmp.at(i);
|
||||
QFileInfo fileInfo(tmp.at(i));
|
||||
imageList.append(":/images/library/" + fileInfo.fileName());
|
||||
}
|
||||
}
|
||||
@@ -107,7 +107,7 @@ void SplashLibraryDialog::getFileList()
|
||||
myDir.setNameFilters(supportedImageFormats);
|
||||
QStringList tmp = myDir.entryList();
|
||||
for (int i = 0; i < tmp.size(); i++) {
|
||||
QFileInfo fileInfo = tmp.at(i);
|
||||
QFileInfo fileInfo(tmp.at(i));
|
||||
QString filename = libraryPath + "/" + fileInfo.fileName();
|
||||
QImage image(filename);
|
||||
if (!image.isNull()) {
|
||||
|
||||
@@ -24,7 +24,7 @@ set(${PROJECT_NAME}_MOC
|
||||
appdata.h
|
||||
)
|
||||
|
||||
qt5_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
qt_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
${${PROJECT_NAME}_MOC}
|
||||
)
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ void CompStoreObj::load(CompStoreObj * obj, const QString & name, const QString
|
||||
const QMetaProperty & prop = obj->metaObject()->property(idx);
|
||||
const QVariant currValue = prop.read(obj);
|
||||
QVariant savedValue = m_settings.value(pathForKey(key, group), def);
|
||||
if (savedValue.isValid() && savedValue.convert(currValue.userType()) && savedValue != currValue)
|
||||
if (savedValue.isValid() && savedValue.convert(currValue.metaType()) && savedValue != currValue)
|
||||
prop.write(obj, savedValue);
|
||||
}
|
||||
|
||||
@@ -366,7 +366,6 @@ bool ComponentAssetData::existsOnDisk()
|
||||
|
||||
ComponentData::ComponentData() : CompStoreObj(), index(-1)
|
||||
{
|
||||
qRegisterMetaTypeStreamOperators<ComponentData::ReleaseChannel>("ComponentData::ReleaseChannel");
|
||||
CompStoreObj::addObjectMapping(propertyGroup(), this);
|
||||
}
|
||||
|
||||
@@ -425,12 +424,6 @@ AppData::AppData() :
|
||||
CompStoreObj(),
|
||||
m_sessionId(0)
|
||||
{
|
||||
QMetaType::registerComparators<SimulatorOptions>();
|
||||
qRegisterMetaTypeStreamOperators<SimulatorOptions>("SimulatorOptions");
|
||||
qRegisterMetaTypeStreamOperators<AppData::NewModelAction>("AppData::NewModelAction");
|
||||
qRegisterMetaTypeStreamOperators<AppData::UpdateCheckFreq>("AppData::UpdateCheckFreq");
|
||||
qRegisterMetaTypeStreamOperators<AppData::SimuGenericKeysPos>("AppData::SimuGenericKeysPos");
|
||||
|
||||
CompStoreObj::addObjectMapping(propertyGroup(), this);
|
||||
|
||||
firstUse = !hasCurrentSettings();
|
||||
|
||||
@@ -41,13 +41,14 @@ int HexInterface::load(uint8_t *data, int maxsize)
|
||||
QString line = stream.readLine();
|
||||
|
||||
if(line.left(1)!=":") continue;
|
||||
|
||||
|
||||
int byteCount = getValueFromLine(line,1);
|
||||
int address = getValueFromLine(line,3,4);
|
||||
int recType = getValueFromLine(line,7);
|
||||
if (recType==0x02) {
|
||||
offset+=0x010000;
|
||||
}
|
||||
|
||||
if (recType==0x02)
|
||||
offset+=0x010000;
|
||||
|
||||
if(byteCount<0 || address<0 || recType<0)
|
||||
return 0;
|
||||
|
||||
@@ -59,11 +60,10 @@ int HexInterface::load(uint8_t *data, int maxsize)
|
||||
chkSum -= recType;
|
||||
chkSum -= address & 0xFF;
|
||||
chkSum -= address >> 8;
|
||||
for(int i=0; i<byteCount; i++)
|
||||
{
|
||||
quint8 v = getValueFromLine(line,(i*2)+9) & 0xFF;
|
||||
chkSum -= v;
|
||||
ba.append(v);
|
||||
for(int i=0; i<byteCount; i++) {
|
||||
quint8 v = getValueFromLine(line,(i*2)+9) & 0xFF;
|
||||
chkSum -= v;
|
||||
ba.append(v);
|
||||
}
|
||||
|
||||
quint8 retV = getValueFromLine(line,(byteCount*2)+9) & 0xFF;
|
||||
@@ -80,11 +80,10 @@ int HexInterface::load(uint8_t *data, int maxsize)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool HexInterface::save(const uint8_t * data, const int size)
|
||||
{
|
||||
int addr = 0;
|
||||
@@ -133,4 +132,3 @@ QString HexInterface::iHEXExtRec(quint8 bank)
|
||||
str += QString("%1").arg(chkSum, 2, 16, QChar('0'));
|
||||
return str.toUpper(); // output to file and lf;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,11 +19,10 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _HEXINTERFACE_H_
|
||||
#define _HEXINTERFACE_H_
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <QTextStream>
|
||||
#include <QString>
|
||||
|
||||
class HexInterface {
|
||||
public:
|
||||
@@ -40,5 +39,3 @@ class HexInterface {
|
||||
|
||||
QTextStream & stream;
|
||||
};
|
||||
|
||||
#endif // _HEXINTERFACE_H_
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
|
||||
|
||||
if(Qt5Widgets_FOUND)
|
||||
if(Qt6Widgets_FOUND)
|
||||
add_library(gtests-companion-lib STATIC EXCLUDE_FROM_ALL
|
||||
${googletest_SOURCE_DIR}/googletest/src/gtest-all.cc
|
||||
)
|
||||
@@ -30,5 +29,5 @@ if(Qt5Widgets_FOUND)
|
||||
target_link_libraries(gtests-companion gtests-companion-lib simulation firmwares storage common)
|
||||
message(STATUS "Added optional gtests-companion target")
|
||||
else()
|
||||
message(WARNING "WARNING: gtests target will not be available (check that Qt5Widgets are configured).")
|
||||
message(WARNING "WARNING: gtests target will not be available (check that QtWidgets are configured).")
|
||||
endif()
|
||||
|
||||
@@ -6,7 +6,7 @@ set(qcustomplot_HDRS
|
||||
qcustomplot.h
|
||||
)
|
||||
|
||||
qt5_wrap_cpp(qcustomplot_SRCS ${qcustomplot_HDRS})
|
||||
qt_wrap_cpp(qcustomplot_SRCS ${qcustomplot_HDRS})
|
||||
|
||||
add_library(qcustomplot ${qcustomplot_SRCS})
|
||||
target_link_libraries(qcustomplot PRIVATE ${CPN_COMMON_LIB} Qt5::Widgets Qt5::PrintSupport)
|
||||
target_link_libraries(qcustomplot PRIVATE ${CPN_COMMON_LIB} Qt::Widgets Qt::PrintSupport)
|
||||
|
||||
@@ -81,8 +81,7 @@ QStringList const Translations::getTranslationPaths()
|
||||
// Then the resource file
|
||||
paths << APP_TRANSLATIONS_RESOURCE_PATH;
|
||||
// Finally the system folder (more likely for Qt translations than Companion ones)
|
||||
paths << QLibraryInfo::location(QLibraryInfo::TranslationsPath);
|
||||
|
||||
paths << QLibraryInfo::path(QLibraryInfo::TranslationsPath);
|
||||
return paths;
|
||||
}
|
||||
|
||||
@@ -103,7 +102,8 @@ void Translations::installTranslators()
|
||||
g.locale("");
|
||||
}
|
||||
}
|
||||
qDebug() << "Locale name:" << locale.name() << "language:" << locale.nativeLanguageName() << "country:" << locale.nativeCountryName();
|
||||
|
||||
qDebug() << "Locale name:" << locale.name() << "language:" << locale.nativeLanguageName() << "country:" << locale.nativeTerritoryName();
|
||||
|
||||
// Remove any existing translators, this lets us re-translate w/out restart.
|
||||
foreach (QTranslator * t, appTranslators) {
|
||||
@@ -125,10 +125,7 @@ void Translations::installTranslators()
|
||||
// First try to install Qt translations for common GUI elements.
|
||||
|
||||
QStringList qtFiles = QStringList() << "qt";
|
||||
// After Qt5.3 some translation files are broken up into modules. We only need "qtbase" for now.
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))
|
||||
qtFiles << "qtbase";
|
||||
#endif
|
||||
|
||||
foreach (const QString & qtfile, qtFiles) {
|
||||
QTranslator * translator = new QTranslator(qApp);
|
||||
|
||||
@@ -38,7 +38,7 @@ set(${PROJECT_NAME}_MOC
|
||||
updatesdialog.h
|
||||
)
|
||||
|
||||
qt5_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
qt_wrap_cpp(${PROJECT_NAME}_SRCS
|
||||
${${PROJECT_NAME}_MOC}
|
||||
)
|
||||
|
||||
|
||||
@@ -186,7 +186,7 @@ UpdateOptionsDialog::UpdateOptionsDialog(QWidget * parent, UpdateInterface * ifa
|
||||
leSubFolders << leSubFolder;
|
||||
layout3->addWidget(leSubFolder, 1, 2, 1, 2);
|
||||
|
||||
connect(chkDownload, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
connect(chkDownload, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
chkDecompress->setChecked(false);
|
||||
chkCopy->setChecked(false);
|
||||
@@ -199,7 +199,7 @@ UpdateOptionsDialog::UpdateOptionsDialog(QWidget * parent, UpdateInterface * ifa
|
||||
}
|
||||
});
|
||||
|
||||
connect(chkDecompress, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
connect(chkDecompress, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
chkCopy->setChecked(false);
|
||||
chkInstall->setChecked(false);
|
||||
@@ -210,7 +210,7 @@ UpdateOptionsDialog::UpdateOptionsDialog(QWidget * parent, UpdateInterface * ifa
|
||||
}
|
||||
});
|
||||
|
||||
connect(chkCopy, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
connect(chkCopy, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
cboCopyFilterType->setEnabled(checked ? (processes & UpdateInterface::UPDFLG_CopyDest) && (!locked) : checked);
|
||||
leCopyFilter->setEnabled(checked ? (processes & UpdateInterface::UPDFLG_CopyDest) && (!locked) : checked);
|
||||
leSubFolder->setEnabled(checked ? (processes & UpdateInterface::UPDFLG_CopyDest) && (!locked) : checked);
|
||||
|
||||
@@ -50,8 +50,8 @@ UpdatesDialog::UpdatesDialog(QWidget * parent, UpdateFactories * factories) :
|
||||
ui->chkDelDecompress->setChecked(g.updDelDecompress());
|
||||
ui->leDownloadDir->setText(g.downloadDir());
|
||||
|
||||
connect(ui->chkDecompressDirUseDwnld, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
connect(ui->chkDecompressDirUseDwnld, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
ui->leDecompressDir->setText(g.decompressDir());
|
||||
ui->leDecompressDir->setEnabled(true);
|
||||
ui->btnDecompressSelect->setEnabled(true);
|
||||
@@ -75,8 +75,8 @@ UpdatesDialog::UpdatesDialog(QWidget * parent, UpdateFactories * factories) :
|
||||
ui->chkDecompressDirUseDwnld->setChecked(!ui->chkDecompressDirUseDwnld->isChecked());
|
||||
ui->chkDecompressDirUseDwnld->setChecked(g.decompressDirUseDwnld());
|
||||
|
||||
connect(ui->chkUpdateDirUseSD, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
connect(ui->chkUpdateDirUseSD, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
ui->leUpdateDir->setText(g.updateDir());
|
||||
ui->leUpdateDir->setEnabled(true);
|
||||
ui->btnUpdateSelect->setEnabled(true);
|
||||
@@ -122,7 +122,7 @@ UpdatesDialog::UpdatesDialog(QWidget * parent, UpdateFactories * factories) :
|
||||
}
|
||||
});
|
||||
|
||||
connect(ui->chkDelDecompress, &QCheckBox::stateChanged, [=](const int checked) {
|
||||
connect(ui->chkDelDecompress, &QCheckBox::checkStateChanged, [=](const int checked) {
|
||||
if (!checked) {
|
||||
if (ui->chkDecompressDirUseDwnld->isChecked()) {
|
||||
ui->chkDelDownloads->setEnabled(false);
|
||||
|
||||