From b486987095eea8aebd323dc35b41c1ac5a34139a Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 15:15:03 +0000 Subject: [PATCH 1/7] fix: resolve Q_PLUGIN_METADATA conflicts for IComponent UI plugin build Guard Q_PLUGIN_METADATA in calendar_module.h and scala_plugin.h with #ifndef SCALA_UI_BUILD so only ScalaUIComponent exports the plugin entry point when building libscala_ui.so. - Use LogosCalendar directly in scala_ui_component.cpp (drop ScalaPlugin wrapper) - Remove scala_plugin.cpp from BUILD_UI_PLUGIN sources in CMakeLists.txt - Add LOGOS_CORE_AVAILABLE guard around initLogos() call - Add run-app Makefile target to launch logos-app-poc with scala_ui plugin Co-Authored-By: Claude Opus 4.6 --- CMakeLists.txt | 1 - Makefile | 22 +++++++++++++++++++++- src/calendar_module.h | 4 ++++ src/scala_plugin.h | 2 ++ src/scala_ui_component.cpp | 6 ++++-- 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08912ac..59a4e1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,7 +219,6 @@ if(BUILD_UI_PLUGIN) add_library(${UI_TARGET} SHARED src/scala_ui_component.cpp - src/scala_plugin.cpp src/calendar_module.cpp src/calendar_store.cpp src/calendar_sync.cpp diff --git a/Makefile b/Makefile index 3aaeebb..08e7191 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ NIX_QT_PREFIX ?= $(NIX_QTBASE);$(NIX_QTDECL);$(NIX_QTREMOBJ) .PHONY: all build test test-cli clean standalone build-standalone screenshot \ setup setup-logoscore setup-kv-module \ run-core run dev install-cli \ - build-module run-module build-ui-plugin + build-module run-module build-ui-plugin run-app # ── Build ──────────────────────────────────────────────────────────────────── @@ -163,6 +163,26 @@ build-ui-plugin: setup-nix-merged run-module: build-module $(LOGOSCORE) --modules-dir $(MODULES_DIR) --load-modules kv_module,scala_module +## Run logos-app-poc with scala_ui as the main UI plugin +LOGOS_APP_NIX ?= $(shell ls -d /nix/store/*logos-app-1.0.0 2>/dev/null | grep -v '\.drv$$' | head -1) +STAGING_DIR ?= /tmp/scala-app-staging + +run-app: build-ui-plugin + @if [ -z "$(LOGOS_APP_NIX)" ]; then echo "ERROR: logos-app-1.0.0 not found in nix store. Run: nix build github:logos-co/logos-core-poc#logos-app"; exit 1; fi + @echo "Staging logos-app with scala_ui plugin..." + rm -rf $(STAGING_DIR) + mkdir -p $(STAGING_DIR)/bin/plugins $(STAGING_DIR)/bin/modules $(STAGING_DIR)/lib + cp $(LOGOS_APP_NIX)/bin/LogosApp $(STAGING_DIR)/bin/ + cp $(LOGOS_APP_NIX)/bin/logos_host $(STAGING_DIR)/bin/ 2>/dev/null || true + cp $(LOGOS_APP_NIX)/bin/logoscore $(STAGING_DIR)/bin/ 2>/dev/null || true + @for f in $(LOGOS_APP_NIX)/lib/*; do cp -a "$$f" $(STAGING_DIR)/lib/; done 2>/dev/null || true + cp $(BUILD_UI_PLUGIN)/libscala_ui.so $(STAGING_DIR)/bin/plugins/main_ui.so + @echo "Launching logos-app with scala calendar..." + LD_LIBRARY_PATH="$(STAGING_DIR)/lib:$(NIX_QTBASE)/lib:$(NIX_QTDECL)/lib:$(NIX_QTREMOBJ)/lib:$$LD_LIBRARY_PATH" \ + QT_PLUGIN_PATH="$(NIX_QTBASE)/lib/qt-6/plugins" \ + QML2_IMPORT_PATH="$(STAGING_DIR)/lib:$(NIX_QTDECL)/lib/qt-6/qml" \ + $(STAGING_DIR)/bin/LogosApp + ## Full dev stack: build everything and run ## ── CLI (--call) targets ───────────────────────────────────────────────────── diff --git a/src/calendar_module.h b/src/calendar_module.h index f693559..23f1145 100644 --- a/src/calendar_module.h +++ b/src/calendar_module.h @@ -53,7 +53,9 @@ Q_DECLARE_INTERFACE(ILogosCalendar, ILogosCalendar_iid) #if defined(LOGOS_CORE_AVAILABLE) && !defined(SCALA_MODULE_WRAPPER) class LogosCalendar final : public QObject, public PluginInterface, public ILogosCalendar { Q_OBJECT +#ifndef SCALA_UI_BUILD Q_PLUGIN_METADATA(IID ILogosCalendar_iid FILE "metadata.json") +#endif Q_INTERFACES(PluginInterface ILogosCalendar) #elif defined(LOGOS_CORE_AVAILABLE) && defined(SCALA_MODULE_WRAPPER) class LogosCalendar final : public QObject, public PluginInterface, public ILogosCalendar { @@ -62,7 +64,9 @@ class LogosCalendar final : public QObject, public PluginInterface, public ILogo #else class LogosCalendar final : public QObject, public ILogosCalendar { Q_OBJECT +#ifndef SCALA_UI_BUILD Q_PLUGIN_METADATA(IID ILogosCalendar_iid FILE "metadata.json") +#endif Q_INTERFACES(ILogosCalendar) #endif diff --git a/src/scala_plugin.h b/src/scala_plugin.h index 40990d2..7c2b759 100644 --- a/src/scala_plugin.h +++ b/src/scala_plugin.h @@ -18,7 +18,9 @@ */ class ScalaPlugin : public QObject, public PluginInterface { Q_OBJECT +#ifndef SCALA_UI_BUILD Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "metadata.json") +#endif Q_INTERFACES(PluginInterface) public: diff --git a/src/scala_ui_component.cpp b/src/scala_ui_component.cpp index 1e9ac79..502c66f 100644 --- a/src/scala_ui_component.cpp +++ b/src/scala_ui_component.cpp @@ -1,5 +1,5 @@ #include "scala_ui_component.h" -#include "scala_plugin.h" +#include "calendar_module.h" #include #include @@ -9,12 +9,14 @@ QWidget* ScalaUIComponent::createWidget(LogosAPI* logosAPI) { quickWidget->setMinimumSize(800, 600); quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); - auto* backend = new ScalaPlugin(); + auto* backend = new LogosCalendar(); backend->setParent(quickWidget); +#ifdef LOGOS_CORE_AVAILABLE if (logosAPI) { backend->initLogos(logosAPI); } +#endif quickWidget->rootContext()->setContextProperty("calendarModule", backend); From f014247f4b2cd6502b0132dc1eda34edf9b7f211 Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 15:25:53 +0000 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20run-app=20=E2=80=94=20clean=20LD=5FL?= =?UTF-8?q?IBRARY=5FPATH,=20add=20LIBGL=5FALWAYS=5FSOFTWARE=20for=20softwa?= =?UTF-8?q?re=20rendering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 08e7191..f64a459 100644 --- a/Makefile +++ b/Makefile @@ -178,9 +178,11 @@ run-app: build-ui-plugin @for f in $(LOGOS_APP_NIX)/lib/*; do cp -a "$$f" $(STAGING_DIR)/lib/; done 2>/dev/null || true cp $(BUILD_UI_PLUGIN)/libscala_ui.so $(STAGING_DIR)/bin/plugins/main_ui.so @echo "Launching logos-app with scala calendar..." - LD_LIBRARY_PATH="$(STAGING_DIR)/lib:$(NIX_QTBASE)/lib:$(NIX_QTDECL)/lib:$(NIX_QTREMOBJ)/lib:$$LD_LIBRARY_PATH" \ + LD_LIBRARY_PATH="$(STAGING_DIR)/lib:$(NIX_QTBASE)/lib:$(NIX_QTDECL)/lib:$(NIX_QTREMOBJ)/lib:/lib/x86_64-linux-gnu" \ QT_PLUGIN_PATH="$(NIX_QTBASE)/lib/qt-6/plugins" \ QML2_IMPORT_PATH="$(STAGING_DIR)/lib:$(NIX_QTDECL)/lib/qt-6/qml" \ + LIBGL_ALWAYS_SOFTWARE=1 \ + QT_QUICK_BACKEND=software \ $(STAGING_DIR)/bin/LogosApp ## Full dev stack: build everything and run From 496ac66e70cfb8cca00f253b21099167a0e0bac3 Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 15:42:43 +0000 Subject: [PATCH 3/7] feat: add nix ui-plugin package output for IComponent .so build Adds logos-cpp-sdk and logos-liblogos as flake inputs and exposes a ui-plugin package that builds libscala_ui.so via cmake with BUILD_UI_PLUGIN=ON, using the workspace Qt/SDK dependencies. Co-Authored-By: Claude Opus 4.6 --- flake.lock | 770 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 54 +++- 2 files changed, 822 insertions(+), 2 deletions(-) create mode 100644 flake.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..9db9e26 --- /dev/null +++ b/flake.lock @@ -0,0 +1,770 @@ +{ + "nodes": { + "logos-capability-module": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_2", + "logos-liblogos": "logos-liblogos_2", + "nixpkgs": [ + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767809111, + "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "owner": "logos-co", + "repo": "logos-capability-module", + "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-capability-module", + "type": "github" + } + }, + "logos-capability-module_2": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_7", + "logos-liblogos": "logos-liblogos_4", + "nixpkgs": [ + "logos-module-builder", + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767809111, + "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "owner": "logos-co", + "repo": "logos-capability-module", + "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-capability-module", + "type": "github" + } + }, + "logos-cpp-sdk": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1772028960, + "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "95f763b48d74bcdc63093b05159f43500cab139e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_10": { + "inputs": { + "nixpkgs": "nixpkgs_12" + }, + "locked": { + "lastModified": 1767724329, + "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_2": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_3": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_4": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1772028960, + "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "95f763b48d74bcdc63093b05159f43500cab139e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_5": { + "inputs": { + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1767724329, + "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_6": { + "inputs": { + "nixpkgs": "nixpkgs_8" + }, + "locked": { + "lastModified": 1772028960, + "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "95f763b48d74bcdc63093b05159f43500cab139e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_7": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_8": { + "inputs": { + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_9": { + "inputs": { + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1772028960, + "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "95f763b48d74bcdc63093b05159f43500cab139e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-liblogos": { + "inputs": { + "logos-capability-module": "logos-capability-module", + "logos-cpp-sdk": "logos-cpp-sdk_4", + "logos-module": "logos-module", + "nix-bundle-appimage": "nix-bundle-appimage", + "nix-bundle-dir": "nix-bundle-dir_2", + "nixpkgs": [ + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773346195, + "narHash": "sha256-QiLHYKwtVSbivN7H8OO/rsMcRtmxlcuxWPdaWQI+RcI=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "def730603373ad3952550998bcd59b76304628a8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-liblogos_2": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_3", + "nixpkgs": [ + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1761845775, + "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-liblogos_3": { + "inputs": { + "logos-capability-module": "logos-capability-module_2", + "logos-cpp-sdk": "logos-cpp-sdk_9", + "logos-module": "logos-module_2", + "nix-bundle-appimage": "nix-bundle-appimage_2", + "nix-bundle-dir": "nix-bundle-dir_4", + "nixpkgs": [ + "logos-module-builder", + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1772115748, + "narHash": "sha256-sPdAuYiLOjsulrk+uKMT7EG05ZlGT7OYEpgUh+f0nME=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "07780444deb99f10e600247e3696ba495f2f071a", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-liblogos_4": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_8", + "nixpkgs": [ + "logos-module-builder", + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1761845775, + "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-module": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_5", + "nixpkgs": [ + "logos-liblogos", + "logos-module", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770999556, + "narHash": "sha256-anpsEniGTTwUAwknRxjaT9GP4avHzIsolEHdHDTV9rM=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "d1b35f335f938bb5de21a2a6010f1104075bdb1c", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-module-builder": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_6", + "logos-liblogos": "logos-liblogos_3", + "nixpkgs": [ + "logos-module-builder", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773345665, + "narHash": "sha256-BBEjGd3azhQxKo1AC6J4psWOYltidlLHDXFPuuk//AE=", + "owner": "logos-co", + "repo": "logos-module-builder", + "rev": "fbacdfe3fcb208f4c36eee42417ac55a4ed7582f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module-builder", + "type": "github" + } + }, + "logos-module_2": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_10", + "nixpkgs": [ + "logos-module-builder", + "logos-liblogos", + "logos-module", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770999556, + "narHash": "sha256-anpsEniGTTwUAwknRxjaT9GP4avHzIsolEHdHDTV9rM=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "d1b35f335f938bb5de21a2a6010f1104075bdb1c", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "nix-bundle-appimage": { + "inputs": { + "nix-bundle-dir": "nix-bundle-dir", + "nixpkgs": "nixpkgs_6" + }, + "locked": { + "lastModified": 1772047346, + "narHash": "sha256-RUsTUxKCxuQ3+D2LfBbK0EX1vF7HNMkpWgOGFfZbrEg=", + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "rev": "4d68437c97ac59c3c70c1b2b116235c434d571a8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "type": "github" + } + }, + "nix-bundle-appimage_2": { + "inputs": { + "nix-bundle-dir": "nix-bundle-dir_3", + "nixpkgs": "nixpkgs_13" + }, + "locked": { + "lastModified": 1772047346, + "narHash": "sha256-RUsTUxKCxuQ3+D2LfBbK0EX1vF7HNMkpWgOGFfZbrEg=", + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "rev": "4d68437c97ac59c3c70c1b2b116235c434d571a8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "type": "github" + } + }, + "nix-bundle-dir": { + "inputs": { + "nixpkgs": [ + "logos-liblogos", + "nix-bundle-appimage", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771971384, + "narHash": "sha256-fq0H+sxQhkGN054jdN+ZfHZibbOjHA+KD5SpRH78T1g=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "1ecb9662145a1ad84007a970b4bef50a4af159c9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nix-bundle-dir_2": { + "inputs": { + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1771971384, + "narHash": "sha256-fq0H+sxQhkGN054jdN+ZfHZibbOjHA+KD5SpRH78T1g=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "1ecb9662145a1ad84007a970b4bef50a4af159c9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nix-bundle-dir_3": { + "inputs": { + "nixpkgs": [ + "logos-module-builder", + "logos-liblogos", + "nix-bundle-appimage", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771971384, + "narHash": "sha256-fq0H+sxQhkGN054jdN+ZfHZibbOjHA+KD5SpRH78T1g=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "1ecb9662145a1ad84007a970b4bef50a4af159c9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nix-bundle-dir_4": { + "inputs": { + "nixpkgs": "nixpkgs_14" + }, + "locked": { + "lastModified": 1771971384, + "narHash": "sha256-fq0H+sxQhkGN054jdN+ZfHZibbOjHA+KD5SpRH78T1g=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "1ecb9662145a1ad84007a970b4bef50a4af159c9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 1771848320, + "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2fc6539b481e1d2569f25f8799236694180c0993", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1770562336, + "narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d6c71932130818840fc8fe9509cf50be8c64634f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1771848320, + "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2fc6539b481e1d2569f25f8799236694180c0993", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1770562336, + "narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d6c71932130818840fc8fe9509cf50be8c64634f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_8": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_9": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk", + "logos-liblogos": "logos-liblogos", + "logos-module-builder": "logos-module-builder", + "nixpkgs": [ + "logos-module-builder", + "nixpkgs" + ] + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 5a4432f..f207c8d 100644 --- a/flake.nix +++ b/flake.nix @@ -4,9 +4,11 @@ inputs = { logos-module-builder.url = "github:logos-co/logos-module-builder"; nixpkgs.follows = "logos-module-builder/nixpkgs"; + logos-cpp-sdk.url = "github:logos-co/logos-cpp-sdk"; + logos-liblogos.url = "github:logos-co/logos-liblogos"; }; - outputs = { self, logos-module-builder, nixpkgs, ... }: + outputs = { self, logos-module-builder, nixpkgs, logos-cpp-sdk, logos-liblogos, ... }: let moduleOutputs = logos-module-builder.lib.mkLogosModule { src = ./.; @@ -15,18 +17,66 @@ systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f { pkgs = import nixpkgs { inherit system; }; + logosSdk = logos-cpp-sdk.packages.${system}.default; + logosLiblogos = logos-liblogos.packages.${system}.default; }); in moduleOutputs // { - packages = forAllSystems ({ pkgs }: + packages = forAllSystems ({ pkgs, logosSdk, logosLiblogos }: let base = moduleOutputs.packages.${pkgs.system} or {}; + + ui-plugin = pkgs.stdenv.mkDerivation { + pname = "scala-ui-plugin"; + version = "0.1.0"; + src = ./.; + + nativeBuildInputs = [ + pkgs.cmake + pkgs.ninja + pkgs.pkg-config + pkgs.qt6.wrapQtAppsHook + ]; + + buildInputs = [ + pkgs.qt6.qtbase + pkgs.qt6.qtdeclarative + pkgs.qt6.qtremoteobjects + ]; + + cmakeFlags = [ + "-DBUILD_UI_PLUGIN=ON" + "-DLOGOS_CPP_SDK_ROOT=${logosSdk}" + "-DLOGOS_LIBLOGOS_ROOT=${logosLiblogos}" + ]; + + buildPhase = '' + runHook preBuild + cmake --build . --target scala_ui -j''${NIX_BUILD_CORES:-1} + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out/lib + cp libscala_ui${pkgs.stdenv.hostPlatform.extensions.sharedLibrary} $out/lib/ + runHook postInstall + ''; + + dontWrapQtApps = true; + + meta = with pkgs.lib; { + description = "Scala UI plugin (IComponent) for logos-app-poc"; + platforms = platforms.unix; + }; + }; in base // { ui = pkgs.runCommand "scala-ui" {} '' mkdir -p $out/qml cp -r ${./qml}/* $out/qml/ ''; + inherit ui-plugin; } ); }; From 53f79f76035da0d4d34cee6cbd6519139ed39b2a Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 16:17:17 +0000 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20flake=20inputs=20=E2=80=94=20add=20f?= =?UTF-8?q?ollows=20for=20logos-cpp-sdk=20and=20logos-liblogos=20nixpkgs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flake.nix | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index f207c8d..eaf7f1d 100644 --- a/flake.nix +++ b/flake.nix @@ -4,8 +4,15 @@ inputs = { logos-module-builder.url = "github:logos-co/logos-module-builder"; nixpkgs.follows = "logos-module-builder/nixpkgs"; - logos-cpp-sdk.url = "github:logos-co/logos-cpp-sdk"; - logos-liblogos.url = "github:logos-co/logos-liblogos"; + logos-cpp-sdk = { + url = "github:logos-co/logos-cpp-sdk"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + logos-liblogos = { + url = "github:logos-co/logos-liblogos"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.logos-cpp-sdk.follows = "logos-cpp-sdk"; + }; }; outputs = { self, logos-module-builder, nixpkgs, logos-cpp-sdk, logos-liblogos, ... }: From cafef6c6852408e46129ac5c46905de1a828c9a1 Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 16:35:23 +0000 Subject: [PATCH 5/7] fix: enable AUTORCC so QML files are embedded as resources in scala_ui .so MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The BUILD_UI_PLUGIN target listed qml/scala_ui.qrc in sources but CMAKE_AUTORCC was not enabled, so the .qrc was never processed by rcc — resulting in a blank white UI when loading qrc:/scala/CalendarView.qml. Co-Authored-By: Claude Opus 4.6 --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59a4e1e..bf6f97a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Core Qml) set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) # ── Logos SDK + liblogos ────────────────────────────────────────────────────── set(LOGOS_CPP_SDK_ROOT "" CACHE PATH "Path to logos-cpp-sdk install") From 26330eb92256682e47f1b68da62dfcfb3b6d4d5a Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 18:08:09 +0000 Subject: [PATCH 6/7] feat: wire up kv_module persistence for scala_ui (#72) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add scala_module dependency to scala_ui manifest so logos-app loads the full dependency chain: scala_ui → scala_module → kv_module. This enables persistent calendar storage via kv_module when running inside logos-app. Co-Authored-By: Claude Opus 4.6 --- ui_metadata.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui_metadata.json b/ui_metadata.json index 64adfbe..d860a68 100644 --- a/ui_metadata.json +++ b/ui_metadata.json @@ -4,5 +4,10 @@ "description": "Scala — Secure Calendar App UI for Logos", "author": "jimmy-claw", "type": "ui", - "category": "productivity" + "category": "productivity", + "dependencies": ["scala_module"], + "main": { + "linux-amd64": "scala_ui.so" + }, + "manifestVersion": "0.1.0" } From 52bd052712554245700c23f1da59a5a7ed4c1945 Mon Sep 17 00:00:00 2001 From: Jimmy Claw Date: Fri, 13 Mar 2026 19:51:34 +0000 Subject: [PATCH 7/7] feat: call setDataDir on kv_module for file-backed persistence After setClient(), invoke kv_module.setDataDir() with the app's data directory so calendars are persisted to disk via the FileBackend. This requires logos-kv-module PR#28 (Q_INVOKABLE setDataDir). Closes #72 Co-Authored-By: Claude Opus 4.6 --- src/calendar_store.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calendar_store.cpp b/src/calendar_store.cpp index 1d23f31..5bfb84e 100644 --- a/src/calendar_store.cpp +++ b/src/calendar_store.cpp @@ -6,6 +6,7 @@ #include #include +#include // ── Construction ───────────────────────────────────────────────────────────── @@ -14,6 +15,10 @@ CalendarStore::CalendarStore() = default; #ifdef LOGOS_CORE_AVAILABLE void CalendarStore::setClient(LogosAPIClient *client) { m_kvClient = client; + // Switch kv_module to file backend for persistence + QString dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/kv-data"; + m_kvClient->invokeRemoteMethod("kv_module", "setDataDir", dataDir); + qDebug() << "CalendarStore: set kv_module data dir:" << dataDir; } #endif