mattercontrol/research/12-plugin-system.md

5 KiB

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<PrinterInfo, string, Task<PrinterSettings>> Cloud profile retrieval
SyncCloudProfiles Func<string, Action<double,string>, Task> Profile sync
GetPublicProfileList Func<Task<OemProfileDictionary>> Public profile listing
DownloadPublicProfileAsync Func<string, Task<PrinterSettings>> Profile download
GuestUserActive Func<bool> Auth check
GetAuthPage Func<AuthenticationContext, DialogPage> Auth dialog
UserHasPermission Func<IObject3D, bool> Permission check
UserHasPro Func<bool> License validation
PushPrintTaskToServer Func<PrintTask, Task<Dictionary<string,string>>> Cloud tracking

Editor Extensions

Custom property editors registered via EditorExtensionsConfig:

EditorExtensions.RegisterFactory((theme, undoBuffer) => new SheetEditor());
EditorExtensions.RegisterFactory((theme, undoBuffer) => new PropertyEditor(theme, undoBuffer));

IObject3DEditor Interface:

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:

Library.MenuExtensions.Add(new LibraryAction()
{
    Title = "Custom Action",
    Action = (items, library) => { /* implementation */ },
    IsEnabled = (items, library) => true
});

Scene Operations

Register custom design tools via SceneOperations:

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:

{
  "ShowHelpOption": true,
  "ShowAuthenticationDialog": true,
  "ShowGettingStarted": true,
  "WindowTitleExtra": "OEM Edition"
}

Content Providers

Register custom file format handlers:

Library.ContentProviders.Add("custom", new CustomContentProvider());

IContentProvider Interface:

public interface IContentProvider
{
    Task<IObject3D> 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 Plugin delegates
EditorExtensionsConfig DesignTools/EditorExtensionsConfig.cs Editor registry
SceneOperations ApplicationView/SceneOperations.cs Operations registry
OemSettings 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