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>
This commit is contained in:
Neil Horne
2025-07-23 14:04:19 +02:00
committed by GitHub
co-authored by elecpower raphaelcoeffic
parent 7264b28e62
commit 9e86a3ea84
117 changed files with 4221 additions and 5155 deletions
+1 -1
View File
@@ -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.
+2 -1
View File
@@ -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'
+1 -1
View File
@@ -5,7 +5,7 @@ on:
- cron: '0 2 * * *' # run at 2 AM UTC
workflow_dispatch:
concurrency:
concurrency:
group: 'nightly'
cancel-in-progress: true
+4 -3
View File
@@ -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}}
+1 -1
View File
@@ -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})
+1 -1
View File
@@ -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)
-27
View File
@@ -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)
+2 -9
View File
@@ -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)
+9 -8
View File
@@ -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
+16 -18
View File
@@ -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()
+303 -284
View File
@@ -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)
-13
View File
@@ -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@)
+2 -2
View File
@@ -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);
+8 -9
View File
@@ -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);
-2
View File
@@ -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"
)
+13 -19
View File
@@ -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;
+1 -1
View File
@@ -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 {
+3 -4
View File
@@ -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;
+1 -1
View File
@@ -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;
+2 -3
View File
@@ -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);
+1 -1
View File
@@ -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}
+1 -1
View File
@@ -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);
+2 -4
View File
@@ -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)) {
+4 -59
View File
@@ -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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 513 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
+4 -6
View File
@@ -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)
+1 -1
View File
@@ -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>" \
+2 -3
View File
@@ -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;
}
+2 -2
View File
@@ -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}
+14 -8
View File
@@ -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();
+5 -2
View File
@@ -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;
+28 -16
View File
@@ -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);
+1
View File
@@ -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);
};
+1 -1
View File
@@ -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());
}
}
+23 -11
View File
@@ -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());
+2 -4
View File
@@ -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_
+3 -3
View File
@@ -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();
+13 -21
View File
@@ -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;
}
}
+3 -6
View File
@@ -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
+1 -1
View File
@@ -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}
)
+1 -1
View File
@@ -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);
+88 -62
View File
@@ -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();
}
}
+15 -2
View File
@@ -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);
};
+2 -1
View File
@@ -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()
+2 -2
View File
@@ -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;
};
-1
View File
@@ -24,7 +24,6 @@
#include "autowidget.h"
#include <QLineEdit>
#include <QRegExpValidator>
class AutoLineEdit: public QLineEdit, public AutoWidget
{
+1 -1
View File
@@ -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()),
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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}
+4 -4
View File
@@ -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
+3 -3
View File
@@ -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')));
+3 -2
View File
@@ -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);
+1 -1
View File
@@ -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);
}
+4 -6
View File
@@ -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);
+2 -2
View File
@@ -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()) {
+1 -1
View File
@@ -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}
)
+1 -8
View File
@@ -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();
+10 -12
View File
@@ -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;
}
+2 -5
View File
@@ -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_
+2 -3
View File
@@ -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()
+2 -2
View File
@@ -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)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -6
View File
@@ -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);
+1 -1
View File
@@ -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);
+5 -5
View File
@@ -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);

Some files were not shown because too many files have changed in this diff Show More