Commit Graph

45457 Commits

Author SHA1 Message Date
41669eea8b Merge pull request 'fix(gui): make SVG icon rasterization DPI-aware in loadPixmap (#189)' (#266) from fix/toolbar-icon-dpi-scaling into main
All checks were successful
Build and Test / build (push) Successful in 29m59s
Reviewed-on: #266
2026-02-18 18:57:14 +00:00
forbes
ea49736549 test(gui): add BitmapFactory DPI-aware SVG rendering tests (#189)
All checks were successful
Build and Test / build (pull_request) Successful in 29m28s
Three tests for the loadPixmap() DPI fix:
- pixmapFromSvg(content, size) renders at the exact requested size
- getMaximumDPR() returns >= 1.0
- pixmap() loaded from an SVG file has correct devicePixelRatio and
  physical size matching 64 * DPR
2026-02-18 12:54:48 -06:00
forbes
99f2a92df4 fix(gui): make SVG icon rasterization DPI-aware in loadPixmap (#189)
loadPixmap() rendered all SVGs at a hardcoded 64x64 pixels regardless of
display DPI. On HiDPI screens, Qt then downscaled these low-resolution
pixmaps to the toolbar icon size, producing chunky/aliased icons.

Multiply the render size by getMaximumDPR() and tag the resulting pixmap
with the correct devicePixelRatio, matching the pattern already used in
pixmapFromSvg(const char* name, QSizeF size). This ensures SVGs are
rasterized at the physical resolution needed for crisp display.
2026-02-18 12:52:14 -06:00
4510ace7b9 Merge pull request 'fix(tests): add mods/sdk to sys.path in test_kindred_pure' (#265) from fix/test-sdk-path into main
All checks were successful
Build and Test / build (push) Successful in 30m40s
Sync Silo Server Docs / sync (push) Successful in 35s
Reviewed-on: #265
2026-02-17 18:53:24 +00:00
a1105c9d80 fix(tests): add mods/sdk to sys.path in test_kindred_pure
All checks were successful
Build and Test / build (pull_request) Successful in 28m20s
The SDK migration (#250) moved kindred_sdk into mods/sdk/ but the
test file was not updated with the new path, causing
ModuleNotFoundError when importing kindred_sdk.
2026-02-17 12:51:05 -06:00
06c698d425 Merge pull request 'docs: update architecture docs for addon-first model (#255)' (#264) from docs/update-architecture-for-addon-model into main
Some checks failed
Deploy Docs / build-and-deploy (push) Successful in 34s
Build and Test / build (push) Failing after 1m52s
Reviewed-on: #264
2026-02-17 18:46:03 +00:00
252e2c3b3e docs: update architecture docs for addon-first model (#255)
Some checks failed
Build and Test / build (pull_request) Failing after 2m1s
ARCHITECTURE.md:
- Replace exec()-based bootstrap flow with manifest-driven loader diagram
- Add addon lifecycle section (scan → parse → validate → resolve → load → register)
- Add SDK and C++ scaffold to source layout
- Document load order: sdk (0) → ztools (50) → silo (60)

INTEGRATION_PLAN.md:
- Add Layer 4 (Addon SDK) between bootstrap and addons (now 5 layers)
- Update Layer 3: now hosts both Python loader AND C++ scaffold
- Add Phase 1.5 (SDK) and Phase 1.75 (C++ scaffold) as DONE
- Update Phase 4 (theme): colors centralized in SDK YAML palette
- Update Phase 6 (build): now DONE with CMake install rules for all addons
- Add design decisions #7 (SDK as adaptation layer) and #8 (manifest-driven loading)

README.md:
- Update addon integration section: manifest-driven loading, SDK wrappers
- Add mods/sdk/ to project structure tree
- Update Create module description to mention C++ scaffold

Closes #255.
2026-02-17 12:38:18 -06:00
68380357fb Merge pull request 'docs: classify C++ patches by purpose and upstream-ability (#254)' (#263) from docs/classify-cpp-patches into main
Some checks failed
Deploy Docs / build-and-deploy (push) Successful in 35s
Build and Test / build (push) Failing after 1m53s
Reviewed-on: #263
2026-02-17 18:26:05 +00:00
076a1e90b0 docs: classify C++ patches by purpose and upstream-ability (#254)
Some checks failed
Build and Test / build (pull_request) Failing after 2m2s
Add Category column to Phase 2 cherry-pick table:
- 16 × Category 1 (Extension points) — KEEP
- 16 × Category 2 (Branding/theming) — KEEP, minimize
-  4 × Category 3 (Bug fixes) — UPSTREAM candidates

Add upstream verification for Category 3 patches:
- #26/#27 (Wayland scaling, menu icon size): partially upstream, menu pref not contributed
- #31 (window flickering): not upstream, good PR candidate
- #33 (ToolBarItem/reportException): Kindred-internal only

Update Assembly fixes with verified upstream status:
- All 4 patches still needed (joint flip, SIGSEGV, datum plane/point handling)
- App::Line handling fixed upstream via FreeCAD PR#20026

Closes #254.
2026-02-17 12:22:27 -06:00
ab2fde4755 Merge pull request 'feat(create): add C++ module scaffold with App/ and Gui/ targets (#251)' (#262) from feat/cpp-module-scaffold into main
Some checks failed
Build and Test / build (push) Failing after 1m57s
Reviewed-on: #262
2026-02-17 17:55:26 +00:00
5d8a253956 feat(create): add C++ module scaffold with App/ and Gui/ targets (#251)
Some checks failed
Build and Test / build (pull_request) Failing after 2m2s
Establish build infrastructure for Kindred-specific C++ features:

- CreateGlobal.h: export macros (CreateExport, CreateGuiExport)
- App/: CreateApp shared library (PyMOD_INIT_FUNC, Py::ExtensionModule)
- Gui/: CreateGui shared library (links CreateApp + FreeCADGui)
- CMakeLists.txt: add_subdirectory(App) + conditional add_subdirectory(Gui)

Scaffold only — no features. Follows the Assembly module pattern.
Existing Python Init.py/InitGui.py bootstrap unchanged.
2026-02-17 11:50:44 -06:00
6c11d64c5f Merge pull request 'fix: update silo submodule pointer after rebase onto main' (#261) from fix/silo-submodule-rebase into main
Some checks failed
Build and Test / build (push) Failing after 1m54s
Reviewed-on: #261
2026-02-17 17:05:51 +00:00
0ffa171c52 fix: update silo submodule pointer after rebase onto main
Some checks failed
Build and Test / build (pull_request) Failing after 2m2s
2026-02-17 11:04:18 -06:00
acfb627d67 Merge pull request 'refactor: migrate ztools and Silo to kindred-addon-sdk (#250)' (#260) from feat/migrate-addons-to-sdk into main
Some checks failed
Build and Test / build (push) Failing after 1m39s
Reviewed-on: #260
2026-02-17 15:50:58 +00:00
64edae4c04 refactor: migrate ztools and Silo to kindred-addon-sdk (#250)
Some checks failed
Build and Test / build (pull_request) Failing after 1m51s
Route platform API calls through kindred_sdk wrappers:

ZTools:
- Replace hardcoded MOCHA dict with kindred_sdk.get_theme_tokens()
- Add sdk dependency to package.xml

Silo:
- Replace FreeCADGui.registerEditingOverlay() with kindred_sdk.register_overlay()
- Replace FreeCADGui.addOrigin()/removeOrigin() with kindred_sdk wrappers
- Replace hardcoded _MOCHA palette subset with kindred_sdk.get_theme_tokens()
- Add sdk dependency to package.xml

Create module:
- Replace dock panel boilerplate with kindred_sdk.register_dock_panel()

Behavior is identical before and after — this is a refactor only.

Closes #250
2026-02-17 08:59:56 -06:00
0ea1b1fde5 Merge pull request 'feat(addon-system): create kindred-addon-sdk package (#249)' (#259) from feat/kindred-addon-sdk into main
Some checks failed
Build and Test / build (push) Failing after 1m37s
Reviewed-on: #259
2026-02-17 14:49:32 +00:00
e667aceead feat(addon-system): create kindred-addon-sdk package (#249)
Some checks failed
Build and Test / build (pull_request) Failing after 1m40s
Add mods/sdk/ with the kindred_sdk Python package providing a stable
API layer for addon integration with Kindred Create platform features.

Modules:
- context: editing context/overlay registration wrappers
- theme: YAML-driven palette system (Catppuccin Mocha)
- origin: FileOrigin registration helpers
- dock: deferred dock panel registration
- compat: version detection utilities

The SDK loads at priority 0 (before all other addons) via the existing
manifest-driven loader. Theme colors are defined in a single YAML
palette file instead of hardcoded Python dicts, enabling future theme
support and eliminating color duplication across addons.

Closes #249
2026-02-17 08:36:27 -06:00
34964066a0 Merge pull request 'feat(addon-system): add <kindred> package.xml extensions and schema docs' (#257) from feat/package-xml-schema into main
Some checks failed
Deploy Docs / build-and-deploy (push) Successful in 46s
Build and Test / build (push) Failing after 2m1s
Reviewed-on: #257
2026-02-17 13:15:47 +00:00
33026b6ff9 Merge pull request 'feat: addon registry with runtime introspection API (#253)' (#258) from feat/addon-registry-api into main
All checks were successful
Build and Test / build (push) Successful in 30m27s
Sync Silo Server Docs / sync (push) Successful in 50s
Reviewed-on: #258
2026-02-16 23:41:17 +00:00
forbes
9dd43a7cc3 feat: addon registry with runtime introspection API (#253)
All checks were successful
Build and Test / build (pull_request) Successful in 44m33s
Add FreeCAD.getAddonRegistry() function for runtime addon introspection.

Changes to addon_loader.py:
- Add contexts field to AddonManifest for tracking context IDs
- Add register_context() method for addons to declare contexts at runtime
- Add contexts() method returning {context_id: [addon_names]} mapping
- Parse <contexts> element from <kindred> in package.xml
- Add getAddonRegistry() function returning the registry singleton

Changes to Init.py:
- Expose getAddonRegistry as FreeCAD.getAddonRegistry after loading

Usage:
  registry = FreeCAD.getAddonRegistry()
  registry.get('ztools')        # AddonManifest for ztools
  registry.loaded()             # list of loaded addons
  registry.is_loaded('silo')    # True/False
  registry.contexts()           # {context_id: [addon_names]}

Closes #253
2026-02-16 17:33:28 -06:00
98d1877472 feat(addon-system): add <kindred> package.xml extensions and schema docs
Some checks failed
Build and Test / build (pull_request) Failing after 2m59s
Add <kindred> elements to ztools (priority=50) and silo (priority=60)
package.xml files declaring min_create_version, load_priority,
pure_python, and context metadata.

Fix addon_loader.py topological sort to use level-by-level processing
with (priority, name) sorting within each level, replacing
static_order() which did not guarantee deterministic ordering.

Add docs/src/development/package-xml-schema.md documenting the full
field reference, schema example, and backward compatibility notes.

Closes #252
2026-02-16 14:21:27 -06:00
587a95dd66 Merge pull request 'feat(bootstrap): replace exec()-based addon loading with manifest-driven loader' (#256) from feat/manifest-addon-loader into main
All checks were successful
Build and Test / build (push) Successful in 50m29s
Reviewed-on: #256
2026-02-16 19:17:59 +00:00
73f6641199 Merge pull request 'docs: extend README with architecture, platform support, and usage detail' (#247) from docs/extend-readme into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #247
2026-02-16 19:17:42 +00:00
60ceb47e4f feat(bootstrap): replace exec()-based addon loading with manifest-driven loader
All checks were successful
Build and Test / build (pull_request) Successful in 34m4s
Add addon_loader.py implementing a six-stage pipeline: scan mods/ for
package.xml files, parse standard fields and optional <kindred>
extensions via ElementTree, validate version compatibility, resolve
load order via graphlib.TopologicalSorter (with legacy fallback),
exec() Init.py/InitGui.py, and populate a runtime AddonRegistry
exposed as FreeCAD.KindredAddons.

Replace hard-coded addon lists in Init.py and InitGui.py with calls
to addon_loader.load_addons(). All QTimer-based Silo integration code
in InitGui.py is unchanged.

Backward compatible: addons without <kindred> elements load with no
constraints using the existing ztools-then-silo order.

Closes #248
2026-02-16 13:13:46 -06:00
a8df078eb3 docs: extend README with architecture, platform support, and usage detail
All checks were successful
Build and Test / build (pull_request) Successful in 35m8s
Add editing context system description, built-in context table, and
Python API reference. Add architecture section covering addon
integration and unified origin system. Expand ztools and Silo usage
sections with command breakdowns. Add platform support table. Expand
project structure tree with Kindred-specific files.
2026-02-16 11:02:11 -06:00
f4d91db094 Merge pull request 'feat(icons): add icon theming infrastructure with Catppuccin color remapping' (#246) from feat/icon-theming into main
Some checks failed
Build and Test / build (push) Has been cancelled
Deploy Docs / build-and-deploy (push) Successful in 46s
Sync Silo Server Docs / sync (push) Successful in 37s
Reviewed-on: #246
2026-02-16 02:36:17 +00:00
b083970a4d Merge branch 'main' into feat/icon-theming
Some checks failed
Build and Test / build (pull_request) Has been cancelled
2026-02-16 02:36:01 +00:00
forbes
d7b532255b feat(icons): add icon theming infrastructure with Catppuccin color remapping
Some checks failed
Build and Test / build (pull_request) Has been cancelled
- Remove hand-crafted kindred-icons/ in favor of auto-generated themed icons
- Add icons/mappings/ with FCAD.csv (Tango palette) and kindred.csv (Catppuccin Mocha)
- Add icons/retheme.py script to remap upstream FreeCAD SVG colors
- Generate icons/themed/ with 1,595 themed SVGs (45,300 color replacements)
- BitmapFactory loads icons/themed/ as highest priority before default icons
- 157-color mapping covers the full Tango palette, interpolating between
  4 luminance anchors per color family

Regenerate: python3 icons/retheme.py
2026-02-15 20:34:22 -06:00
19a91cb221 Merge pull request 'fix(assembly): guard onChanged against solver during document restore' (#245) from fix/assembly-restore-segfault into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #245
2026-02-16 00:46:17 +00:00
forbes
2fa1672edf fix(assembly): guard onChanged against solver during document restore
Some checks failed
Build and Test / build (pull_request) Has been cancelled
During document restore, PropertyLinkList::Restore sets the Group property
on AssemblyObject, triggering onChanged → updateSolveStatus → solve →
validateNewPlacements. At this point joints reference objects that haven't
been restored yet, causing a null pointer dereference (SIGSEGV).

Add an isRestoring() guard to skip solver invocation during restore,
matching the existing pattern in AssemblyLink::onChanged().
2026-02-15 18:45:00 -06:00
Kindred Bot
d497471ed3 docs: sync Silo server documentation
Some checks failed
Deploy Docs / build-and-deploy (push) Successful in 48s
Build and Test / build (push) Has been cancelled
Auto-synced from kindred/silo main branch.
2026-02-15 23:12:55 +00:00
7b1662a3d1 Merge pull request 'fix: re-add Create module to CMake build' (#244) from fix/create-module-cmake into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #244
2026-02-15 23:06:37 +00:00
forbes
128d7e0710 fix: re-add Create module to CMake build
Some checks failed
Build and Test / build (pull_request) Has been cancelled
The Create module (src/Mod/Create/) was lost from src/Mod/CMakeLists.txt
during the rebase onto upstream FreeCAD 1.2.0-dev. Without it:
- Mod/Create/ is never installed, so the bootstrap that loads ztools
  and silo never runs
- mods/ztools/ and mods/silo/ are never installed
- Startup shows 'Ignoring unknown SiloWorkbench/ZToolsWorkbench'

Also adds kc_format.py to the Create install list (was missing).
2026-02-15 17:03:38 -06:00
c9d38d92aa Merge pull request 'fix(ui): improve edge/vertex visibility on dark backgrounds (#196)' (#243) from fix/edge-visibility into main
All checks were successful
Build and Test / build (push) Successful in 47m24s
Reviewed-on: #243
2026-02-15 19:06:31 +00:00
forbes
002619b213 fix(ui): improve edge/vertex visibility on dark backgrounds (#196)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Change default edge and vertex color from near-black RGB(25,25,25)
to Catppuccin Mocha Subtext0 RGB(166,173,200) — a neutral light
blue-grey with 4.94:1 contrast against the Mocha background.

Update both the compile-time default in ViewParams.h and the
KindredCreate preference pack. The previous purple (#9344ee) had
only 2.91:1 contrast, causing edges to blend into the background
on cylindrical geometry.

Closes #196
2026-02-15 09:56:25 -06:00
6bb080773b Merge pull request 'fix(ui): rebalance Auth/Activity dock panel sizes (#190, #191)' (#242) from fix/panel-layout-balance into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #242
2026-02-15 15:52:15 +00:00
forbes
1dbeff7758 fix(ui): rebalance Auth/Activity dock panel sizes
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Use resizeDocks() to give Database Activity 80% of the vertical space
in the right dock area, keeping Database Auth compact at 120px.

Closes #190, Closes #191
2026-02-15 09:43:31 -06:00
cbc09cd3c5 Merge pull request 'fix: preserve caller globals in exec() for module Init.py/InitGui.py loading' (#240) from fix/exec-globals-regression into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #240
2026-02-15 10:22:09 +00:00
forbes
1762bd23d1 fix: preserve caller globals in exec() for module Init.py/InitGui.py loading
Some checks failed
Build and Test / build (pull_request) Has been cancelled
The previous fix (e10841a6c8) passed {"__file__": ...} as the globals
argument to exec(), which replaced the caller's globals dict entirely.
This stripped FreeCAD, FreeCADGui, Workbench, and other names that
modules expect to be available, causing NameError failures across
Material, Tux, Mesh, ReverseEngineering, OpenSCAD, Inspection, Robot,
AddonManager, MeshPart, and others.

Fix by merging __file__ into the caller's globals with
{**globals(), "__file__": str(init_py)} so both __file__ and all
existing names remain available in the executed code.
2026-02-15 04:21:26 -06:00
6caf7375c2 Merge pull request 'fix(ui): add tooltip fallback for truncated tree item names (#193)' (#239) from fix/tree-tooltip-fallback into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #239
2026-02-15 09:10:10 +00:00
190834716b Merge branch 'main' into fix/tree-tooltip-fallback
Some checks failed
Build and Test / build (pull_request) Has been cancelled
2026-02-15 09:09:58 +00:00
6e41aa67fe Merge pull request 'fix(ui): adaptive text color for breadcrumb pills (#200)' (#238) from fix/breadcrumb-contrast into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #238
2026-02-15 09:09:43 +00:00
forbes
b60f017363 fix(ui): add tooltip fallback for truncated tree item names (#193)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Set tooltips on tree widget items so hovering reveals the full name
when text is truncated by column width. Covers all code paths:
- createNewItem() — initial item creation (columns 0, 1, 2)
- slotChangeObject() — Label and Label2 property updates
- slotNewDocument() — document item creation
- slotRelabelDocument() — document rename

Closes #193
2026-02-15 03:05:05 -06:00
forbes
7bbe856ba4 fix(ui): adaptive text color for breadcrumb pills (#200)
Some checks failed
Build and Test / build (pull_request) Has been cancelled
Use WCAG relative luminance to choose dark or light text color based
on pill background brightness. Bright backgrounds (Green, Yellow,
Mauve, Teal, Peach) now get dark text (#1e1e2e) instead of the
previous fixed light text (#cdd6f4) that caused poor contrast.

Closes #200
2026-02-15 03:01:46 -06:00
3de92325a3 Merge pull request 'fix: pass __file__ to exec() in addon Init.py/InitGui.py loading' (#237) from fix/addon-init-file-variable into main
Some checks failed
Sync Silo Server Docs / sync (push) Failing after 1m18s
Build and Test / build (push) Has been cancelled
Reviewed-on: #237
2026-02-15 03:28:26 +00:00
forbes
e10841a6c8 fix: pass __file__ to exec() in addon Init.py/InitGui.py loading
Some checks failed
Build and Test / build (pull_request) Has been cancelled
DirMod.run_init() and DirModGui.run_init_gui() use exec(code) to run
addon Init.py and InitGui.py files, but don't pass __file__ in the
globals dict. Addons that reference __file__ (e.g. Silo) crash with
NameError: name '__file__' is not defined.

Pass {"__file__": str(init_py)} as the globals argument so __file__
is available in the executed code, matching the behavior of normal
Python module loading.
2026-02-14 21:27:25 -06:00
cecdb2e68c Merge pull request 'feat(ui): move editing context breadcrumb to viewport overlay (#232)' (#236) from feat/breadcrumb-viewport-overlay into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #236
2026-02-15 01:24:09 +00:00
01ed1cf7ee Merge branch 'main' into feat/breadcrumb-viewport-overlay
Some checks failed
Build and Test / build (pull_request) Has been cancelled
2026-02-15 01:23:43 +00:00
294da1dc03 Merge pull request 'fix(toolbar): add workbench-level fallback contexts (#230)' (#235) from fix/workbench-toolbar-fallback into main
Some checks failed
Build and Test / build (push) Has been cancelled
Reviewed-on: #235
2026-02-15 01:23:34 +00:00
e6dd3c6896 Merge branch 'main' into fix/workbench-toolbar-fallback
Some checks failed
Build and Test / build (pull_request) Has been cancelled
2026-02-15 01:23:25 +00:00