// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2026 Karim Gabriele Varano
using Rhino;
using Rhino.PlugIns;
namespace DOSSIER;
///
/// DOSSIER-Plugin. Drei Aufgaben:
/// 1. Bootstrappt beim Plugin-Load die Python-Module: Panels, Aliases,
/// View-Modes, BeginCommand-Hook, Welcome-Screen (alles ueber rhino/startup.py).
/// 2. Registriert native Rhino-Commands (dWall, dDoor, dStair, ...) die
/// jeweils das passende Python-Script in rhino/aliases/cmd/ ausfuehren.
/// 3. Loest das Echo-/Autocomplete-Problem der frueheren Keyboard-Macros
/// (jetzt zeigt die History "dWall" statt "_-RunPythonScript ...").
///
/// Installation: Plugin via _PluginManager → Install... registrieren. Beim
/// naechsten Rhino-Start laeuft DOSSIER automatisch. Kein zusaetzlicher
/// StartupCommands-XML-Eintrag noetig.
///
public class DossierPlugin : PlugIn
{
public DossierPlugin() { Instance = this; }
public static DossierPlugin Instance { get; private set; } = null!;
/// Plugin bei jedem Rhino-Start automatisch laden — default ist
/// "WhenNeeded" (erst beim ersten Command-Aufruf). Wir brauchen aber
/// AtStartup, damit OnLoad → startup.py-Bootstrap immer feuert.
public override PlugInLoadTime LoadTime => PlugInLoadTime.AtStartup;
protected override LoadReturnCode OnLoad(ref string errorMessage)
{
var root = DossierPaths.Root;
if (root is null)
{
errorMessage =
"DOSSIER Root nicht gefunden. Setze Env-Var DOSSIER_HOME " +
"auf den DOSSIER-Repo-Ordner (z.B. /Users/karim/STUDIO/DOSSIER) " +
"oder leg ein File ~/.dossier_home an.";
return LoadReturnCode.ErrorShowDialog;
}
RhinoApp.WriteLine($"[DOSSIER] Plugin geladen (root={root})");
// Python-Bootstrap deferred auf Idle — OnLoad feuert vor Eto-UI-Init,
// Panels brauchen aber MainWindow + Idle-Event. PythonRunner.RunDeferred
// wartet auf naechstes Idle und ruft dann startup.py auf.
PythonRunner.RunDeferred(DossierPaths.StartupPy, "startup");
return LoadReturnCode.Success;
}
}