From 9da73fe6e7b1f577b032781d0bbc696a05fa2d2c Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 14 Feb 2026 15:17:38 -0600 Subject: [PATCH 1/6] =?UTF-8?q?feat(silo):=20update=20silo=20submodule=20?= =?UTF-8?q?=E2=80=94=20headless=20runner=20entry=20points=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds runner.py with dag_extract, validate, and export entry points for silorunner compute jobs. Closes #217 --- mods/silo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/silo b/mods/silo index 3dd0da3964..da2a360c56 160000 --- a/mods/silo +++ b/mods/silo @@ -1 +1 @@ -Subproject commit 3dd0da39648d756cc5df0fab757a85d01c3bae6e +Subproject commit da2a360c566edd88d6c66c4f7270505d225270e8 From 7fb3aa4c018385cb7cba8135e8c656a811ee4107 Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 14 Feb 2026 15:22:35 -0600 Subject: [PATCH 2/6] =?UTF-8?q?feat(silo):=20update=20silo=20submodule=20?= =?UTF-8?q?=E2=80=94=20DAG=20and=20job=20SSE=20events=20(#218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends SiloEventListener with signals for dag.updated, dag.validated, and job lifecycle events (created, claimed, progress, completed, failed, cancelled). Closes #218 --- mods/silo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/silo b/mods/silo index da2a360c56..3d38e4b4c3 160000 --- a/mods/silo +++ b/mods/silo @@ -1 +1 @@ -Subproject commit da2a360c566edd88d6c66c4f7270505d225270e8 +Subproject commit 3d38e4b4c376237d4a0c34d091d0379dd31c803c From d7f539351091143224fbc6ff9addcd104ae2ade1 Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 14 Feb 2026 15:28:46 -0600 Subject: [PATCH 3/6] =?UTF-8?q?feat(silo):=20update=20silo=20submodule=20?= =?UTF-8?q?=E2=80=94=20DAG=20status=20in=20Activity=20panel=20(#219)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shows DAG sync status, validation results, and job lifecycle events in the Database Activity dock widget via SSE signals. Closes #219 --- mods/silo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/silo b/mods/silo index 3d38e4b4c3..dc64a66f0f 160000 --- a/mods/silo +++ b/mods/silo @@ -1 +1 @@ -Subproject commit 3d38e4b4c376237d4a0c34d091d0379dd31c803c +Subproject commit dc64a66f0f397d2f9ba58377d88f4cbafebd408e From 79501bd5ca12baa63b2ccfc41651622b4ee3346d Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 14 Feb 2026 19:15:51 -0600 Subject: [PATCH 4/6] fix(ui): match origin dropdown height to workbench dropdown (#231) Add min-height: 20px to OriginSelectorWidget in KindredCreate.qss so it renders at the same visual height as the WorkbenchComboBox. The two widgets use different Qt base classes (QToolButton vs QComboBox) with different intrinsic size hints, causing a height mismatch in the toolbar. --- src/Gui/Stylesheets/KindredCreate.qss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Gui/Stylesheets/KindredCreate.qss b/src/Gui/Stylesheets/KindredCreate.qss index c5a239a9f3..5025fb8ae8 100644 --- a/src/Gui/Stylesheets/KindredCreate.qss +++ b/src/Gui/Stylesheets/KindredCreate.qss @@ -1207,6 +1207,7 @@ Gui--OriginSelectorWidget { padding: 4px 8px; min-width: 70px; max-width: 120px; + min-height: 20px; } Gui--OriginSelectorWidget:hover { From 38041641582cde6fcf59d7b3cef041d2cc51ca97 Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 14 Feb 2026 19:16:29 -0600 Subject: [PATCH 5/6] fix(prefs): apply KindredCreate defaults after Reset All (#229) When "Reset All" is used in Preferences, restoreDefaults() clears the entire User parameter tree via ParameterManager::Clear(). Widgets then fall back to upstream FreeCAD hardcoded defaults (e.g. light theme, default units) instead of Kindred Create defaults. After clearing, apply the KindredCreate preference pack to restore Create-specific baseline settings (Catppuccin Mocha theme, toolbar layout, unit preferences, etc.). --- src/Gui/Dialogs/DlgPreferencesImp.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Gui/Dialogs/DlgPreferencesImp.cpp b/src/Gui/Dialogs/DlgPreferencesImp.cpp index 8a2ae44905..a7a0a3e70b 100644 --- a/src/Gui/Dialogs/DlgPreferencesImp.cpp +++ b/src/Gui/Dialogs/DlgPreferencesImp.cpp @@ -66,8 +66,10 @@ #include "Dialogs/DlgPreferencesImp.h" #include "ui_DlgPreferences.h" +#include "Application.h" #include "BitmapFactory.h" #include "MainWindow.h" +#include "PreferencePackManager.h" #include "Tools.h" #include "WidgetFactory.h" @@ -834,6 +836,12 @@ void DlgPreferencesImp::restoreDefaults() .GetParameterGroupByPath("User parameter:BaseApp/Preferences/General") ->SetBool("SaveUserParameter", saveParameter); + // Re-apply Kindred Create defaults so we don't revert to upstream FreeCAD defaults + auto* packMgr = Gui::Application::Instance->prefPackManager(); + if (packMgr) { + packMgr->apply("KindredCreate"); + } + reject(); } } From 9a566cabf9ba827308409e444cde85bad3a07dfc Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 14 Feb 2026 19:17:04 -0600 Subject: [PATCH 6/6] fix(toolbar): add workbench-level fallback contexts (#230) PartDesign, Sketcher, and Assembly toolbars use DefaultVisibility::Unavailable and rely on EditingContextResolver to show them. When switching to these workbenches without a specific editing state (e.g. PartDesign with no Body activated), no context matches and all workbench toolbars stay hidden. Add workbench-level fallback contexts at priority 20 that match when the workbench is active regardless of editing state: - partdesign.workbench: shows Helper Features + Sketcher toolbars - sketcher.workbench: shows Sketcher + Sketcher Tools - assembly.workbench: shows Assembly toolbar These fill the gap between object-specific contexts (priority 30+) and the empty_document fallback (priority 10). --- src/Gui/EditingContext.cpp | 44 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/Gui/EditingContext.cpp b/src/Gui/EditingContext.cpp index 73133a98f5..5794061892 100644 --- a/src/Gui/EditingContext.cpp +++ b/src/Gui/EditingContext.cpp @@ -36,6 +36,7 @@ #include "ToolBarManager.h" #include "ViewProvider.h" #include "ViewProviderDocumentObject.h" +#include "WorkbenchManager.h" using namespace Gui; @@ -330,6 +331,49 @@ void EditingContextResolver::registerBuiltinContexts() }, }); + // --- Workbench-level fallbacks (priority 20) --- + // Show basic workbench toolbars when the workbench is active but no + // specific editing context matches (e.g. no Body selected in PartDesign). + + registerContext({ + /*.id =*/QStringLiteral("partdesign.workbench"), + /*.labelTemplate =*/QStringLiteral("Part Design"), + /*.color =*/QLatin1String(CatppuccinMocha::Mauve), + /*.toolbars =*/ + {QStringLiteral("Part Design Helper Features"), QStringLiteral("Sketcher")}, + /*.priority =*/20, + /*.match =*/ + []() { + return WorkbenchManager::instance()->activeName() == "PartDesignWorkbench"; + }, + }); + + registerContext({ + /*.id =*/QStringLiteral("sketcher.workbench"), + /*.labelTemplate =*/QStringLiteral("Sketcher"), + /*.color =*/QLatin1String(CatppuccinMocha::Green), + /*.toolbars =*/ + {QStringLiteral("Sketcher"), QStringLiteral("Sketcher Tools")}, + /*.priority =*/20, + /*.match =*/ + []() { + return WorkbenchManager::instance()->activeName() == "SketcherWorkbench"; + }, + }); + + registerContext({ + /*.id =*/QStringLiteral("assembly.workbench"), + /*.labelTemplate =*/QStringLiteral("Assembly"), + /*.color =*/QLatin1String(CatppuccinMocha::Blue), + /*.toolbars =*/ + {QStringLiteral("Assembly")}, + /*.priority =*/20, + /*.match =*/ + []() { + return WorkbenchManager::instance()->activeName() == "AssemblyWorkbench"; + }, + }); + // --- Empty document --- registerContext({ /*.id =*/QStringLiteral("empty_document"),