# Plugin System ## Summary MatterControl supports extensibility through plugin hooks, registered callbacks, and editor extensions. While not a traditional assembly-loading plugin system, it provides extension points for OEM customization, cloud services integration, and custom design tools. ## Technical Description ### Extension Points The application provides several extension mechanisms: ``` ApplicationController ├── Plugin Delegates (cloud features) ├── Library.MenuExtensions (context menus) ├── EditorExtensions (property editors) └── SceneOperations (design tools) ``` ### Delegate-Based Plugins `ApplicationController` exposes `Func`/`Action` delegates for plugin integration: | Delegate | Type | Purpose | |----------|------|---------| | `GetPrinterProfileAsync` | `Func>` | Cloud profile retrieval | | `SyncCloudProfiles` | `Func, Task>` | Profile sync | | `GetPublicProfileList` | `Func>` | Public profile listing | | `DownloadPublicProfileAsync` | `Func>` | Profile download | | `GuestUserActive` | `Func` | Auth check | | `GetAuthPage` | `Func` | Auth dialog | | `UserHasPermission` | `Func` | Permission check | | `UserHasPro` | `Func` | License validation | | `PushPrintTaskToServer` | `Func>>` | Cloud tracking | ### Editor Extensions Custom property editors registered via `EditorExtensionsConfig`: ```csharp EditorExtensions.RegisterFactory((theme, undoBuffer) => new SheetEditor()); EditorExtensions.RegisterFactory((theme, undoBuffer) => new PropertyEditor(theme, undoBuffer)); ``` **IObject3DEditor Interface:** ```csharp public interface IObject3DEditor { string Name { get; } bool Unlocked { get; } GuiWidget Create(IObject3D item, UndoBuffer undoBuffer, ThemeConfig theme); } ``` ### Library Menu Extensions Add custom actions to library context menus: ```csharp Library.MenuExtensions.Add(new LibraryAction() { Title = "Custom Action", Action = (items, library) => { /* implementation */ }, IsEnabled = (items, library) => true }); ``` ### Scene Operations Register custom design tools via `SceneOperations`: ```csharp SceneOperations.RegisterOperation( new SceneSelectionOperation() { Title = "Custom Operation", Icon = iconImage, Action = (sceneContext) => { /* implementation */ } }); ``` ### OEM Customization OEMs can customize via static data: ``` StaticData/ ├── OEMSettings/ │ ├── OEMProfile.json (branding) │ └── toc.json (help content) ├── Printers/ │ └── {OEM}/ (printer profiles) └── Themes/ └── System/ (custom themes) ``` **OEMProfile.json:** ```json { "ShowHelpOption": true, "ShowAuthenticationDialog": true, "ShowGettingStarted": true, "WindowTitleExtra": "OEM Edition" } ``` ### Content Providers Register custom file format handlers: ```csharp Library.ContentProviders.Add("custom", new CustomContentProvider()); ``` **IContentProvider Interface:** ```csharp public interface IContentProvider { Task LoadAsync(Stream stream, CancellationToken cancellationToken); Task SaveAsync(IObject3D object3D, Stream stream); } ``` ### Experimental Plugins The `Plugins/Experimental` directory contains optional features: | Plugin | Purpose | |--------|---------| | Part Sheet | Part information sheets | | Custom experimental features | Beta functionality | ### Design Rationale **Delegate Pattern**: Using function delegates instead of interfaces: - Simplifies optional feature implementation - No assembly scanning required - Runtime flexibility **Static Data Customization**: File-based OEM configuration: - No code changes needed - Easy deployment - Clear separation of concerns **Registration Patterns**: Factory/registration for extensions: - Type-safe - Discovery at startup - Controlled lifecycle ## Reference ### Core Classes | Class | Location | Description | |-------|----------|-------------| | `ApplicationController` | [ApplicationView/ApplicationController.cs](MatterControlLib/ApplicationView/ApplicationController.cs) | Plugin delegates | | `EditorExtensionsConfig` | [DesignTools/EditorExtensionsConfig.cs](MatterControlLib/DesignTools/EditorExtensionsConfig.cs) | Editor registry | | `SceneOperations` | [ApplicationView/SceneOperations.cs](MatterControlLib/ApplicationView/SceneOperations.cs) | Operations registry | | `OemSettings` | [SettingsManagement/OemSettings.cs](MatterControlLib/SettingsManagement/OemSettings.cs) | OEM configuration | ### Interfaces | Interface | Purpose | |-----------|---------| | `IObject3DEditor` | Custom object editor | | `IContentProvider` | File format handler | | `INativePlatformFeatures` | Platform features | ### Extension Directories | Directory | Purpose | |-----------|---------| | `Plugins/Experimental/` | Beta features | | `StaticData/OEMSettings/` | OEM configuration | | `StaticData/Themes/` | Custom themes |