Commit Graph

45221 Commits

Author SHA1 Message Date
79c85ed2e5 fix(gui): add interactive methods to FileOriginPython and fix Console API calls
Some checks failed
Build and Test / build (push) Failing after 2m13s
- Add openDocumentInteractive() and saveDocumentAsInteractive() to FileOriginPython
- Fix Console API: Warning -> warning, Error -> error in OriginManager.cpp
- These methods bridge Python origins to the new interactive document operations
2026-02-05 14:25:21 -06:00
38358e431d feat(gui): implement issues #10 and #12 - LocalFileOrigin and Std_* delegation
Issue #10: Local filesystem origin implementation
- Add openDocumentInteractive() method to FileOrigin interface for UI-based
  file opening (shows file dialog)
- Add saveDocumentAsInteractive() method for UI-based save as
- Implement LocalFileOrigin::openDocumentInteractive() with full file dialog
  support, filter list building, and module handler integration
- Implement LocalFileOrigin::saveDocumentAsInteractive() delegating to
  Gui::Document::saveAs()

Issue #12: Modify Std_* commands to delegate to current origin
- StdCmdNew::activated() now delegates to origin->newDocument() and sets
  up view orientation for the new document
- StdCmdOpen::activated() delegates to origin->openDocumentInteractive()
  with connection state checking for authenticated origins
- StdCmdSave::activated() uses document's owning origin (via findOwningOrigin)
  for save, falling back to saveDocumentAsInteractive if no filename
- StdCmdSaveAs::activated() delegates to origin->saveDocumentAsInteractive()
- Updated isActive() methods to check for active document

The Std_* commands now work seamlessly with both LocalFileOrigin and
SiloOrigin. When Local origin is selected, standard file dialogs appear.
When Silo origin is selected, Silo's search/creation dialogs appear.

Import and Export commands are left unchanged as they operate on document
content rather than document lifecycle.

Closes #10, Closes #12
2026-02-05 14:02:26 -06:00
5319387030 fix(ci): add --force to tag fetch, fix ccache keys, disable Windows/macOS builds
Some checks failed
Build and Test / build (push) Failing after 16m39s
Release Build / publish-release (push) Has been cancelled
Release Build / build-linux (push) Has been cancelled
- build.yml: Add --force flag to tag fetch to prevent 'would clobber
  existing tag' error when 'latest' tag already exists locally
- build.yml: Use github.run_id instead of github.sha for ccache keys
  to ensure unique keys per workflow run while still benefiting from
  restore-key prefix matching

- release.yml: Add --force flag to tag fetch commands
- release.yml: Use github.run_id for ccache keys (same reason)
- release.yml: Comment out build-macos and build-windows jobs since
  no native runners are available for these platforms
- release.yml: Update publish-release to only depend on build-linux
- release.yml: Update release notes to indicate macOS/Windows builds
  are not yet available

The ccache key strategy now works correctly with immutable caches:
- Save with unique key: ccache-{workflow}-{branch}-{run_id}
- Restore with prefix fallback: tries same branch first, then main

The macOS and Windows jobs require platform-specific tooling:
- macOS: dmgbuild, pyobjc-framework-Quartz for DMG creation
- Windows: NSIS, Visual Studio toolchain for installer creation

