feat(sdk): add IToolbarProvider interface to kcsdk (#354)

This commit is contained in:
forbes
2026-03-01 09:32:25 -06:00
parent ab4054eb9e
commit 4eb643a26f
10 changed files with 366 additions and 14 deletions

View File

@@ -1,19 +1,20 @@
# kindred-addon-sdk — stable API for Kindred Create addon integration
from kindred_sdk.version import SDK_VERSION
from kindred_sdk.context import (
register_context,
unregister_context,
register_overlay,
unregister_overlay,
inject_commands,
current_context,
refresh_context,
)
from kindred_sdk.theme import get_theme_tokens, load_palette
from kindred_sdk.origin import register_origin, unregister_origin
from kindred_sdk.dock import register_dock_panel
from kindred_sdk.compat import create_version, freecad_version
from kindred_sdk.context import (
current_context,
inject_commands,
refresh_context,
register_context,
register_overlay,
unregister_context,
unregister_overlay,
)
from kindred_sdk.dock import register_dock_panel
from kindred_sdk.origin import register_origin, unregister_origin
from kindred_sdk.theme import get_theme_tokens, load_palette
from kindred_sdk.toolbar import register_toolbar
from kindred_sdk.version import SDK_VERSION
__all__ = [
"SDK_VERSION",
@@ -26,6 +27,7 @@ __all__ = [
"refresh_context",
"get_theme_tokens",
"load_palette",
"register_toolbar",
"register_origin",
"unregister_origin",
"register_dock_panel",

View File

@@ -0,0 +1,37 @@
"""Toolbar provider registration.
Wraps the C++ ``kcsdk.register_toolbar()`` API with a Python fallback
that extracts toolbar data and calls ``inject_commands()`` directly.
"""
def _kcsdk_available():
"""Return the kcsdk module if available, else None."""
try:
import kcsdk
return kcsdk
except ImportError:
return None
def register_toolbar(provider):
"""Register a toolbar provider for automatic context injection.
When the C++ ``kcsdk`` module is available, delegates to its
``register_toolbar()`` which stores the provider and auto-injects
commands into the target editing contexts.
Falls back to extracting data from the provider and calling
``inject_commands()`` directly for each target context.
"""
kcsdk = _kcsdk_available()
if kcsdk is not None:
kcsdk.register_toolbar(provider)
return
# Fallback: extract data and call inject_commands directly
from kindred_sdk import inject_commands
for ctx_id in provider.context_ids():
inject_commands(ctx_id, provider.toolbar_name(), provider.commands())