diff --git a/Makefile b/Makefile index 982bf4dab..08e936c2f 100644 --- a/Makefile +++ b/Makefile @@ -183,36 +183,26 @@ ifneq ($(detected_OS),Windows) endif DOTHERSIDE := vendor/DOtherSide/build/lib/libDOtherSideStatic.a DOTHERSIDE_CMAKE_PARAMS += -DENABLE_DYNAMIC_LIBS=OFF -DENABLE_STATIC_LIBS=ON - # We don't create qzxing target, it's build as DOtherSide cmake subdirectory - QZXING := vendor/DOtherSide/build/qzxing/libqzxing.$(LIBSTATUS_EXT) # order matters here, due to "-Wl,-as-needed" NIM_PARAMS += --passL:"$(DOTHERSIDE)" --passL:"$(shell PKG_CONFIG_PATH="$(QT5_PCFILEDIR)" pkg-config --libs Qt5Core Qt5Qml Qt5Gui Qt5Quick Qt5QuickControls2 Qt5Widgets Qt5Svg Qt5Multimedia)" else ifneq ($(QML_DEBUG), false) DOTHERSIDE := vendor/DOtherSide/build/lib/Debug/DOtherSide.dll - QZXING := vendor/DOtherSide/build/qzxing/Debug/qzxing.dll else DOTHERSIDE := vendor/DOtherSide/build/lib/Release/DOtherSide.dll - QZXING := vendor/DOtherSide/build/qzxing/Release/qzxing.dll endif - - DOTHERSIDE_CMAKE_PARAMS += -T"v141" -A x64 -DENABLE_DYNAMIC_LIBS=ON -DENABLE_STATIC_LIBS=OFF \ - -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON # This is for qzxing, as it doesn't export any symbols + DOTHERSIDE_CMAKE_PARAMS += -T"v141" -A x64 -DENABLE_DYNAMIC_LIBS=ON -DENABLE_STATIC_LIBS=OFF NIM_PARAMS += -L:$(DOTHERSIDE) NIM_EXTRA_PARAMS := --passL:"-lsetupapi -lhid" endif -QZXING_LIBDIR := $(shell pwd)/$(shell dirname "$(QZXING)") -export QZXING_LIBDIR - -NIM_PARAMS += --passL:"-L$(QZXING_LIBDIR)" --passL:"-lqzxing" - ifeq ($(detected_OS),Darwin) ifeq ("$(shell sysctl -nq hw.optional.arm64)","1") ifneq ($(QT_ARCH),arm64) STATUSGO_MAKE_PARAMS += GOBIN_SHARED_LIB_CFLAGS="CGO_ENABLED=1 GOOS=darwin GOARCH=amd64" STATUSKEYCARDGO_MAKE_PARAMS += CGOFLAGS="CGO_ENABLED=1 GOOS=darwin GOARCH=amd64" DOTHERSIDE_CMAKE_PARAMS += -DCMAKE_OSX_ARCHITECTURES=x86_64 + STATUSQ_CMAKE_CONFIG_PARAMS += -DCMAKE_OSX_ARCHITECTURES=x86_64 QRCODEGEN_MAKE_PARAMS += CFLAGS="-target x86_64-apple-macos10.12" NIM_PARAMS += --cpu:amd64 --os:MacOSX --passL:"-arch x86_64" --passC:"-arch x86_64" endif @@ -249,6 +239,79 @@ ifeq ($(OUTPUT_CSV), true) $(shell touch .update.timestamp) endif + +## +## StatusQ +## + +ifneq ($(detected_OS),Windows) + STATUSQ := bin/StatusQ/libStatusQ.$(LIBSTATUS_EXT) +else + STATUSQ := bin/StatusQ/StatusQ.$(LIBSTATUS_EXT) + STATUSQ_CMAKE_CONFIG_PARAMS := -T"v141" -A x64 +endif + +STATUSQ_BUILD_PATH := ui/StatusQ/build +STATUSQ_INSTALL_PATH := $(shell pwd)/bin +STATUSQ_CMAKE_CACHE := $(STATUSQ_BUILD_PATH)/CMakeCache.txt + +$(STATUSQ_CMAKE_CACHE): | deps + echo -e "\033[92mConfiguring:\033[39m StatusQ" + cmake -DCMAKE_INSTALL_PREFIX=$(STATUSQ_INSTALL_PATH) \ + -DCMAKE_BUILD_TYPE=Release \ + -DSTATUSQ_BUILD_SANDBOX=OFF \ + -DSTATUSQ_BUILD_SANITY_CHECKER=OFF \ + -DSTATUSQ_BUILD_TESTS=OFF \ + $(STATUSQ_CMAKE_CONFIG_PARAMS) \ + -B $(STATUSQ_BUILD_PATH) \ + -S ui/StatusQ + $(HANDLE_OUTPUT) + +statusq-configure: | $(STATUSQ_CMAKE_CACHE) + +statusq-build: | statusq-configure + echo -e "\033[92mBuilding:\033[39m StatusQ" + cmake --build $(STATUSQ_BUILD_PATH) \ + --target StatusQ \ + --config Release + -DCMAKE_BUILD_TYPE=Release \ + $(HANDLE_OUTPUT) + +statusq-install: | statusq-build + echo -e "\033[92mInstalling:\033[39m StatusQ" + cmake --install $(STATUSQ_BUILD_PATH) \ + $(HANDLE_OUTPUT) + +statusq: | statusq-install + +statusq-clean: + echo -e "\033[92mCleaning:\033[39m StatusQ" + rm -rf $(STATUSQ_BUILD_PATH) + rm -rf $(STATUSQ_INSTALL_PATH)/StatusQ + +statusq-sanity-checker: + echo -e "\033[92mConfiguring:\033[39m StatusQ SanityChecker" + cmake \ + -DSTATUSQ_BUILD_SANDBOX=OFF \ + -DSTATUSQ_BUILD_SANITY_CHECKER=ON \ + -DSTATUSQ_BUILD_TESTS=OFF \ + -B$(STATUSQ_BUILD_PATH) \ + -Sui/StatusQ \ + $(HANDLE_OUTPUT) + echo -e "\033[92mBuilding:\033[39m StatusQ SanityChecker" + cmake \ + --build $(STATUSQ_BUILD_PATH) \ + --target SanityChecker \ + $(HANDLE_OUTPUT) + +run-statusq-sanity-checker: statusq-sanity-checker + echo -e "\033[92mRunning:\033[39m StatusQ SanityChecker" + $(STATUSQ_BUILD_PATH)/bin/SanityChecker + +## +## DOtherSide +## + $(DOTHERSIDE): | deps echo -e $(BUILD_MSG) "DOtherSide" + cd vendor/DOtherSide && \ @@ -256,7 +319,8 @@ $(DOTHERSIDE): | deps cd build && \ rm -f CMakeCache.txt && \ cmake $(DOTHERSIDE_CMAKE_PARAMS)\ - -DENABLE_DOCS=OFF -DENABLE_TESTS=OFF -DQZXING_USE_QML=ON -DQZXING_MULTIMEDIA=ON -DQZXING_USE_DECODER_QR_CODE=ON \ + -DENABLE_DOCS=OFF \ + -DENABLE_TESTS=OFF \ .. $(HANDLE_OUTPUT) && \ $(DOTHERSIDE_BUILD_CMD) @@ -331,9 +395,12 @@ QM_BINARIES := $(shell find ui/i18n -iname "*.ts" | sed 's/\.ts/\.qm/' | sed 's/ $(QM_BINARIES): TS_FILE = $(shell echo $@ | sed 's/\.qm/\.ts/' | sed 's/bin/ui/') $(QM_BINARIES): $(TS_SOURCES) | check-qt-dir mkdir -p bin/i18n - lrelease -removeidentical $(TS_FILE) -qm $@ + lrelease -removeidentical $(TS_FILE) -qm $@ $(HANDLE_OUTPUT) -compile-translations: $(QM_BINARIES) +log-compile-translations: + echo -e "\033[92mCompiling:\033[39m translations" + +compile-translations: | log-compile-translations $(QM_BINARIES) # default token is a free-tier token with limited capabilities and usage # limits; our docs should include directions for community contributor to setup @@ -392,7 +459,7 @@ else endif $(NIM_STATUS_CLIENT): NIM_PARAMS += $(RESOURCES_LAYOUT) -$(NIM_STATUS_CLIENT): $(NIM_SOURCES) $(DOTHERSIDE) | check-qt-dir $(STATUSGO) $(STATUSKEYCARDGO) $(QRCODEGEN) $(FLEETS) rcc $(QM_BINARIES) deps +$(NIM_STATUS_CLIENT): $(NIM_SOURCES) statusq $(DOTHERSIDE) | check-qt-dir $(STATUSGO) $(STATUSKEYCARDGO) $(QRCODEGEN) $(FLEETS) rcc compile-translations deps echo -e $(BUILD_MSG) "$@" && \ $(ENV_SCRIPT) nim c $(NIM_PARAMS) --passL:"-L$(STATUSGO_LIBDIR)" --passL:"-lstatus" --passL:"-L$(STATUSKEYCARDGO_LIBDIR)" --passL:"-lkeycard" $(NIM_EXTRA_PARAMS) --passL:"$(QRCODEGEN)" --passL:"-lm" src/nim_status_client.nim && \ [[ $$? = 0 ]] && \ @@ -401,10 +468,6 @@ $(NIM_STATUS_CLIENT): $(NIM_SOURCES) $(DOTHERSIDE) | check-qt-dir $(STATUSGO) $( libstatus.dylib \ @rpath/libstatus.dylib \ bin/nim_status_client && \ - install_name_tool -change \ - $(QZXING) \ - @rpath/libqzxing.dylib \ - bin/nim_status_client && \ install_name_tool -change \ libkeycard.dylib \ @rpath/libkeycard.dylib \ @@ -470,6 +533,8 @@ $(STATUS_CLIENT_APPIMAGE): nim_status_client $(APPIMAGE_TOOL) nim-status.desktop cp -R $(FLEETS) tmp/linux/dist/usr/. mkdir -p tmp/linux/dist/usr/i18n cp bin/i18n/* tmp/linux/dist/usr/i18n + mkdir -p tmp/linux/dist/usr/bin/StatusQ + cp bin/StatusQ/* tmp/linux/dist/usr/bin/StatusQ # Libraries cp -r /usr/lib/x86_64-linux-gnu/nss tmp/linux/dist/usr/lib/ @@ -479,7 +544,6 @@ $(STATUS_CLIENT_APPIMAGE): nim_status_client $(APPIMAGE_TOOL) nim-status.desktop cp vendor/status-go/build/bin/libstatus.so tmp/linux/dist/usr/lib/ cp vendor/status-go/build/bin/libstatus.so.0 tmp/linux/dist/usr/lib/ cp $(STATUSKEYCARDGO) tmp/linux/dist/usr/lib/ - cp $(QZXING) tmp/linux/dist/usr/lib/ echo -e $(BUILD_MSG) "AppImage" linuxdeployqt tmp/linux/dist/nim-status.desktop -no-copy-copyright-files -qmldir=ui -qmlimport=$(QT5_QMLDIR) -bundle-non-qt-libs @@ -530,6 +594,8 @@ $(STATUS_CLIENT_DMG): nim_status_client $(DMG_TOOL) cp -R $(FLEETS) $(MACOS_OUTER_BUNDLE)/Contents/ mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/i18n cp bin/i18n/* $(MACOS_OUTER_BUNDLE)/Contents/i18n + mkdir -p $(MACOS_OUTER_BUNDLE)/Contents/MacOS/StatusQ + cp bin/StatusQ/* $(MACOS_OUTER_BUNDLE)/Contents/MacOS/StatusQ echo -e $(BUILD_MSG) "app" macdeployqt \ @@ -593,21 +659,20 @@ $(STATUS_CLIENT_EXE): OUTPUT := tmp/windows/dist/Status $(STATUS_CLIENT_EXE): INSTALLER_OUTPUT := pkg $(STATUS_CLIENT_EXE): nim_status_client nim_windows_launcher $(NIM_WINDOWS_PREBUILT_DLLS) rm -rf pkg/*.exe tmp/windows/dist - mkdir -p $(OUTPUT)/bin $(OUTPUT)/resources $(OUTPUT)/vendor $(OUTPUT)/resources/i18n + mkdir -p $(OUTPUT)/bin $(OUTPUT)/resources $(OUTPUT)/vendor $(OUTPUT)/resources/i18n $(OUTPUT)/bin/StatusQ cat windows-install.txt | unix2dos > $(OUTPUT)/INSTALL.txt cp status.ico status.svg resources.rcc $(FLEETS) $(OUTPUT)/resources/ cp bin/i18n/* $(OUTPUT)/resources/i18n cp cacert.pem $(OUTPUT)/bin/cacert.pem + cp bin/StatusQ/* $(OUTPUT)/bin/StatusQ cp bin/nim_status_client.exe $(OUTPUT)/bin/Status.exe cp bin/nim_windows_launcher.exe $(OUTPUT)/Status.exe rcedit $(OUTPUT)/bin/Status.exe --set-icon $(OUTPUT)/resources/status.ico rcedit $(OUTPUT)/Status.exe --set-icon $(OUTPUT)/resources/status.ico - cp $(DOTHERSIDE) $(QZXING) $(STATUSGO) $(STATUSKEYCARDGO) tmp/windows/tools/*.dll $(OUTPUT)/bin/ + cp $(DOTHERSIDE) $(STATUSGO) $(STATUSKEYCARDGO) tmp/windows/tools/*.dll $(OUTPUT)/bin/ cp "$(shell which libgcc_s_seh-1.dll)" $(OUTPUT)/bin/ cp "$(shell which libwinpthread-1.dll)" $(OUTPUT)/bin/ echo -e $(BUILD_MSG) "deployable folder" - windeployqt --compiler-runtime --qmldir ui --release \ - tmp/windows/dist/Status/bin/qzxing.dll windeployqt --compiler-runtime --qmldir ui --release \ tmp/windows/dist/Status/bin/DOtherSide.dll mv tmp/windows/dist/Status/bin/vc_redist.x64.exe tmp/windows/dist/Status/vendor/ @@ -648,7 +713,7 @@ pkg-windows: check-pkg-target-windows $(STATUS_CLIENT_EXE) zip-windows: check-pkg-target-windows $(STATUS_CLIENT_7Z) -clean: | clean-common +clean: | clean-common statusq-clean rm -rf bin/* node_modules bottles/* pkg/* tmp/* $(STATUSGO) $(STATUSKEYCARDGO) + $(MAKE) -C vendor/DOtherSide/build --no-print-directory clean + $(MAKE) -C vendor/QR-Code-generator/c/ --no-print-directory clean @@ -669,7 +734,7 @@ ICON_TOOL := node_modules/.bin/fileicon run-linux: nim_status_client echo -e "\033[92mRunning:\033[39m bin/nim_status_client" - LD_LIBRARY_PATH="$(QT5_LIBDIR)":"$(QZXING_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)" \ + LD_LIBRARY_PATH="$(QT5_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)" \ ./bin/nim_status_client run-macos: nim_status_client @@ -684,17 +749,11 @@ run-macos: nim_status_client run-windows: nim_status_client $(NIM_WINDOWS_PREBUILT_DLLS) echo -e "\033[92mRunning:\033[39m bin/nim_status_client.exe" - PATH="$(shell pwd)"/"$(shell dirname "$(DOTHERSIDE)")":"$(QZXING_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)":"$(shell pwd)"/"$(shell dirname "$(NIM_WINDOWS_PREBUILT_DLLS)")":"$(PATH)" \ + PATH="$(shell pwd)"/"$(shell dirname "$(DOTHERSIDE)")":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)":"$(shell pwd)"/"$(shell dirname "$(NIM_WINDOWS_PREBUILT_DLLS)")":"$(PATH)" \ ./bin/nim_status_client.exe tests-nim-linux: | $(DOTHERSIDE) - LD_LIBRARY_PATH="$(QT5_LIBDIR)":"$(QZXING_LIBDIR)" \ + LD_LIBRARY_PATH="$(QT5_LIBDIR)" \ $(ENV_SCRIPT) nim c $(NIM_PARAMS) $(NIM_EXTRA_PARAMS) -r test/nim/message_model_test.nim -statusq-sanity-checker: - cmake -Bui/StatusQ/build -Sui/StatusQ && cmake --build ui/StatusQ/build --target SanityChecker - -run-statusq-sanity-checker: statusq-sanity-checker - ui/StatusQ/build/sanity_checker/SanityChecker - endif # "variables.mk" was not included diff --git a/ci/Jenkinsfile.tests-e2e b/ci/Jenkinsfile.tests-e2e index 8abe951d3..cfcccc427 100644 --- a/ci/Jenkinsfile.tests-e2e +++ b/ci/Jenkinsfile.tests-e2e @@ -54,7 +54,7 @@ pipeline { QTDIR = '/opt/qt/5.15.2/gcc_64' PATH = "${env.QTDIR}/bin:${env.PATH}" /* Include library in order to compile the project */ - LD_LIBRARY_PATH = "$QTDIR/lib:$WORKSPACE/vendor/DOtherSide/build/qzxing:$WORKSPACE/vendor/status-go/build/bin:$WORKSPACE/vendor/status-keycard-go/build/libkeycard/" + LD_LIBRARY_PATH = "$QTDIR/lib:$WORKSPACE/vendor/status-go/build/bin:$WORKSPACE/vendor/status-keycard-go/build/libkeycard/" /* Container ports */ RPC_PORT = "${8545 + env.EXECUTOR_NUMBER.toInteger()}" P2P_PORT = "${6010 + env.EXECUTOR_NUMBER.toInteger()}" diff --git a/ci/Jenkinsfile.tests-imports b/ci/Jenkinsfile.tests-imports index 901021c99..271b92dce 100644 --- a/ci/Jenkinsfile.tests-imports +++ b/ci/Jenkinsfile.tests-imports @@ -51,7 +51,17 @@ pipeline { } stage('Check') { - steps { sh 'make run-statusq-sanity-checker' } + steps { script { + /* Needed for QGuiApplication to import QtQuick.Dialogs */ + wrap([ + $class: 'Xvfb', + autoDisplayName: true, + parallelBuild: true, + screen: '2560x1440x24', + ]) { + sh('make run-statusq-sanity-checker') + } + } } } stage('Upload') { diff --git a/config.nims b/config.nims index fcab8ef5f..7236ca954 100644 --- a/config.nims +++ b/config.nims @@ -17,7 +17,6 @@ if defined(macosx): switch("passL", "-rpath" & " " & getEnv("QT5_LIBDIR")) switch("passL", "-rpath" & " " & getEnv("STATUSGO_LIBDIR")) switch("passL", "-rpath" & " " & getEnv("STATUSKEYCARDGO_LIBDIR")) - switch("passL", "-rpath" & " " & getEnv("QZXING_LIBDIR")) # statically link these libs switch("passL", "bottles/openssl@1.1/lib/libcrypto.a") switch("passL", "bottles/openssl@1.1/lib/libssl.a") diff --git a/src/nim_status_client.nim b/src/nim_status_client.nim index e444f1ce1..01d7b5751 100644 --- a/src/nim_status_client.nim +++ b/src/nim_status_client.nim @@ -143,7 +143,7 @@ proc mainProc() = prepareLogging() - singletonInstance.engine.addImportPath("qrc:/./StatusQ/src") + singletonInstance.engine.addImportPath("qrc:/") singletonInstance.engine.addImportPath("qrc:/./imports") singletonInstance.engine.addImportPath("qrc:/./app"); singletonInstance.engine.setNetworkAccessManagerFactory(networkAccessFactory) diff --git a/storybook/CMakeLists.txt b/storybook/CMakeLists.txt index db9a0eb99..bc6e9993c 100644 --- a/storybook/CMakeLists.txt +++ b/storybook/CMakeLists.txt @@ -10,23 +10,30 @@ set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + if (APPLE) set(MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=10.14) endif() find_package( Qt5 - COMPONENTS Core Quick QuickControls2 Test QuickTest Qml + COMPONENTS Core Gui Quick QuickControls2 Test QuickTest Qml REQUIRED) -include (../ui/StatusQ/StatusQSources.cmake) +set(STATUSQ_BUILD_SANDBOX OFF) +set(STATUSQ_BUILD_SANITY_CHECKER OFF) +set(STATUSQ_BUILD_TESTS OFF) +add_subdirectory(../ui/StatusQ StatusQ) file(GLOB_RECURSE CORE_QML_FILES - "../ui/StatusQ/*.qml" "../ui/app/*.qml" "../ui/imports/*.qml" - "../ui/StatusQ/*/qmldir" "../ui/app/*/qmldir" "../ui/imports/*/qmldir" + "../ui/app/*.qml" "../ui/imports/*.qml" + "../ui/app/*/qmldir" "../ui/imports/*/qmldir" ) -file(GLOB_RECURSE CORE_JS_FILES "../ui/StatusQ/*.js" "../ui/app/*.js") +file(GLOB_RECURSE CORE_JS_FILES "../ui/app/*.js") file(GLOB_RECURSE STORYBOOK_QML_FILES "stubs/*.qml" "mocks/*.qml" "pages/*.qml" "src/*.qml" "src/qmldir") @@ -45,11 +52,8 @@ add_library(${PROJECT_LIB} figmalinkssource.cpp figmalinkssource.h modelutils.cpp modelutils.h sectionsdecoratormodel.cpp sectionsdecoratormodel.h - ${STATUSQ_HEADERS} ${STATUSQ_SOURCES} ) -target_include_directories(${PROJECT_LIB} PUBLIC ${STATUSQ_DIR}/include) - add_executable( ${PROJECT_NAME} main.cpp @@ -61,13 +65,17 @@ add_executable( README.md ) -target_compile_definitions(${PROJECT_NAME} - PRIVATE QML_IMPORT_ROOT="${CMAKE_CURRENT_LIST_DIR}") +target_compile_definitions(${PROJECT_NAME} PRIVATE + QML_IMPORT_ROOT="${CMAKE_CURRENT_LIST_DIR}" + STATUSQ_MODULE_IMPORT_PATH="${STATUSQ_MODULE_IMPORT_PATH}") target_link_libraries( - ${PROJECT_LIB} PUBLIC Qt5::Core Qt5::Quick Qt5::QuickControls2) + ${PROJECT_LIB} PUBLIC Qt5::Core Qt5::Gui Qt5::Quick Qt5::QuickControls2) + target_link_libraries( - ${PROJECT_NAME} PRIVATE ${PROJECT_LIB} SortFilterProxyModel) + ${PROJECT_NAME} PRIVATE ${PROJECT_LIB}) + +add_dependencies(${PROJECT_NAME} StatusQ) enable_testing() @@ -83,13 +91,13 @@ add_executable(QmlTests qmlTests/main.cpp qmlTests/src/TextUtils.cpp qmlTests/src/TextUtils.h ${TEST_QML_FILES}) -target_compile_definitions(QmlTests - PRIVATE QML_IMPORT_ROOT="${CMAKE_CURRENT_LIST_DIR}" - PRIVATE -DQUICK_TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/qmlTests") +target_compile_definitions(QmlTests PRIVATE + QML_IMPORT_ROOT="${CMAKE_CURRENT_LIST_DIR}" + STATUSQ_MODULE_IMPORT_PATH="${STATUSQ_MODULE_IMPORT_PATH}" + QUICK_TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/qmlTests") target_link_libraries(QmlTests PRIVATE Qt5::QuickTest Qt5::Qml ${PROJECT_LIB}) add_test(NAME QmlTests COMMAND QmlTests) -list(APPEND QML_DIRS "${CMAKE_SOURCE_DIR}/../ui/StatusQ/src") list(APPEND QML_DIRS "${CMAKE_SOURCE_DIR}/../ui/app") list(APPEND QML_DIRS "${CMAKE_SOURCE_DIR}/../ui/imports") list(APPEND QML_DIRS "${CMAKE_SOURCE_DIR}/src") @@ -101,8 +109,5 @@ set(QML_IMPORT_PATH "${QML_DIRS}" CACHE STRING "Qt Creator extra QML import path if (APPLE) find_library(AppKit AppKit) find_library(Foundation Foundation) - target_link_libraries(${PROJECT_LIB} PRIVATE ${AppKit} ${Foundation}) endif() - -add_subdirectory(../vendor/SortFilterProxyModel ./SortFilterProxyModel) diff --git a/storybook/main.cpp b/storybook/main.cpp index 425f4bd4c..8ad9f570b 100644 --- a/storybook/main.cpp +++ b/storybook/main.cpp @@ -8,8 +8,6 @@ #include "figmalinkssource.h" #include "sectionsdecoratormodel.h" -#include "StatusQ/typesregistration.h" - int main(int argc, char *argv[]) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) @@ -27,7 +25,7 @@ int main(int argc, char *argv[]) QQmlApplicationEngine engine; const QStringList additionalImportPaths { - QML_IMPORT_ROOT + QStringLiteral("/../ui/StatusQ/src"), + STATUSQ_MODULE_IMPORT_PATH, QML_IMPORT_ROOT + QStringLiteral("/../ui/app"), QML_IMPORT_ROOT + QStringLiteral("/../ui/imports"), QML_IMPORT_ROOT + QStringLiteral("/src"), @@ -44,8 +42,6 @@ int main(int argc, char *argv[]) qmlRegisterType("Storybook", 1, 0, "FigmaLinksSource"); qmlRegisterUncreatableType("Storybook", 1, 0, "FigmaLinks", {}); - registerStatusQTypes(); - auto watcherFactory = [additionalImportPaths](QQmlEngine*, QJSEngine*) { auto watcher = new DirectoriesWatcher(); watcher->addPaths(additionalImportPaths); diff --git a/storybook/main.qml b/storybook/main.qml index 0b0a9be0d..2539102b1 100644 --- a/storybook/main.qml +++ b/storybook/main.qml @@ -4,6 +4,8 @@ import QtQuick.Layouts 1.14 import Qt.labs.settings 1.0 +import StatusQ 0.1 // https://github.com/status-im/status-desktop/issues/10218 + import StatusQ.Core.Theme 0.1 import Storybook 1.0 diff --git a/storybook/qmlTests/TestComponents/tst_DerivationPathInput.qml b/storybook/qmlTests/TestComponents/tst_DerivationPathInput.qml index 8db1c5079..dda155585 100644 --- a/storybook/qmlTests/TestComponents/tst_DerivationPathInput.qml +++ b/storybook/qmlTests/TestComponents/tst_DerivationPathInput.qml @@ -3,6 +3,8 @@ import QtQuick.Controls 2.14 import QtQml 2.14 import QtTest 1.0 +import StatusQ 0.1 // https://github.com/status-im/status-desktop/issues/10218 + import AppLayouts.Wallet.addaccount.panels 1.0 import AppLayouts.Wallet.addaccount.panels.DerivationPathInput 1.0 diff --git a/storybook/qmlTests/TestComponents/tst_StatusChatInput.qml b/storybook/qmlTests/TestComponents/tst_StatusChatInput.qml index 116809969..6a87a4159 100644 --- a/storybook/qmlTests/TestComponents/tst_StatusChatInput.qml +++ b/storybook/qmlTests/TestComponents/tst_StatusChatInput.qml @@ -3,6 +3,8 @@ import QtQuick.Controls 2.14 import QtQml 2.14 import QtTest 1.0 +import StatusQ 0.1 // https://github.com/status-im/status-desktop/issues/10218 + import utils 1.0 import shared.status 1.0 import shared.stores 1.0 diff --git a/storybook/qmlTests/main.cpp b/storybook/qmlTests/main.cpp index 514ee45bd..f1c2714c9 100644 --- a/storybook/qmlTests/main.cpp +++ b/storybook/qmlTests/main.cpp @@ -2,8 +2,6 @@ #include #include "src/TextUtils.h" -#include "StatusQ/typesregistration.h" - class Setup : public QObject { Q_OBJECT @@ -12,7 +10,7 @@ public slots: void qmlEngineAvailable(QQmlEngine *engine) { // custom code that needs QQmlEngine, register QML types, add import paths,... const QStringList additionalImportPaths { - QML_IMPORT_ROOT + QStringLiteral("/../ui/StatusQ/src"), + STATUSQ_MODULE_IMPORT_PATH, QML_IMPORT_ROOT + QStringLiteral("/../ui/app"), QML_IMPORT_ROOT + QStringLiteral("/../ui/imports"), QML_IMPORT_ROOT + QStringLiteral("/stubs"), @@ -23,8 +21,6 @@ public slots: engine->addImportPath(path); qmlRegisterSingletonType("TextUtils", 1, 0, "TextUtils", &TextUtils::qmlInstance); - - registerStatusQTypes(); } }; diff --git a/ui/StatusQ/.gitmodules b/ui/StatusQ/.gitmodules deleted file mode 100644 index 59b968847..000000000 --- a/ui/StatusQ/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "vendor/SortFilterProxyModel"] - path = vendor/SortFilterProxyModel - url = https://github.com/status-im/SortFilterProxyModel.git diff --git a/ui/StatusQ/CMakeLists.txt b/ui/StatusQ/CMakeLists.txt index cc2d77696..0cb05f266 100644 --- a/ui/StatusQ/CMakeLists.txt +++ b/ui/StatusQ/CMakeLists.txt @@ -2,10 +2,9 @@ cmake_minimum_required(VERSION 3.19) project(StatusQ) -if (APPLE) - set(MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=10.14) - set(CMAKE_OSX_ARCHITECTURES "x86_64") -endif() +option(STATUSQ_BUILD_SANDBOX "Enable to build StatusQ Sandbox application" ON) +option(STATUSQ_BUILD_SANITY_CHECKER "Enable to build StatusQ Sanity Checker application" ON) +option(STATUSQ_BUILD_TESTS "Enable to build StatusQ UI auto tests" ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) @@ -13,18 +12,158 @@ set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Although SHARED libraries set this to ON by default, +# all static libraries, that are built into this SHARED, +# (which is qzxing in our case) should also be build with -fPIC. +# This fixes it. +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + set(QZXING_USE_QML ON) set(QZXING_MULTIMEDIA ON) set(QZXING_USE_DECODER_QR_CODE ON) -# https://doc.qt.io/qtcreator/creator-qml-modules-with-plugins.html#importing-qml-modules -set(QML_IMPORT_PATH - ${CMAKE_SOURCE_DIR}/src;${QML_IMPORT_PATH} - CACHE STRING "") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +find_package(Qt5 COMPONENTS + Core Qml Gui Quick QuickControls2 REQUIRED) add_subdirectory(../../vendor/SortFilterProxyModel SortFilterProxyModel) add_subdirectory(../../vendor/qzxing/src qzxing) -add_subdirectory(sandbox) -add_subdirectory(sanity_checker) -add_subdirectory(tests) + +### StatusQ library +### TODO: Move to a subdirectory for readability and better structure + +if (NOT DEFINED STATUSQ_SHADOW_BUILD) + + # About the STATUSQ_SHADOW_BUILD option. + # + # This is an option that defaults to OFF in Debug mode and ON otherwise. + # When ON: + # - resources are compiled into plugin + # - plugin is compiled in the ${CMAKE_BINARY_DIR}/StatusQ + # When OFF: + # - no resources are compiled, it's expected to use QML/JS sources + # - the plugin is compiled in src directory + # + # STATUSQ_SHADOW_BUILD mode is created for sandbox/storybook hot reloading + # without copying all qml files to build directory. + # + # It's expected for the app to add ${STATUSQ_MODULE_IMPORT_PATH} to + # QQmlApplicationEngine::addImportPath. + # + + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(STATUSQ_SHADOW_BUILD OFF) + else() + set(STATUSQ_SHADOW_BUILD ON) + endif() +endif() + +set(STATUSQ_SOURCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/StatusQ") + +if (${STATUSQ_SHADOW_BUILD}) + set(STATUSQ_MODULE_PATH "${CMAKE_BINARY_DIR}/bin/StatusQ") + set(STATUSQ_MODULE_IMPORT_PATH ":/") +else() + set(STATUSQ_MODULE_PATH "${STATUSQ_SOURCE_PATH}") + set(STATUSQ_MODULE_IMPORT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src") +endif() + +if (NOT PROJECT_IS_TOP_LEVEL) + set(STATUSQ_MODULE_PATH "${STATUSQ_MODULE_PATH}" PARENT_SCOPE) + set(STATUSQ_MODULE_IMPORT_PATH "${STATUSQ_MODULE_IMPORT_PATH}" PARENT_SCOPE) + set(STATUSQ_SHADOW_BUILD "${STATUSQ_SHADOW_BUILD}" PARENT_SCOPE) +endif () + +if (${STATUSQ_SHADOW_BUILD}) + qt5_add_big_resources(STATUSQ_QRC_COMPILED + src/statusq.qrc + src/assets.qrc) +endif() + +add_library(StatusQ SHARED + ${STATUSQ_QRC_COMPILED} + src/plugin.cpp + include/StatusQ/QClipboardProxy.h + include/StatusQ/modelutilsinternal.h + include/StatusQ/rxvalidator.h + include/StatusQ/statussyntaxhighlighter.h + include/StatusQ/statuswindow.h + src/QClipboardProxy.cpp + src/modelutilsinternal.cpp + src/rxvalidator.cpp + src/statussyntaxhighlighter.cpp + src/statuswindow.cpp + ) + +set_target_properties(StatusQ PROPERTIES + ADDITIONAL_CLEAN_FILES bin/StatusQ/qmldir + DEBUG_POSTFIX "d" + RUNTIME_OUTPUT_DIRECTORY ${STATUSQ_MODULE_PATH} + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${STATUSQ_MODULE_PATH} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${STATUSQ_MODULE_PATH} + LIBRARY_OUTPUT_DIRECTORY ${STATUSQ_MODULE_PATH} +) + +if (APPLE) + find_library(AppKit AppKit) + find_library(Foundation Foundation) + target_link_libraries(${PROJECT_NAME} PRIVATE ${AppKit} ${Foundation}) + target_sources(StatusQ PRIVATE src/statuswindow_osx.mm) +else () + target_sources(StatusQ PRIVATE src/statuswindow_other.cpp) +endif () + +if (${STATUSQ_SHADOW_BUILD}) + set(COPY_QMLDIR_COMMAND + ${CMAKE_COMMAND} -E copy + ${STATUSQ_SOURCE_PATH}/qmldir + ${STATUSQ_MODULE_PATH}/qmldir) + add_custom_command( + TARGET StatusQ + POST_BUILD + COMMAND ${COPY_QMLDIR_COMMAND} + COMMENT "Copying qmldir to binary directory") +endif () + +target_link_libraries(StatusQ PRIVATE + Qt5::Core + Qt5::Qml + Qt5::Gui + Qt5::Quick + Qt5::QuickControls2 + SortFilterProxyModel + qzxing + ) + +target_include_directories(StatusQ PRIVATE include) + +install(TARGETS StatusQ + RUNTIME DESTINATION StatusQ + LIBRARY DESTINATION StatusQ + ) + +install(FILES src/StatusQ/qmldir + DESTINATION StatusQ + ) + +# https://doc.qt.io/qtcreator/creator-qml-modules-with-plugins.html#importing-qml-modules +set(QML_IMPORT_PATH + ${CMAKE_SOURCE_DIR}/src;${QML_IMPORT_PATH} + CACHE STRING "") + +### Add other subdirectories + +if (${STATUSQ_BUILD_SANDBOX}) + add_subdirectory(sandbox) +endif () + +if (${STATUSQ_BUILD_SANITY_CHECKER}) + add_subdirectory(sanity_checker) +endif () + +if (${STATUSQ_BUILD_TESTS}) + add_subdirectory(tests) +endif () diff --git a/ui/StatusQ/StatusQSources.cmake b/ui/StatusQ/StatusQSources.cmake deleted file mode 100644 index c543c42a5..000000000 --- a/ui/StatusQ/StatusQSources.cmake +++ /dev/null @@ -1,29 +0,0 @@ -set(STATUSQ_DIR ${CMAKE_CURRENT_LIST_DIR}) - -set(STATUSQ_HEADERS - ${STATUSQ_DIR}/include/StatusQ/QClipboardProxy.h - ${STATUSQ_DIR}/include/StatusQ/modelutilsinternal.h - ${STATUSQ_DIR}/include/StatusQ/rxvalidator.h - ${STATUSQ_DIR}/include/StatusQ/statussyntaxhighlighter.h - ${STATUSQ_DIR}/include/StatusQ/statuswindow.h - ${STATUSQ_DIR}/include/StatusQ/typesregistration.h -) - -set(STATUSQ_SOURCES - ${STATUSQ_DIR}/src/QClipboardProxy.cpp - ${STATUSQ_DIR}/src/modelutilsinternal.cpp - ${STATUSQ_DIR}/src/rxvalidator.cpp - ${STATUSQ_DIR}/src/statussyntaxhighlighter.cpp - ${STATUSQ_DIR}/src/statuswindow.cpp - ${STATUSQ_DIR}/src/typesregistration.cpp -) - -if(APPLE) - list(APPEND STATUSQ_SOURCES - ${STATUSQ_DIR}/src/statuswindow_osx.mm - ) -else() - list(APPEND STATUSQ_SOURCES - ${STATUSQ_DIR}/src/statuswindow_other.cpp - ) -endif() diff --git a/ui/StatusQ/include/StatusQ/typesregistration.h b/ui/StatusQ/include/StatusQ/typesregistration.h deleted file mode 100644 index eec3d1583..000000000 --- a/ui/StatusQ/include/StatusQ/typesregistration.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void registerStatusQTypes(); diff --git a/ui/StatusQ/sandbox/CMakeLists.txt b/ui/StatusQ/sandbox/CMakeLists.txt index cdbcb9aa2..8f5bdf1e7 100644 --- a/ui/StatusQ/sandbox/CMakeLists.txt +++ b/ui/StatusQ/sandbox/CMakeLists.txt @@ -1,43 +1,31 @@ project(Sandbox) find_package( - Qt5 - COMPONENTS Core Quick QuickControls2 - REQUIRED) - -include (../StatusQSources.cmake) + Qt5 + COMPONENTS Core Quick QuickControls2 + REQUIRED) file(GLOB_RECURSE QML_FILES "../*.qml" "../qmldir") file(GLOB_RECURSE JS_FILES "../*.js") -set(HEADERS sandboxapp.h) -set(SOURCES main.cpp sandboxapp.cpp) +qt5_add_big_resources(STATUSQ_SANDBOX_QRC qml.qrc) -set(QRC_FILES qml.qrc ../src/statusq.qrc ../src/assets.qrc) -qt5_add_big_resources(QRC_COMPILED ${QRC_FILES}) +add_executable(${PROJECT_NAME} + sandboxapp.h + main.cpp + sandboxapp.cpp + ${STATUSQ_SANDBOX_QRC} + ${QML_FILES} + ${JS_FILES} + ) -add_executable( - ${PROJECT_NAME} - ${HEADERS} - ${SOURCES} - ${STATUSQ_HEADERS} - ${STATUSQ_SOURCES} - ${QRC_FILES} - ${QRC_COMPILED} - ${QML_FILES} - ${JS_FILES}) +target_compile_definitions(${PROJECT_NAME} PRIVATE + SANDBOX_SRC_DIR="${CMAKE_CURRENT_LIST_DIR}" + STATUSQ_MODULE_IMPORT_PATH="${STATUSQ_MODULE_IMPORT_PATH}" + ) -target_include_directories(${PROJECT_NAME} PUBLIC ${STATUSQ_DIR}/include) -target_compile_definitions(${PROJECT_NAME} - PRIVATE SRC_DIR="${CMAKE_CURRENT_LIST_DIR}") -target_link_libraries( - ${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Quick Qt5::QuickControls2 - SortFilterProxyModel - qzxing) - -if (APPLE) - find_library(AppKit AppKit) - find_library(Foundation Foundation) - - target_link_libraries(${PROJECT_NAME} PRIVATE ${AppKit} ${Foundation}) -endif() +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt5::Core + Qt5::Quick + Qt5::QuickControls2 + ) diff --git a/ui/StatusQ/sandbox/main.cpp b/ui/StatusQ/sandbox/main.cpp index e71c35999..c59b39dd1 100644 --- a/ui/StatusQ/sandbox/main.cpp +++ b/ui/StatusQ/sandbox/main.cpp @@ -4,8 +4,6 @@ #include "sandboxapp.h" -#include - int main(int argc, char *argv[]) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) @@ -14,8 +12,6 @@ int main(int argc, char *argv[]) SandboxApp app(argc, argv); - qqsfpm::registerTypes(); - qputenv("QT_QUICK_CONTROLS_HOVER_ENABLED", QByteArrayLiteral("1")); app.setOrganizationName("Status"); diff --git a/ui/StatusQ/sandbox/main.qml b/ui/StatusQ/sandbox/main.qml index 9840c2971..4ebd6e754 100644 --- a/ui/StatusQ/sandbox/main.qml +++ b/ui/StatusQ/sandbox/main.qml @@ -7,7 +7,7 @@ import Qt.labs.settings 1.0 import QtQml.Models 2.14 import QtMultimedia 5.14 -import StatusQ 0.1 +import StatusQ 0.1 // https://github.com/status-im/status-desktop/issues/10218 import StatusQ.Core 0.1 import StatusQ.Core.Theme 0.1 diff --git a/ui/StatusQ/sandbox/sandboxapp.cpp b/ui/StatusQ/sandbox/sandboxapp.cpp index 4a5159f75..a9c492e4a 100644 --- a/ui/StatusQ/sandbox/sandboxapp.cpp +++ b/ui/StatusQ/sandbox/sandboxapp.cpp @@ -5,14 +5,9 @@ #include #include -#include "StatusQ/typesregistration.h" -#include - SandboxApp::SandboxApp(int &argc, char **argv) : QGuiApplication(argc, argv) { - QZXing::registerQMLTypes(); - #ifdef QT_DEBUG connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, [this](const QString&) { restartEngine(); @@ -22,10 +17,7 @@ SandboxApp::SandboxApp(int &argc, char **argv) void SandboxApp::startEngine() { - registerStatusQTypes(); - #ifdef QT_DEBUG - const QUrl url = QUrl::fromLocalFile(SRC_DIR + QStringLiteral("/main.qml")); m_watcher.addPath(applicationDirPath() + "/../"); QDirIterator it(applicationDirPath() + "/../", QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (it.hasNext()) { @@ -34,32 +26,26 @@ void SandboxApp::startEngine() } it.next(); } -#else - const QUrl url(QStringLiteral("qrc:/main.qml")); #endif -#ifdef QT_DEBUG - m_engine.addImportPath(SRC_DIR + QStringLiteral("/../src")); -#else - m_engine.addImportPath(QStringLiteral(":/")); -#endif + m_engine.addImportPath(STATUSQ_MODULE_IMPORT_PATH); qDebug() << m_engine.importPathList(); + QObject::connect(&m_engine, &QQmlApplicationEngine::objectCreated, - this, [url](QObject *obj, const QUrl &objUrl) { - if (!obj && url == objUrl) + this, [this](QObject *obj, const QUrl &objUrl) { + if (!obj && m_url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); - m_engine.load(url); + m_engine.load(m_url); } void SandboxApp::restartEngine() { - const QUrl url = QUrl::fromLocalFile(SRC_DIR + QStringLiteral("/main.qml")); QWindow *rootWindow = qobject_cast(m_engine.rootObjects().at(0)); if (rootWindow) { rootWindow->close(); rootWindow->deleteLater(); } m_engine.clearComponentCache(); - m_engine.load(url); + m_engine.load(m_url); } diff --git a/ui/StatusQ/sandbox/sandboxapp.h b/ui/StatusQ/sandbox/sandboxapp.h index a609cdaab..ce32441c2 100644 --- a/ui/StatusQ/sandbox/sandboxapp.h +++ b/ui/StatusQ/sandbox/sandboxapp.h @@ -24,6 +24,14 @@ private: #ifdef QT_DEBUG QFileSystemWatcher m_watcher; #endif + + const QUrl m_url { +#ifdef QT_DEBUG + QUrl::fromLocalFile(SANDBOX_SRC_DIR + QStringLiteral("/main.qml")) +#else + QStringLiteral("qrc:/main.qml") +#endif + }; }; #endif // SANDBOXAPP_H diff --git a/ui/StatusQ/sanity_checker/CMakeLists.txt b/ui/StatusQ/sanity_checker/CMakeLists.txt index f3b8bbde4..b9e36d137 100644 --- a/ui/StatusQ/sanity_checker/CMakeLists.txt +++ b/ui/StatusQ/sanity_checker/CMakeLists.txt @@ -1,34 +1,27 @@ project(SanityChecker) -find_package( - Qt5 - COMPONENTS Core Quick QuickControls2 - REQUIRED) +find_package(Qt5 + COMPONENTS Core Quick + REQUIRED) -include (../StatusQSources.cmake) +add_executable(${PROJECT_NAME} + main.cpp + ) -set(QRC_FILES ../src/statusq.qrc ../src/assets.qrc) -qt5_add_resources(QRC_COMPILED ${QRC_FILES}) +add_dependencies(${PROJECT_NAME} + StatusQ) -add_executable( - ${PROJECT_NAME} - main.cpp - ${QRC_FILES} - ${QRC_COMPILED} - ${STATUSQ_HEADERS} - ${STATUSQ_SOURCES} -) +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt5::Core + Qt5::Quick) -target_include_directories(${PROJECT_NAME} PUBLIC ${STATUSQ_DIR}/include) +target_compile_definitions(${PROJECT_NAME} PRIVATE + STATUSQ_MODULE_PATH="${STATUSQ_MODULE_PATH}" + STATUSQ_MODULE_IMPORT_PATH="${STATUSQ_MODULE_IMPORT_PATH}" + ) -target_link_libraries( - ${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Quick Qt5::QuickControls2 - SortFilterProxyModel - qzxing) - -if (APPLE) - find_library(AppKit AppKit) - find_library(Foundation Foundation) - - target_link_libraries(${PROJECT_NAME} PRIVATE ${AppKit} ${Foundation}) -endif() +if (STATUSQ_SHADOW_BUILD) + target_compile_definitions(${PROJECT_NAME} PRIVATE + STATUSQ_SHADOW_BUILD + ) +endif () \ No newline at end of file diff --git a/ui/StatusQ/sanity_checker/main.cpp b/ui/StatusQ/sanity_checker/main.cpp index 0db40aab3..0de0a7370 100644 --- a/ui/StatusQ/sanity_checker/main.cpp +++ b/ui/StatusQ/sanity_checker/main.cpp @@ -1,51 +1,63 @@ -#include +#include #include #include #include #include -#include "StatusQ/typesregistration.h" -#include - -int main(int argc, char *argv[]) -{ - QCoreApplication app(argc, argv); - - registerStatusQTypes(); - +int main(int argc, char *argv[]) { + QGuiApplication app(argc, argv); QQmlEngine engine; - engine.addImportPath(QStringLiteral(":/")); +#ifdef STATUSQ_SHADOW_BUILD + const QString componentBaseUrlPrefix{"qrc"}; +#else + const QString componentBaseUrlPrefix{"file://"}; +#endif - QZXing::registerQMLTypes(); + const QString iterationPath{QStringLiteral(STATUSQ_MODULE_IMPORT_PATH)}; + engine.addImportPath(iterationPath); + + // Create a dummy component with StatusQ import. + // NOTE: https://github.com/status-im/status-desktop/issues/10218 + + QQmlComponent mainComponent(&engine); + mainComponent.setData("import QtQuick 2.15\nimport StatusQ 0.1\nItem { }", {}); + + if (mainComponent.isError()) { + qWarning() << "Failed to import StatusQ 0.1:" << mainComponent.errors(); + return EXIT_FAILURE; + } + + // Start iterating over directory - QDirIterator it(":", QDirIterator::Subdirectories); bool errorsFound = false; - while (it.hasNext()) { - QFileInfo info = it.fileInfo(); + for (QDirIterator it(iterationPath, QDirIterator::Subdirectories); it.hasNext(); it.next()) { - if (info.suffix() == QStringLiteral("qml")) { - QFile file(it.filePath()); - file.open(QIODevice::ReadOnly); + const QFileInfo info = it.fileInfo(); - QTextStream in(&file); - QString line = in.readLine(); + if (info.suffix() != QStringLiteral("qml")) + continue; - if (line != QStringLiteral("pragma Singleton")) { - engine.setBaseUrl(QStringLiteral("qrc") + info.dir().path() - + QDir::separator()); + QFile file(it.filePath()); + file.open(QIODevice::ReadOnly); - QQmlComponent component(&engine, it.fileName()); + QTextStream in(&file); + QString line = in.readLine(); - if (component.isError()) { - qWarning() << component.errors(); - errorsFound = true; - } - } + if (line == QStringLiteral("pragma Singleton")) + continue; + + QUrl baseFileUrl(componentBaseUrlPrefix + info.dir().path() + QDir::separator()); + + engine.setBaseUrl(baseFileUrl); + + QQmlComponent component(&engine, it.fileName()); + + if (component.isError()) { + qWarning() << component.errors(); + errorsFound = true; } - - it.next(); } if (errorsFound) diff --git a/ui/StatusQ/src/StatusQ/Core/Utils/Emoji.qml b/ui/StatusQ/src/StatusQ/Core/Utils/Emoji.qml index 606693ac3..c9d90473a 100644 --- a/ui/StatusQ/src/StatusQ/Core/Utils/Emoji.qml +++ b/ui/StatusQ/src/StatusQ/Core/Utils/Emoji.qml @@ -2,7 +2,6 @@ pragma Singleton import QtQuick 2.13 -//import shared.status 1.0 import "../../../assets/twemoji/twemoji.js" as Twemoji import "./emojiList.js" as EmojiJSON @@ -18,8 +17,9 @@ QtObject { "png": "png", "svg": "svg" } - property string base: Qt.resolvedUrl("../../../assets/twemoji/") + readonly property string base: Qt.resolvedUrl("../../../assets/twemoji/") property var emojiJSON: EmojiJSON + function parse(text, renderSize = size.small, renderFormat = format.svg) { const renderSizes = renderSize.split("x"); if (!renderSize.includes("x") || renderSizes.length !== 2) { @@ -63,23 +63,25 @@ QtObject { function fromCodePoint(value) { return Twemoji.twemoji.convert.fromCodePoint(value) } + + // This regular expression looks for html tag `img` with following attributes in any order: + // - `src` containig with "/assets/twemoji/" substring + // - `alt` (this one is captured) + readonly property var emojiRegexp: /]*\balt="([^"]*)")(?=[^>]*\bsrc="[^>]*\/assets\/twemoji\/[^>]*")[^>]*>/g + function deparse(value) { - // /StatusQ/src/assets/twemoji/ - return value.replace(/\"(.+?)\"/g, "$1"); - } - function deparseFromParse(value) { - return value.replace(/\"(.+?)\"/g, "$1"); + return value.replace(emojiRegexp, "$1"); } function hasEmoji(value) { - let match = value.match(/\"(.+?)\"/g) + let match = value.match(emojiRegexp) return match && match.length > 0 } function nbEmojis(value) { - let match = value.match(/\"(.+?)\"/g) + let match = value.match(emojiRegexp) return match ? match.length : 0 } function getEmojis(value) { - return value.match(/\"(.+?)\"/g, "$1"); + return value.match(emojiRegexp, "$1"); } function getEmojiUnicode(shortname) { diff --git a/ui/StatusQ/src/StatusQ/qmldir b/ui/StatusQ/src/StatusQ/qmldir index 87c1ed384..12303d408 100644 --- a/ui/StatusQ/src/StatusQ/qmldir +++ b/ui/StatusQ/src/StatusQ/qmldir @@ -1,2 +1,3 @@ module StatusQ - +plugin StatusQ +classname StatusQPlugin diff --git a/ui/StatusQ/src/assets.qrc b/ui/StatusQ/src/assets.qrc index 779693281..14fb27ecc 100644 --- a/ui/StatusQ/src/assets.qrc +++ b/ui/StatusQ/src/assets.qrc @@ -51,9 +51,6 @@ assets/fonts/RobotoMono/RobotoMono-SemiBoldItalic.ttf assets/fonts/RobotoMono/RobotoMono-Thin.ttf assets/fonts/RobotoMono/RobotoMono-ThinItalic.ttf - assets/img/icons/statuses/automatic.svg - assets/img/icons/statuses/inactive.svg - assets/img/icons/statuses/online.svg assets/img/icons/bigger/browser.svg assets/img/icons/bigger/network.svg assets/img/icons/bigger/pause.svg @@ -62,12 +59,16 @@ assets/img/icons/bigger/send.svg assets/img/icons/bigger/settings.svg assets/img/icons/bigger/status-update.svg + assets/img/icons/statuses/automatic.svg + assets/img/icons/statuses/inactive.svg + assets/img/icons/statuses/online.svg assets/img/icons/tiny/message/delivered.svg assets/img/icons/tiny/message/pending.svg assets/img/icons/tiny/message/sent.svg assets/img/icons/tiny/message/warning.svg assets/img/icons/tiny/add.svg assets/img/icons/tiny/arrow-down.svg + assets/img/icons/tiny/bridge.svg assets/img/icons/tiny/channel-white.svg assets/img/icons/tiny/channel.svg assets/img/icons/tiny/chat.svg @@ -83,8 +84,10 @@ assets/img/icons/tiny/contact.svg assets/img/icons/tiny/double-checkmark.svg assets/img/icons/tiny/edit.svg + assets/img/icons/tiny/exclamation.svg assets/img/icons/tiny/external.svg assets/img/icons/tiny/flash.svg + assets/img/icons/tiny/gas.svg assets/img/icons/tiny/group-white.svg assets/img/icons/tiny/group.svg assets/img/icons/tiny/members.svg @@ -103,6 +106,7 @@ assets/img/icons/tiny/time.svg assets/img/icons/tiny/tiny-checkmark.svg assets/img/icons/tiny/tiny-contact.svg + assets/img/icons/tiny/tiny-exclamation.svg assets/img/icons/tiny/tribute-to-talk.svg assets/img/icons/tiny/unlocked.svg assets/img/icons/tiny/warning.svg @@ -135,6 +139,7 @@ assets/img/icons/audio.svg assets/img/icons/backspace.svg assets/img/icons/bold.svg + assets/img/icons/bridge.svg assets/img/icons/browser.svg assets/img/icons/camera.svg assets/img/icons/cancel.svg @@ -155,12 +160,14 @@ assets/img/icons/code.svg assets/img/icons/communities.svg assets/img/icons/condition-or.svg + assets/img/icons/contact-book.svg assets/img/icons/contact.svg assets/img/icons/copy.svg assets/img/icons/crown.svg assets/img/icons/dapp.svg assets/img/icons/delete.svg assets/img/icons/desktop.svg + assets/img/icons/discord.svg assets/img/icons/double-checkmark.svg assets/img/icons/download.svg assets/img/icons/edit.svg @@ -182,16 +189,21 @@ assets/img/icons/food-and-drinks.svg assets/img/icons/gallery.svg assets/img/icons/gif.svg + assets/img/icons/github.svg assets/img/icons/group-chat.svg assets/img/icons/group.svg assets/img/icons/help.svg assets/img/icons/hide.svg assets/img/icons/history.svg assets/img/icons/image.svg + assets/img/icons/images_icon.svg assets/img/icons/in-contacts.svg assets/img/icons/info.svg assets/img/icons/invite-users.svg assets/img/icons/italic.svg + assets/img/icons/justify.svg + assets/img/icons/key_pair_private_key.svg + assets/img/icons/key_pair_seed_phrase.svg assets/img/icons/keyboard.svg assets/img/icons/keycard-logo.svg assets/img/icons/keycard.svg @@ -211,6 +223,7 @@ assets/img/icons/muted.svg assets/img/icons/network.svg assets/img/icons/next.svg + assets/img/icons/nft-profile.svg assets/img/icons/node-offline.svg assets/img/icons/node.svg assets/img/icons/notification-muted.svg @@ -222,6 +235,7 @@ assets/img/icons/paste.svg assets/img/icons/pause-filled.svg assets/img/icons/pause.svg + assets/img/icons/pencil-outline.svg assets/img/icons/pencil.svg assets/img/icons/pin.svg assets/img/icons/play-filled.svg @@ -230,8 +244,9 @@ assets/img/icons/private-chat.svg assets/img/icons/profile.svg assets/img/icons/public-chat.svg - assets/img/icons/quote.svg + assets/img/icons/qr-scan.svg assets/img/icons/qr.svg + assets/img/icons/quote.svg assets/img/icons/reaction-a.svg assets/img/icons/reaction-b.svg assets/img/icons/receive.svg @@ -240,6 +255,7 @@ assets/img/icons/remove-contact.svg assets/img/icons/remove.svg assets/img/icons/reply.svg + assets/img/icons/retail.svg assets/img/icons/rotate.svg assets/img/icons/search.svg assets/img/icons/secret.svg @@ -259,6 +275,7 @@ assets/img/icons/speech.svg assets/img/icons/star-icon-outline.svg assets/img/icons/star-icon.svg + assets/img/icons/status-logo-icon.svg assets/img/icons/status-update.svg assets/img/icons/status.svg assets/img/icons/stickers.svg @@ -267,6 +284,7 @@ assets/img/icons/swap.svg assets/img/icons/symbols.svg assets/img/icons/tabs.svg + assets/img/icons/telegram.svg assets/img/icons/teller.svg assets/img/icons/text.svg assets/img/icons/thumbs-down.svg @@ -277,6 +295,8 @@ assets/img/icons/touch-id.svg assets/img/icons/travel-and-places.svg assets/img/icons/tributeToTalk.svg + assets/img/icons/twitter.svg + assets/img/icons/unfavourite.svg assets/img/icons/union.svg assets/img/icons/unlock.svg assets/img/icons/unpin.svg @@ -284,6 +304,7 @@ assets/img/icons/view.svg assets/img/icons/wallet.svg assets/img/icons/warning.svg + assets/img/icons/youtube.svg assets/img/status-logo-icon.svg assets/twemoji/26x26/1f004.png assets/twemoji/26x26/1f0cf.png @@ -10368,21 +10389,7 @@ assets/twemoji/svg/a9.svg assets/twemoji/svg/ae.svg assets/twemoji/svg/e50a.svg - assets/twemoji/twemoji.js - assets/img/icons/tiny/exclamation.svg - assets/img/icons/tiny/tiny-exclamation.svg - assets/img/icons/discord.svg - assets/img/icons/github.svg - assets/img/icons/key_pair_private_key.svg - assets/img/icons/key_pair_seed_phrase.svg - assets/img/icons/pencil-outline.svg - assets/img/icons/qr-scan.svg - assets/img/icons/status-logo-icon.svg - assets/img/icons/telegram.svg - assets/img/icons/twitter.svg - assets/img/icons/unfavourite.svg - assets/img/icons/youtube.svg assets/twemoji/LICENSE - assets/img/icons/bridge.svg + assets/twemoji/twemoji.js diff --git a/ui/StatusQ/src/plugin.cpp b/ui/StatusQ/src/plugin.cpp new file mode 100644 index 000000000..4e8c0e83f --- /dev/null +++ b/ui/StatusQ/src/plugin.cpp @@ -0,0 +1,39 @@ +#include + +#include +#include + +#include "StatusQ/QClipboardProxy.h" +#include "StatusQ/modelutilsinternal.h" +#include "StatusQ/rxvalidator.h" +#include "StatusQ/statussyntaxhighlighter.h" +#include "StatusQ/statuswindow.h" + +class StatusQPlugin : public QQmlExtensionPlugin { + Q_OBJECT + Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) +public: + void registerTypes(const char* uri) override + { + Q_ASSERT(uri == QLatin1String("StatusQ")); + + qmlRegisterType("StatusQ", 0, 1, "StatusWindow"); + qmlRegisterType("StatusQ", 0, 1, "StatusSyntaxHighlighter"); + qmlRegisterType("StatusQ", 0, 1, "RXValidator"); + + qmlRegisterSingletonType("StatusQ", 0, 1, "QClipboardProxy", &QClipboardProxy::qmlInstance); + + qmlRegisterSingletonType( + "StatusQ.Internal", 0, 1, "ModelUtils", &ModelUtilsInternal::qmlInstance); + + QZXing::registerQMLTypes(); + qqsfpm::registerTypes(); + } + + void initializeEngine(QQmlEngine* engine, const char* uri) override + { + QQmlExtensionPlugin::initializeEngine(engine, uri); + } +}; + +#include "plugin.moc" diff --git a/ui/StatusQ/src/statusq.qrc b/ui/StatusQ/src/statusq.qrc index 9dc951deb..0288011cf 100644 --- a/ui/StatusQ/src/statusq.qrc +++ b/ui/StatusQ/src/statusq.qrc @@ -133,6 +133,7 @@ StatusQ/Core/Utils/emojiList.js StatusQ/Core/Utils/qmldir StatusQ/Core/Utils/Utils.qml + StatusQ/Core/Utils/StatesStack.qml StatusQ/Core/qmldir StatusQ/Core/LocaleUtils.qml StatusQ/Core/StatusAnimatedStack.qml @@ -172,7 +173,6 @@ StatusQ/Popups/StatusSearchPopup.qml StatusQ/Popups/StatusSearchPopupMenuItem.qml StatusQ/Popups/StatusStackModal.qml - StatusQ/qmldir StatusQ/Components/StatusListPickerProxies.qml StatusQ/Layout/StatusSectionLayout.qml StatusQ/Layout/StatusMainLayout.qml @@ -203,8 +203,18 @@ StatusQ/Core/Utils/ModelUtils.qml StatusQ/Core/Utils/ModelsComparator.qml StatusQ/Core/Utils/ModelChangeTracker.qml + StatusQ/Components/StatusPageIndicator.qml StatusQ/Components/StatusQrCodeScanner.qml StatusQ/Components/StatusOnlineBadge.qml StatusQ/Components/StatusGroupBox.qml + StatusQ/Components/StatusDotsLoadingIndicator.qml + StatusQ/Components/StatusDraggableListItem.qml + StatusQ/Components/StatusEmojiAndColorComboBox.qml + StatusQ/Components/StatusStepper.qml + StatusQ/Components/StatusSyncDeviceDelegate.qml + StatusQ/Controls/StatusImageSelector.qml + StatusQ/Controls/StatusLinkText.qml + StatusQ/Core/Utils/ModelChangeGuard.qml + StatusQ/Core/Utils/StackViewStates.qml diff --git a/ui/StatusQ/src/typesregistration.cpp b/ui/StatusQ/src/typesregistration.cpp deleted file mode 100644 index 01d449903..000000000 --- a/ui/StatusQ/src/typesregistration.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "StatusQ/typesregistration.h" - -#include "StatusQ/QClipboardProxy.h" -#include "StatusQ/modelutilsinternal.h" -#include "StatusQ/rxvalidator.h" -#include "StatusQ/statussyntaxhighlighter.h" -#include "StatusQ/statuswindow.h" - -#include - -void registerStatusQTypes() -{ - qmlRegisterType("StatusQ", 0 , 1, "StatusWindow"); - qmlRegisterSingletonType("StatusQ", 0 , 1, "QClipboardProxy", - &QClipboardProxy::qmlInstance); - qmlRegisterType("StatusQ", 0 , 1, "StatusSyntaxHighlighter"); - qmlRegisterType("StatusQ", 0 , 1, "RXValidator"); - - qmlRegisterSingletonType("StatusQ.Internal", 0 , 1, "ModelUtils", - &ModelUtilsInternal::qmlInstance); -} diff --git a/ui/StatusQ/tests/CMakeLists.txt b/ui/StatusQ/tests/CMakeLists.txt index be9724317..eb22b2bc5 100644 --- a/ui/StatusQ/tests/CMakeLists.txt +++ b/ui/StatusQ/tests/CMakeLists.txt @@ -10,11 +10,6 @@ enable_testing() set(CMAKE_AUTOMOC ON) -# TODO: Workaround until we make StatusQ a CMake library -list(APPEND QML_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../src/") -set(QML_IMPORT_PATH "${QML_DIRS}" CACHE STRING "Qt Creator extra qml import paths") -set(QML2_IMPORT_PATH "${QML_DIRS}" CACHE STRING "Qt Creator extra qml import paths") - find_package(QT NAMES Qt6 Qt5 COMPONENTS QuickTest Qml Quick REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS QuickTest Qml Quick REQUIRED) @@ -42,3 +37,8 @@ target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Qml Qt${QT_VERSION_MAJOR}::Quick ) + +target_compile_definitions(${PROJECT_NAME} PRIVATE + STATUSQ_MODULE_PATH="${STATUSQ_MODULE_PATH}" + STATUSQ_MODULE_IMPORT_PATH="${STATUSQ_MODULE_IMPORT_PATH}" + ) diff --git a/ui/StatusQ/tests/TestComponents/tst_test-StatusImageCropPanel.qml b/ui/StatusQ/tests/TestComponents/tst_test-StatusImageCropPanel.qml index e2e611f98..ddd80cc6f 100644 --- a/ui/StatusQ/tests/TestComponents/tst_test-StatusImageCropPanel.qml +++ b/ui/StatusQ/tests/TestComponents/tst_test-StatusImageCropPanel.qml @@ -1,6 +1,8 @@ import QtQuick 2.0 import QtTest 1.0 +import StatusQ 0.1 // https://github.com/status-im/status-desktop/issues/10218 + import StatusQ.Components 0.1 import StatusQ.Controls 0.1 diff --git a/ui/StatusQ/tests/main.cpp b/ui/StatusQ/tests/main.cpp index 924f9a260..6c48e1bea 100644 --- a/ui/StatusQ/tests/main.cpp +++ b/ui/StatusQ/tests/main.cpp @@ -13,9 +13,9 @@ public: public slots: void qmlEngineAvailable(QQmlEngine *engine) { - // TODO: Workaround until we make StatusQ a CMake library - engine->addImportPath("../src/"); - engine->addImportPath("./qml/"); + engine->addImportPath(QStringLiteral(STATUSQ_MODULE_IMPORT_PATH)); + engine->addImportPath(QStringLiteral(QUICK_TEST_SOURCE_DIR) + "/qml/"); + // TODO: Alternative to not yet supported QML_ELEMENT qmlRegisterType("StatusQ.TestHelpers", 0, 1, "MonitorQtOutput"); } diff --git a/ui/app/AppLayouts/Chat/popups/community/CreateChannelPopup.qml b/ui/app/AppLayouts/Chat/popups/community/CreateChannelPopup.qml index b5e6d5188..da8f7eaa6 100644 --- a/ui/app/AppLayouts/Chat/popups/community/CreateChannelPopup.qml +++ b/ui/app/AppLayouts/Chat/popups/community/CreateChannelPopup.qml @@ -302,7 +302,7 @@ StatusDialog { return } let error = ""; - let emoji = StatusQUtils.Emoji.deparseFromParse(nameInput.input.asset.emoji) + let emoji = StatusQUtils.Emoji.deparse(nameInput.input.asset.emoji) if (!isEdit) { //scrollView.communityColor.color.toString().toUpperCase() diff --git a/ui/generate-rcc.go b/ui/generate-rcc.go index 4b2c77ea2..e0746a542 100644 --- a/ui/generate-rcc.go +++ b/ui/generate-rcc.go @@ -52,7 +52,7 @@ func main() { if err != nil { return err } - if info.IsDir() && (info.Name() == "vendor" || info.Name() == "tests") { + if info.IsDir() && (info.Name() == "vendor" || info.Name() == "tests" || info.Name() == "StatusQ") { return filepath.SkipDir } if !info.IsDir() { diff --git a/ui/imports/shared/status/StatusChatInput.qml b/ui/imports/shared/status/StatusChatInput.qml index 951f569a0..d29448313 100644 --- a/ui/imports/shared/status/StatusChatInput.qml +++ b/ui/imports/shared/status/StatusChatInput.qml @@ -763,7 +763,7 @@ Rectangle { } } - let textBeforeCursor = StatusQUtils.Emoji.deparseFromParse(plainText.substr(0, i)); + let textBeforeCursor = StatusQUtils.Emoji.deparse(plainText.substr(0, i)); return { cursor: countEmojiLengths(plainText.substr(0, i)) + messageInputField.cursorPosition + text.length - completelyPlainText.length, @@ -817,7 +817,7 @@ Rectangle { if (match && match.length > 0) { for (var i = 0; i < match.length; i++) { - length += StatusQUtils.Emoji.deparseFromParse(match[i]).length; + length += StatusQUtils.Emoji.deparse(match[i]).length; } length = length - match.length; } diff --git a/ui/main.qml b/ui/main.qml index 81c1f599f..ab1e67875 100644 --- a/ui/main.qml +++ b/ui/main.qml @@ -15,7 +15,7 @@ import shared.popups 1.0 import mainui 1.0 import AppLayouts.Onboarding 1.0 -import StatusQ 0.1 +import StatusQ 0.1 // Force import StatusQ plugin to load all StatusQ resources import StatusQ.Core.Theme 0.1 StatusWindow { diff --git a/vendor/DOtherSide/CMakeLists.txt b/vendor/DOtherSide/CMakeLists.txt index d3ed53130..39bb00283 100644 --- a/vendor/DOtherSide/CMakeLists.txt +++ b/vendor/DOtherSide/CMakeLists.txt @@ -28,8 +28,6 @@ if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) endif() endif() -add_subdirectory(../../vendor/qzxing/src qzxing) -add_subdirectory(../../vendor/SortFilterProxyModel SortFilterProxyModel) add_subdirectory(lib) if(ENABLE_DOCS) diff --git a/vendor/DOtherSide/lib/CMakeLists.txt b/vendor/DOtherSide/lib/CMakeLists.txt index 487a8120f..b313dd366 100644 --- a/vendor/DOtherSide/lib/CMakeLists.txt +++ b/vendor/DOtherSide/lib/CMakeLists.txt @@ -5,8 +5,6 @@ include(GNUInstallDirs) option(MONITORING "Tools for real-time inspection of the application." OFF) set(MONITORING_QML_ENTRY_POINT "" CACHE STRING "QML file intended to start the monitoring tool UI.") -include(../../../ui/StatusQ/StatusQSources.cmake) - if(MONITORING) include(../../../ui/MonitoringSources.cmake) endif() @@ -27,7 +25,6 @@ macro(add_target name type) add_library(${name} ${type} ${SOURCES} ${HEADERS} ${MONITORING_SOURCES} ${MONITORING_HEADERS} - ${STATUSQ_HEADERS} ${STATUSQ_SOURCES} ) if (WIN32) @@ -36,15 +33,23 @@ macro(add_target name type) set_target_properties(${name} PROPERTIES CXX_STANDARD 11 AUTOMOC ON) - target_include_directories(${name} PUBLIC include include/Qt ${STATUSQ_DIR}/include) + target_include_directories(${name} PUBLIC include include/Qt) - target_link_libraries(${name} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Qml Qt5::Quick Qt5::Network Qt5::Multimedia SortFilterProxyModel qzxing) + target_link_libraries(${name} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Qml Qt5::Quick Qt5::Network Qt5::Multimedia) target_compile_definitions(${name} PRIVATE $<$:QT_QML_DEBUG>) if(DEFINED QML_DEBUG_PORT) target_compile_definitions(${name} PRIVATE QML_DEBUG_PORT=${QML_DEBUG_PORT}) endif() + if(APPLE) + find_library(AppKit AppKit) + find_library(Foundation Foundation) + find_library(Security Security) + find_library(LocalAuthentication LocalAuthentication) + target_link_libraries(${name} PRIVATE ${AppKit} ${Foundation} ${Security} ${LocalAuthentication}) + endif() + if(MONITORING) target_include_directories(${name} PUBLIC ${MONITORING_INCLUDE_PATH}) @@ -53,7 +58,7 @@ macro(add_target name type) endif() # for DOtherSide.pc - set(PC_REQUIRES "Qt5Core, Qt5Gui, Qt5Widgets, Qt5Qml, Qt5Quick, Qt5Network, Qt5DBus, Qt5Multimedia, SortFilterProxyModel, qzxing") + set(PC_REQUIRES "Qt5Core, Qt5Gui, Qt5Widgets, Qt5Qml, Qt5Quick, Qt5Network, Qt5DBus, Qt5Multimedia") if (${Qt5QuickControls2_FOUND}) target_link_libraries(${name} PRIVATE Qt5::QuickControls2) set(PC_REQUIRES "${PC_REQUIRES}, Qt5QuickControls2") diff --git a/vendor/DOtherSide/lib/src/DOtherSide.cpp b/vendor/DOtherSide/lib/src/DOtherSide.cpp index 964a2283e..8ef2c2e5d 100644 --- a/vendor/DOtherSide/lib/src/DOtherSide.cpp +++ b/vendor/DOtherSide/lib/src/DOtherSide.cpp @@ -73,38 +73,20 @@ #include "DOtherSide/Status/KeychainManager.h" #include "DOtherSide/Status/SoundManager.h" -#include "StatusQ/QClipboardProxy.h" -#include "StatusQ/modelutilsinternal.h" -#include "StatusQ/rxvalidator.h" -#include "StatusQ/statussyntaxhighlighter.h" -#include "StatusQ/statuswindow.h" - #ifdef MONITORING #include #include "StatusDesktop/Monitoring/Monitor.h" #endif -#include -#include - namespace { void register_meta_types() { qRegisterMetaType>(); - qmlRegisterType("StatusQ", 0 , 1, "StatusWindow"); - qmlRegisterType("StatusQ", 0 , 1, "StatusSyntaxHighlighter"); - qmlRegisterType("StatusQ", 0, 1, "RXValidator"); - qmlRegisterSingletonType("StatusQ", 0 , 1, "QClipboardProxy", &QClipboardProxy::qmlInstance); - qmlRegisterSingletonType("StatusQ.Internal", 0 , 1, "ModelUtils", - &ModelUtilsInternal::qmlInstance); #ifdef MONITORING qmlRegisterSingletonType("Monitoring", 1 , 0, "Monitor", &Monitor::qmlInstance); #endif - - qqsfpm::registerTypes(); - QZXing::registerQMLTypes(); } } diff --git a/vendor/qzxing b/vendor/qzxing index 3fcdd5b65..80bb1d219 160000 --- a/vendor/qzxing +++ b/vendor/qzxing @@ -1 +1 @@ -Subproject commit 3fcdd5b65b9a3dd8bb343cf58743ed1d551e3a92 +Subproject commit 80bb1d21903881e4061a41739d413a296ceb3b49