These cannot be easily cross-compiled from Linux. The jobs are
preserved as comments so they can be re-enabled when native runners
become available or when cross-compilation tooling is set up.
v0.1.1
2026-02-05 13:41:07 -06:00
405e04bd3e chore: update silo submodule with origin adapter
Some checks are pending
Build and Test / build (push) Has started running
Updates silo submodule to include:
- SiloOrigin adapter implementing FileOrigin interface (#11)
- UUID tracking via SiloItemId property
- Automatic origin registration on workbench init

Refs: #11
2026-02-05 13:29:54 -06:00
7535a48ec4 feat(gui): add origin abstraction layer for unified file operations
Implements Issue #9: Origin abstraction layer

This commit introduces a foundational abstraction for document origins,
enabling FreeCAD to work with different storage backends (local filesystem,
Silo PLM, future cloud services) through a unified interface.

## Core Components

### FileOrigin Abstract Base Class (FileOrigin.h/cpp)
- Defines interface for document origin handlers
- Identity methods: id(), name(), nickname(), icon(), type()
- Workflow characteristics: tracksExternally(), requiresAuthentication()
- Capability queries: supportsRevisions(), supportsBOM(), supportsPartNumbers()
- Connection state management with fastsignals notifications
- Document identity: documentIdentity() returns UUID, documentDisplayId() for display
- Property sync: syncProperties() for bidirectional database sync
- Core operations: newDocument(), openDocument(), saveDocument(), saveDocumentAs()
- Extended PLM operations: commitDocument(), pullDocument(), pushDocument(), etc.

### LocalFileOrigin Implementation
- Default origin for local filesystem documents
- ownsDocument(): Returns true if document has NO SiloItemId property
- Wraps existing FreeCAD file operations (App::GetApplication())

### OriginManager Singleton (OriginManager.h/cpp)
- Follows WorkbenchManager pattern (instance()/destruct())
- Manages registered FileOrigin instances
- Tracks current origin selection with persistence
- Provides document-to-origin resolution via findOwningOrigin()
- Emits signals: signalOriginRegistered, signalOriginUnregistered,
  signalCurrentOriginChanged
- Preferences stored at: User parameter:BaseApp/Preferences/General/Origin

### Python Bindings (FileOriginPython.h/cpp)
- Adapts Python objects to FileOrigin C++ interface
- Enables Silo addon to implement origins in Python
- Thread-safe with Base::PyGILStateLocker
- Static addOrigin()/removeOrigin() for registration

### Python API (ApplicationPy.cpp)
- FreeCADGui.addOrigin(obj) - Register Python origin
- FreeCADGui.removeOrigin(obj) - Unregister Python origin
- FreeCADGui.getOrigin(id) - Get origin info as dict
- FreeCADGui.listOrigins() - List all registered origin IDs
- FreeCADGui.activeOrigin() - Get current origin info
- FreeCADGui.setActiveOrigin(id) - Set active origin

## Design Decisions

1. **UUID Tracking**: Documents tracked by SiloItemId (immutable UUID),
   SiloPartNumber used for human-readable display only

2. **Ownership by Properties**: Origin ownership determined by document
   properties (SiloItemId), not file path location

3. **Local Storage Always**: All documents saved locally; origins change
   workflow and identity model, not storage location

4. **Property Syncing**: syncProperties() enables bidirectional sync of
   document metadata with database (Description, SourcingType, etc.)

## Files Added
- src/Gui/FileOrigin.h
- src/Gui/FileOrigin.cpp
- src/Gui/FileOriginPython.h
- src/Gui/FileOriginPython.cpp
- src/Gui/OriginManager.h
- src/Gui/OriginManager.cpp

## Files Modified
- src/Gui/CMakeLists.txt - Added new source files
- src/Gui/Application.cpp - Initialize/destruct OriginManager
- src/Gui/ApplicationPy.h - Added Python method declarations
- src/Gui/ApplicationPy.cpp - Added Python method implementations

Refs: #9
2026-02-05 13:17:23 -06:00
1c309a0ca8 feat(icons): complete Phase 3 icon migration (#6)
All checks were successful
Build and Test / build (push) Successful in 1h13m23s
This completes the Kindred Create icon set with 191 Catppuccin Mocha themed SVG icons.

New icon categories added:
- DrawStyle icons (7): Wireframe, Shaded, FlatLines, etc.
- View orientation icons (12): Front, Rear, Top, Bottom, etc.
- Tree view icons (15): Tree_*, tree-* for document tree
- Link & Feature icons (14): Link*, Feature, Group, etc.
- Button/navigation icons (11): button_*, edit_OK, edit_Cancel
- Cursor icons (4): pan, rotate, zoom, through
- Selection icons (8): edge, face, vertex, clear-selection
- DAG view icons (4): Pass, Fail, Pending, Visible
- Std_* view/toggle icons (15): ShowObjects, HideObjects, etc.
- Utility icons (25+): Document, folder, info, Warning, etc.

All icons follow the design standards:
- 32x32 viewBox with rx=4 rounded background
- Catppuccin Mocha color palette
- Category-based color coding:
  - Blue: File operations
  - Green: Edit/Creation operations
  - Yellow/Peach: View operations
  - Mauve/Lavender: System/Settings
  - Red: Destructive actions

Closes #6
2026-02-05 12:05:58 -06:00
2d7735b4c1 feat(icons): add Phase 2 workbench icons in Catppuccin Mocha
Some checks failed
Build and Test / build (push) Has been cancelled
Add 32 workbench-related icons with consistent color coding:

Workbench Selectors (8):
- PartDesignWorkbench (Blue #89b4fa)
- SketcherWorkbench (Yellow #f9e2af)
- AssemblyWorkbench (Green #a6e3a1)
- PartWorkbench (Blue #89b4fa)
- TechDrawWorkbench (Mauve #cba6f7)
- SpreadsheetWorkbench (Sky #89dceb)
- MeshWorkbench (Pink #f5c2e7)
- DraftWorkbench (Peach #fab387)

Part Design Tools (8):
- PartDesign_Body, PartDesign_NewSketch
- PartDesign_Pad, PartDesign_Pocket, PartDesign_Revolution
- PartDesign_Hole, PartDesign_Fillet, PartDesign_Chamfer

Sketcher Tools (5):
- Sketcher_CreateLine, Sketcher_CreateRectangle
- Sketcher_CreateCircle, Sketcher_CreateArc, Sketcher_CreatePoint

Sketcher Constraints (5):
- Constraint_PointOnPoint (Coincident)
- Constraint_Horizontal, Constraint_Vertical
- Constraint_Perpendicular, Constraint_Dimension

Assembly Tools (6):
- Assembly_CreateAssembly, Assembly_InsertLink
- Assembly_CreateJointFixed, Assembly_CreateJointRevolute
- Assembly_CreateJointSlider, Assembly_CreateJointDistance

Ref #5
2026-02-05 11:36:53 -06:00
69414c5dc5 refactor(icons): update color scheme for View and System icons
Some checks are pending
Build and Test / build (push) Has started running
Change color assignments for better semantic meaning:
- View operations: Yellow (#f9e2af) / Peach (#fab387)
- System/Settings: Mauve (#cba6f7) / Lavender (#b4befe)

Updated icons:
- View: zoom-in, zoom-out, zoom-fit-best, view-refresh, view-fullscreen,
        Std_ViewHome, Std_ViewScreenShot, Std_ToggleVisibility
- System: preferences-system, help-browser, application-exit, Std_Refresh

Also updated README.md color usage documentation.
2026-02-05 11:28:44 -06:00
c28d6f92cf feat(icons): add Phase 1 core toolbar icons in Catppuccin Mocha
Some checks failed
Build and Test / build (push) Has been cancelled
Complete the core toolbar icon set with 15 additional icons:

File Operations:
- document-save-as.svg - Save As with pencil indicator
- Std_SaveAll.svg - Save All with stacked disks
- Std_Import.svg - Import with arrow into document
- Std_Export.svg - Export with arrow out of document
- document-print.svg - Printer with paper

Edit Operations:
- edit-select-all.svg - Selection rectangle with corner handles

View Operations:
- zoom-fit-best.svg - Fit to view with corner arrows
- Std_ViewHome.svg - Home view with house icon
- view-fullscreen.svg - Fullscreen expand arrows
- Std_ViewScreenShot.svg - Camera for screenshots
- Std_ToggleVisibility.svg - Eye icon for visibility
- Std_Refresh.svg - Circular refresh arrow

Common Actions:
- help-browser.svg - Question mark in circle
- application-exit.svg - Door with exit arrow
- Std_DuplicateSelection.svg - Duplicate objects

All icons follow the Catppuccin Mocha design system with:
- 32x32 viewBox
- Rounded rectangle background (surface0 #313244)
- Consistent stroke widths and color usage

Ref #4
2026-02-05 11:23:47 -06:00
224feda4ad feat(icons): add Catppuccin Mocha icon override infrastructure
Some checks failed
Build and Test / build (push) Has been cancelled
Set up the foundation for custom Kindred Create icons:

- Add kindred-icons/ directory with Catppuccin Mocha themed SVG icons
- Modify BitmapFactory to prioritize kindred-icons/ in search path
- Add CMake install rules to package icons with application
- Include documentation (README.md) with design guidelines
- Add 12 initial icons as proof of concept:
  - File: document-new, document-open, document-save
  - Edit: edit-undo, edit-redo, edit-copy, edit-cut, edit-paste, delete
  - View: zoom-in, zoom-out, view-refresh
  - System: preferences-system

All icons follow the standard template:
- 32x32 viewBox
- Rounded rectangle background (rx=4, surface0 #313244)
- Catppuccin Mocha color palette

Closes #3
2026-02-05 11:17:27 -06:00
67e5598b2e fix(build): add missing Qt and Gui includes to ThemeSelectorWidget
Some checks failed
Build and Test / build (push) Successful in 1h9m41s
Release Build / build-linux (push) Failing after 18m43s
Release Build / build-macos (arm64, macos-14) (push) Has been cancelled
Release Build / build-macos (x86_64, macos-13) (push) Has been cancelled
Release Build / build-windows (push) Has been cancelled
Release Build / publish-release (push) Has been cancelled
Add QApplication, QEvent, and Gui/Application.h includes that were
missing, causing build failures with undeclared identifiers for qApp,
QEvent::LanguageChange, and Gui::Application::Instance.
2026-02-05 10:06:00 -06:00
7431746ef0 fix(ci): support 'latest' tag for release builds
Some checks failed
Build and Test / build (push) Failing after 43m15s
Release Build / build-linux (push) Failing after 2m18s
Release Build / build-macos (arm64, macos-14) (push) Has been cancelled
Release Build / build-macos (x86_64, macos-13) (push) Has been cancelled
Release Build / build-windows (push) Has been cancelled
Release Build / publish-release (push) Has been cancelled
2026-02-05 08:07:15 -06:00
044983330c Merge pull request 'fix(ci): use shallow tag-only fetch to avoid 504 timeout' (#2) from fix/ci-tag-fetch-504 into main
Some checks failed
Build and Test / build (push) Failing after 44m23s
2026-02-04 19:30:50 +00:00
d60db282ea fix(ci): use shallow tag-only fetch to avoid 504 timeout
Some checks failed
Build and Test / build (pull_request) Failing after 41m54s
The previous `git fetch --tags` triggers full history negotiation
against the upstream FreeCAD-derived repo (~45k commits), causing
HTTP 504 gateway timeouts on the Gitea instance.

Replace with a depth=1 refspec fetch that pulls only tag refs
without negotiating reachable objects behind them. This is
sufficient for `git describe --tags --always` to resolve a
version string.
2026-02-04 13:30:34 -06:00
2a5a645ace Merge pull request 'fix(ui): clean up theme selector and migration for single-theme setup' (#1) from fix/theme-selector-migration into main
Some checks are pending
Build and Test / build (push) Has started running
2026-02-04 19:27:31 +00:00
434ae797a4 fix(ui): clean up theme selector and migration for single-theme setup
Some checks failed
Build and Test / build (pull_request) Failing after 2m30s
- Remove dead code in migrateOldTheme() that set Theme parameter for
  KindredCreate.yaml, which no longer exists in the Stylesheets build
- Remove orphaned Classic.yaml and KindredCreate.yaml parameter files
  from Stylesheets CMakeLists and from disk
- Remove unused includes in ThemeSelectorWidget.cpp (QApplication,
  QEvent, Gui/Application.h)
2026-02-04 13:26:55 -06:00
8042b7dcc8 fix(ci): use shallow clone with tag fetch to avoid 45k commit download
Some checks failed
Build and Test / build (push) Successful in 1h11m46s
Release Build / build-linux (push) Failing after 2m32s
Release Build / build-macos (arm64, macos-14) (push) Has been cancelled
Release Build / build-macos (x86_64, macos-13) (push) Has been cancelled
Release Build / build-windows (push) Has been cancelled
Release Build / publish-release (push) Has been cancelled
fetch-depth: 0 downloads the entire FreeCAD history (45k+ commits),
causing 13+ minute checkout times. Switch to fetch-depth: 1 with a
separate lightweight tag fetch for git describe.
v0.1.0
2026-02-03 12:13:01 -06:00
7ce21aceb6 fix(ci): remove container directive for dockerized runner compatibility
Some checks failed
Build and Test / build (push) Failing after 17m20s
Release Build / build-linux (push) Has been cancelled
Release Build / build-macos (arm64, macos-14) (push) Has been cancelled
Release Build / build-macos (x86_64, macos-13) (push) Has been cancelled
Release Build / build-windows (push) Has been cancelled
Release Build / publish-release (push) Has been cancelled
Gitea act_runner in Docker mode maps the runs-on label to a container
image via its config. The container: block conflicts with this by
attempting to create a nested container. Remove it so the runner's
own docker://ubuntu:24.04 mapping is used directly.
2026-02-03 10:59:26 -06:00
1b3f780aa1 chore: migrate submodules to public repos, rework docs and CI/CD
Some checks failed
Build and Test / build (push) Has been cancelled
- Update .gitmodules: ztools, silo, and OndselSolver now reference
  public git.kindred-systems.com URLs instead of internal Gitea
- Merge OndselSolver numerical solver with ML solver scaffolding
  into unified kindred/solver repository
- Rewrite README.md for conciseness
- Add docs/CI_CD.md with full pipeline documentation
- Rework CI/CD workflows for public dockerized runners
- Add multi-platform release builds (Linux, macOS, Windows)
- Release workflow triggers on v* tags only
- Update docs/REPOSITORY_STATE.md and docs/INTEGRATION_PLAN.md
2026-02-03 10:54:47 -06:00
forbes
0ef9ffcf51 chore: fork OndselSolver to internal Gitea instance
Some checks failed
Build and Test / build (push) Has been cancelled
Point the OndselSolver submodule at kindred/ondsel on gitea.kindred.internal
so CI can fetch our fix for the Newton-Raphson convergence bug.
2026-02-02 06:24:17 -06:00
forbes
ab7153b97f fix(solver): correct Newton-Raphson convergence check in OndselSolver
Some checks failed
Build and Test / build (push) Has been cancelled
The isConvergedToNumericalLimit() method compared dxNorms->at(iterNo)
to itself instead of the previous iteration (iterNo - 1). This meant
the solver could never detect convergence improvement, causing it to
exhaust iterations on assemblies with many constraints, producing
'iterNo > iterMax' exceptions and 'grounded object moved' warnings.

Also updates silo submodule pointer.
2026-02-01 21:10:19 -06:00
forbes
3e09e7c099 fix: prevent QThread crash and Unknown command warnings on startup
Some checks failed
Build and Test / build (push) Has been cancelled
InitGui.py: Store SiloAuthDockWidget reference on the QDockWidget to
prevent Python from garbage-collecting it while its 30-second QTimer is
still running. The lost reference caused 'QThread: Destroyed while
thread is still running' followed by abort.

ztools InitGui.py: Move addWorkbenchManipulator() call from module-level
into Initialize(), after command modules are imported. The manipulator
references ZTools_DatumCreator, ZTools_DatumManager, ZTools_EnhancedPocket,
and ZTools_RotatedLinearPattern, which don't exist until the imports run.

Also updates README.md and submodule pointers.
2026-02-01 19:58:01 -06:00
forbes
1fea7c3d2e feat(silo): dock auth panel, SSE live updates, and improved pull workflow
Some checks failed
Build and Test / build (push) Has been cancelled
- Add _setup_silo_auth_panel() to dock auth widget in right panel at startup
- Update silo submodule: SSE listener, revision pull dialog, conflict detection
2026-02-01 18:15:16 -06:00
forbes
1056ef1b99 Update silo submodule: retry on duplicate part number during item creation 2026-02-01 18:15:16 -06:00
forbes
5b7b770f80 fix(ci): use fixed path for ccache dir to survive workspace changes
The Gitea runner assigns a different workspace directory hash on each
run (e.g. /var/lib/gitea-runner/.cache/act/<hash>/hostexecutor/). When
CCACHE_DIR was set to ${{ github.workspace }}/.ccache, the actions/cache
save and restore operated on a path that changed every run, making the
restored cache land in the wrong location. This caused 0% hit rate on
the second build despite the cache being saved successfully.

Fix by using a fixed path (/tmp/ccache-kindred-create) for CCACHE_DIR
and the cache action path. CCACHE_BASEDIR remains set to the workspace
so ccache stores relative source paths, making cache entries portable
across different workspace directories.
2026-02-01 18:15:16 -06:00
forbes
626790904d feat(silo): add interactive database browser to activity panel
Replace the static QListWidget with a full SiloActivityPanel class
that provides:

- Search field with 300ms debounce for filtering items by name
- Type filter dropdown (All / Part / Assembly)
- Refresh button for manual reload
- QTableWidget with Part Number, Description, Type, and Updated columns
- Part Details pane that appears on row selection showing part number,
  description, type, revision, last updated date, and project tags
- Open button / double-click to open items via SiloSync.open_item()
- Info button showing revision history dialog (reuses Silo_Info pattern)
- Graceful error handling for connection failures and empty results
2026-02-01 18:15:16 -06:00
forbes
0d4545b7d6 feat(theme): add spanning tree branch lines to model tree view
Replace the simple open/closed disclosure arrows with full spanning
tree branch connectors that draw pipe-style lines between parent and
child items in the model tree.

New dark-theme SVGs created with Catppuccin colors:
- branch_vline_dark: vertical continuation line (#585b70)
- branch_more_dark: T-junction for mid-siblings
- branch_end_dark: L-junction for last sibling
- branch_more_closed_dark: T-junction + closed chevron (#a6adc8)
- branch_more_open_dark: T-junction + open chevron (#cdd6f4)
- branch_end_closed_dark: L-junction + closed chevron
- branch_end_open_dark: L-junction + open chevron

Updated QSS branch pseudo-selectors in KindredCreate.qss to map all
seven branch states (vline, more, end, more-closed, more-open,
end-closed, end-open) to the corresponding SVGs.

Updated ztools submodule with matching CatppuccinMocha.qss changes.
2026-02-01 18:15:16 -06:00
forbes
8ea3f141ff Update ztools submodule: fix datum selection table alignment 2026-02-01 18:15:16 -06:00
forbes
35d54c770b Update ztools submodule: fix datum params UI widget deletion crash 2026-02-01 18:15:16 -06:00
forbes
7bad1b787f ci: add ccache persistence via actions/cache for build and release workflows
- Move CCACHE_DIR inside workspace for actions/cache compatibility
- Add CCACHE_BASEDIR for portable cache entries across workspaces
- Add cache restore step with fallback keys (branch -> main)
- Add cache save step (runs even on test/packaging failure)
- Enhance ccache diagnostics with pre/post build stats and cache size
- Release builds fall back to main branch build cache for warm starts
2026-02-01 18:15:16 -06:00
forbes
b7fdccc99a Update submodules: Silo auth integration, ZTools, GSL, AddonManager, googletest 2026-01-31 19:13:47 -06:00
forbes
0316630d25 Update silo submodule: align client auth with backend API tokens and session login 2026-01-31 16:24:18 -06:00
forbes
36a88d0959 Add Silo auth dock widget, update silo submodule
Wire up the new Silo authentication dock panel in InitGui.py:
- _setup_silo_auth_panel() creates the Database Auth dock widget
- Tabified with the existing Database Activity panel on the right dock
- Deferred to 4500ms to ensure activity panel exists first
- Widget reference pinned on the dock panel to prevent GC

Update silo submodule to include auth widget, login flow, token
management, enhanced settings dialog, and silo-auth.svg icon.
2026-01-31 14:36:51 -06:00
forbes
b3fedfb19f fix(theme): reduce tree item horizontal padding to prevent truncation
QTreeView::item had padding: 4px on all sides, eating 8px of
horizontal space per item. Combined with icon decorations and
indentation this caused excessive middle-elide truncation in the
model tree. Change to padding: 2px 0px (vertical only).
2026-01-31 12:33:01 -06:00
forbes
fea1280fa9 fix(theme): set alternate-background-color on item views
Qt defaults alternate-background-color to white when unset. Add
#181825 (Mantle) as the alternate row color to QTreeView, QListView,
QTableView, and the property editor in both KindredCreate.qss copies.
2026-01-31 12:29:31 -06:00
forbes
8639b6fd8a fix(gui): resolve unknown command and style token errors at startup
Move ZTools command imports before workbench initialization in
InitGui.py so commands are registered before PartDesign/Sketcher
init triggers toolbar state restoration.

Import silo_commands eagerly in _setup_silo_menu() so Silo commands
exist before the WorkbenchManipulator references them.

Create KindredCreate.yaml and Classic.yaml theme parameter files
defining all style tokens (PrimaryColor, TextForegroundColor, etc.)
used by FreeCAD.qss and the overlay stylesheet. Register them in
CMakeLists.txt and set the Theme preference in KindredCreate.cfg.

Add migration in migrateOldTheme() to set Theme=KindredCreate for
existing users who have the stylesheet but not the Theme parameter.
2026-01-31 11:47:28 -06:00
forbes
eb80c07f57 UI fixes, ZTools-PartDesign merge, Silo enhancements, and BOM integration
Stylesheet fixes (KindredCreate theme):
- Add tree branch expand/collapse SVG indicators (branch_closed.svg,
  branch_open.svg) visible on dark background
- Add QSS rules for QTreeView::branch pseudo-states
- Add min-height: 20px to QHeaderView::section to fix bottom clipping
- Merge QDockWidget::title and QSint--ActionGroup QToolButton padding
  improvements from Stylesheets copy into canonical
- Add SpreadsheetGui--SheetTableView QLineEdit cell editor styling
- Sync all three QSS copies (resources/preferences, src/Gui/Stylesheets,
  src/Gui/PreferencePacks) to canonical version

ZTools-PartDesign workbench integration:
- Add _ZToolsPartDesignManipulator via WorkbenchManipulator API
- Injects DatumCreator, DatumManager into Part Design Helper Features toolbar
- Injects EnhancedPocket into Part Design Modeling Features toolbar
- Injects RotatedLinearPattern into Part Design Transformation Features toolbar
- Adds corresponding PartDesign menu entries after PartDesign_Boolean

Silo enhancements:
- Add Silo_ToggleMode command: toggle switch in File toolbar that swaps
  Ctrl+O/S/N between standard FreeCAD and Silo equivalents
- Add SSL certificate file browser in Silo Settings dialog (SslCertPath
  preference, supports .pem/.crt/.cer)
- Update _get_ssl_context() to load custom CA cert before system CAs
- Expand SiloMenuManipulator: Silo_New, Silo_Open, Silo_Save, Silo_Commit,
  Silo_Pull, Silo_Push, Silo_BOM in File menu
- Integrate upstream Silo_BOM command (tabbed BOM/Where-Used dialog)

Submodule updates:
- silo: Silo mode toggle, SSL cert browsing, BOM menu integration
- ztools: PartDesign WorkbenchManipulator and Catppuccin theme sync

Documentation:
- Add docs/REPOSITORY_STATE.md: comprehensive repository state report with
  architecture overview, submodule status, potential issues, feature stubs,
  and Silo integration path forward
2026-01-31 09:27:01 -06:00
forbes
d0365468e2 Update ztools submodule: parametric datum updates via AttachExtension 2026-01-31 08:09:59 -06:00
forbes
174ebf521c Update ztools submodule: fix Qt6, ViewProvider, and attachment property bugs 2026-01-31 04:26:23 -06:00
forbes
ddefb23652 Fix Assembly solver ignoring PartDesign datum plane references
When a PartDesign::Plane (including ZTools datums like ZPlane_Mid,
ZPlane_Offset) is used as a reference in an Assembly joint,
findPlacement() returns an all-zero placement, making the joint
constraint degenerate and ineffective.

Root cause: getElementName() strips the terminal '.Plane' suffix
because it matches the hardcoded set for App::LocalCoordinateSystem
datum elements ({X, Y, Z, Point, Line, Plane}). This is correct
behavior — the issue is that findPlacement()'s 'whole part' branch
only handled App::Line objects and returned App.Placement() (zeros)
for everything else, including PartDesign::Plane datums.

The fix extends the 'whole part' branch in findPlacement() to
compute a proper placement for PartDesign::Plane objects by
extracting the plane's center-of-gravity and surface rotation from
its Shape, then converting to object-local coordinates. This matches
the existing convention used for Face elements elsewhere in the
function.

Also adds handling for PartDesign::Point datums, which hit the same
empty-element code path.

Existing App::Plane origin references (XY_Plane, etc.) are unaffected
since isDerivedFrom('PartDesign::Plane') does not match App::Plane.
2026-01-30 20:46:40 -06:00
forbes
a9c444131a Fix .deb bundle: restore XKB and fontconfig paths in wrapper
The XKB_CONFIG_ROOT, FONTCONFIG_FILE, and FONTCONFIG_PATH exports were
accidentally removed in e68a5fef (SSL certificate fix). Without these,
the bundled libxkbcommon falls back to a hardcoded CI runner path that
does not exist on the target system, causing xkb_context_new to return
NULL and SIGSEGV in xkb_context_ref during Wayland keyboard init at
splash screen startup.
2026-01-30 09:58:14 -06:00
forbes
9dc50cef72 Fix SIGSEGV in Assembly solver during document restore
AssemblyObject::onChanged() was calling updateSolveStatus() when the
Group property changed during document restore. This triggered the
solver (solve -> validateNewPlacements) while child objects were still
being deserialized, causing a segfault in validateNewPlacements() due
to accessing uninitialized data.

Add isRestoring() and isPerformingTransaction() guards matching the
pattern used by GroupExtension::onChanged() and other FreeCAD modules.
2026-01-29 23:54:10 -06:00
forbes
1b1f74ed90 Update silo and ztools submodules
silo: Fix SIGSEGV when opening assembly documents via Silo Open dialog
  - Defer FreeCAD.openDocument() to after dialog.exec_() returns

ztools: Fix workbench init and spreadsheet syntax errors
  - Use Gui.activateWorkbench() instead of direct Initialize() calls
  - Fix syntax errors in spreadsheet_commands.py
2026-01-29 22:42:38 -06:00
forbes
c9da41f10c Fix invisible arrows on spin boxes, combo boxes, and headers
The QSS arrow styles only set width/height without specifying an image
or border-based triangle, so Qt fell back to platform-drawn arrows that
were invisible against the dark button background (#45475a).

Use CSS border triangles to render visible arrows in #cdd6f4 (Catppuccin
Mocha text color) with hover (#f5e0dc) and disabled (#6c7086) states
for spin boxes, combo boxes, and header sort indicators.
2026-01-29 22:31:30 -06:00
forbes
9c14f17bee Fix .deb desktop icon: use Kindred logo instead of FreeCAD icon
The build-deb.sh was copying org.freecad.FreeCAD.svg as the desktop
icon because it checked the install directory first, where only the
FreeCAD icon exists. Reorder to prefer resources/branding/kindred-logo.svg.

Also generate PNG icons from the SVG using rsvg-convert when available,
for better desktop environment compatibility.
2026-01-29 22:30:21 -06:00
forbes
7e0fcdf9dd Update silo submodule: smarter API URL path handling 2026-01-29 22:27:15 -06:00
forbes
73f7caf3a5 Update silo submodule: fix API URL and SSL certificate handling
- Auto-appends /api to base URL so users can enter just the hostname
- Loads system CA bundle for SSL verification of internal certificates
- Improved settings dialog hint text
2026-01-29 22:26:38 -06:00
forbes
6facd8227b Fix SSL: use system CA certificates in wrapper scripts
The bundled Python's openssl has a hardcoded cafile path from the build
environment (/var/lib/gitea-runner/.cache/...) which does not exist on
the target system. This causes SSL certificate verification to fail for
internal services like silo.kindred.internal that use the FreeIPA CA.

Set SSL_CERT_FILE to the system CA bundle (/etc/ssl/certs/ca-certificates.crt
on Debian/Ubuntu or /etc/pki/tls/certs/ca-bundle.crt on RHEL) in both
the kindred-create and kindred-create-cmd wrapper scripts. This allows
the bundled Python to verify certificates signed by any CA in the
system trust store, including the FreeIPA CA.
2026-01-29 22:24:39 -06:00
forbes
dbac82e731 Fix silo loading and add integration enhancements
Fix the exec() calls in Create module's Init.py and InitGui.py to pass
__file__ and __name__ in the globals dict. The silo workbench code uses
__file__ to resolve icon paths, but exec() without explicit globals
does not provide it, causing 'name __file__ is not defined' errors.

Also add three silo integration enhancements to InitGui.py:
- First-startup check: launches Silo_Settings dialog if API URL is not
  configured on first run
- File menu injection: WorkbenchManipulator inserts Silo Open, Save,
  and Commit commands into the File menu across all workbenches
- Database activity panel: dock widget showing recent silo items,
  displayed on the right side of the main window
2026-01-29 20:57:39 -06:00
forbes
092a8a6d8b chore(silo): update submodule to include icon fix and settings dialog 2026-01-29 19:29:06 -06:00