Eigene Settings für Plugins

  • Hallo,


    Soekkle hat gefragt wie er eigene Settings für sein Plugin hinterlegen kann. Damit es mal öffentlich dokumentiert ist, hier die Antwort :)


    1. Registrieren von Settings:


    Sowohl in der GUI als auch im Kernel kann mit folgendem Code ein Setting registriert werden:

    Code
    //In this example I am registering an Integer Setting which is Application specific and can range from 0 > 20.
    var metadata = new SettingsMetadata(ESettingsRegisterType.APPLICATION, "<Category>", "<SettingName>", "<UniqueKeyToIdentifySetting, e.g. MYPLUGIN.MYSETTING>", "<Description>", null);
    /* 
     * The last parameter is "List of Values in case Value Type is an EnumType, otherwise null".  
     * As we want to register an int, it is null 
     */
    metadata.Min = 0;
    metadata.Max = 20; 
    SettingsManager.getInstance().registerSetting(metadata, 1);
    //The last parameter is the initial Value and also describes the Type we want to have. If we wanted to register a "String" Setting, we would simply provide a String Value as last Parameter

    => WICHTIG: In der GUI gibt es die Unterscheidung zwischen GUI Setting und Setting. Ein GUI Setting ist ein Setting, welches nur für die GUI gilt, also NICHT im Kernel gespeichert wird. Alle anderen Settings werden im Kernel gespeichert und stehen dadurch allen GUIs sowie dem Kernel selbst zur Verfügung. Logischerweise kann auf diese Settings auch nur zugegriffen werden, wenn die GUI Verbunden ist. GUI Settings können auch Ohne Verbindung gelesen werden.




    2. Darstellen von Settings
    Settings können in den Vorhandenen Kategorien angezeigt werden. Dazu einfach bei "<Category>" Eintragen in welcher Kategorie (e.g. "HAL") Das Setting angezeigt werden soll.


    3. Eigene Kategorie erzeugen
    Auch das geht:

    Code
    //In der Gui in der Init Methode des GUI Plugins
    var myPluginNode = new ConfigurableSettingsNode("Settings:MyPlugin", "MyPlugin", "image.png");
    
    //Image File must be placed in Kernel or GUI Symbols Folder and should be of Size 32x32
    var branchId = SettingsManager.getInstance().GetSettignsBranchID();
    var branch = PEManager.getInstance().GetBranchByID(branchId);
    //Add Node to Branch
    branch.AddRecursive(branch.ID, myPluginNode);
    //Now you have a node and all Settings in Category "MyPlugin" will be shown there


    4. Auslesen / Schreiben von Settings

    Code
    SettingsManager.getInstance().setSetting(ESettingsType.APPLICATION, "MYPLUGIN.MYSETTING", 17);
    var value = SettingsManager.getInstance().getSetting<int>(ESettingsType.APPLICATION, "MYPLUGIN.MYSETTING");

    5. Events


    Code
    SettingsManager.getInstance().SettingChanged += MySettingsHandler;
    
    private void MySettingsHandler(object sender, SettingChangedEventArgs args)
    {
       if(args.PropertyName == "MYPLUGIN.MYSETTING")
       {
          var v = args.NewValue;
          //Do whatever with new Value
       }
    }


    Bei Fragen oder Fehlern bitte posten

    Das Leben ist NP vollständig!

    Edited 4 times, last by Soon5: Syntax-Hervorhebung aktiviert; Änderung nach Post 3 ().

  • Moin alle,

    Was benötige ich, um auf SettingsMetadata zugreifen zu können?


    Den gewollten Settingsmanager für die GUI habe ich in der Bibliothek "Lumos.GUI.Settings" gefunden.


    Bzw.: Kann mir jemand alle notwendigen Bilbiotheken für den Beispielcode schreiben?



    Code
    using Lumos.GUI.Settings;
  • Hallo alle,

    momentan bekomme ich das irgendwie nicht zum Laufen, vielleicht mache ich etwas elementares falsch und einer von euch kann mir helfen :)

    Ich habe innerhalb meiner GUI für das PlugIn eine Checkbox, welche einstellen soll, ob der Scheduler an/aus ist (später soll also die Einstellung bool als value haben, fürs erste wollte ich aber überhaupt mal irgendeine Einstellung setzen können)

    Zusätzlich möchte ich in der PlugIn-Klasse entsprechend beim Start von DMX die Einstellungen initialisieren:


  • Herzlichen Glückwunsch, Sie haben einen Bug gefunden :-D.


    Die eigene Kategorie anlegen wirft den Fehler. Ich behebe das für die nächste Version. Für eure aktuelle Entwicklung würde ich vorschlagen, dass ihr keinen eigenen "ConfigurableSettingsNode" anlegt.


    Das Setting Schreiben / Lesen könnt ihr trotzdem, dafür braucht ihr den 2. Codeblock nicht.


    Aber was falsch ist, die "SettingsMetadata" musst du nur 1x anlegen, also das muss in das "initializePlugin". Im chkbox_isSchedulerRunning_CheckedChanged machst du nur noch die Zeilen 16 und 17.

  • Hallo Soon,

    habe das Anlegen der eigenen Kategorie erstmal auskommentiert. Die SettingsMetadata liegt jetzt auch im initializePlugin().
    Da liegt bei mir momentan auch noch das Problem. Bei mir klappt das Hinzufügen der neuen Einstellung in einer verfügbaren Kategorien nicht.

    Woher weiß ich denn, wie intern der Name bzw. die Zugriffs UID der SettingsNode lautet? Das bräuchte ich doch, oder?


    SchedulerPlugin.cs

    Code
    protected override void initializePlugin()
    {
    this._mySchedulerForm = new SchedulerForm();
    
    var metadata = new SettingsMetadata(ESettingsRegisterType.APPLICATION, "<General>", "<SchedulerAutoRun>", "<SchedulerAutoRun.SETTING>", "<AutoRun Scheduler>", null);
    
    metadata.Min = 0;
    metadata.Max = 20;
    SettingsManager.getInstance().registerGuiSetting(metadata, 1);
    }

    Und dann entsprechend bei SchedulerForm.cs

    Code
    private void chkbox_isSchedulerRunning_CheckedChanged(object sender, EventArgs e)
    {
    // Read and Write of Settings
    SettingsManager.getInstance().setSetting(ESettingsType.APPLICATION, "SchedulerAutoRun.SETTING", 17);
    var test = SettingsManager.getInstance().getSetting<int>(ESettingsType.APPLICATION, "SchedulerAutoRun.SETTING");
    }

    Vielen Dank für deine Hilfe und natürlich auch für die Glückwünsche ^^

  • Da liegt bei mir momentan auch noch das Problem. Bei mir klappt das Hinzufügen der neuen Einstellung in einer verfügbaren Kategorien nicht.

    Hä? Wir der Wert nicht gespeichert oder was ist das Problem?


    Die Einstellung erscheint natürlich nicht bei den "DMXControl Einstellungen", aber das ist ja egal, du kannst die ja in deinem Form über die Checkbox entsprechend setzen. Daher die Frage, was du genau vor hast.

  • Im Hauptfenster vom Scheduler soll eine Checkbox vorhanden sein, mit welcher ich den Scheduler an-/ausschalten kann. Diese Information soll als Einstellung in DMXControl vorliegen, sodass der Scheduler beim Start von DMXControl automatisch läuft oder halt nicht (abh. vom Status der CheckBox). Momentan wollte ich erstmal probieren, ob ich überhaupt eine neue Einstellung "SchedulerAutoRun" in der Kategorie "General" hinzufügen und entsprechend beschreiben/auslesen kann.

    Das Programm stürzt in der initializePlugin() Methode nicht ab, allerdings finde ich auch nicht die Einstellung im Reiter Settings-General.

    Wenn ich dann über das chkbox_isSchedulerRunning_CheckedChanged-Event einen neuen Wert setzen möchte, passiert nichts.

  • Ich wiederhole mich. Du brauchst keine Anzeige im "Settings" Bereich um ein Setting zu Schreiben / Lesen, das ist optional. Wenn du es trotzdem probieren willst nimm "Settings:GUI" oder "Settings:General" anstelle von "<General>" wenn du die Metadaten anlegst. Aber wie gesagt, es ist meiner Ansicht nach unnötig, da du ja in deinem Plugin das Flag anbietest. Es würde eh keiner in den Settings diese Einstellung suchen.


    Dein Code in der chkbox_isSchedulerRunning_CheckedChanged sollte funktionieren. Aktuell schreibt er den Wert "17" und liest diesen auch wieder, oder geht das nicht?

  • Dein Code in der chkbox_isSchedulerRunning_CheckedChanged sollte funktionieren. Aktuell schreibt er den Wert "17" und liest diesen auch wieder, oder geht das nicht?

    Ich habe jetzt meinen "Fehler" gefunden. Ich kann das anscheinend nicht über den Debugger in VisualStudio testen, denn dieser meldet einen Crash in folgender Zeile:

    Code
    SettingsManager.getInstance().setSetting(ESettingsType.APPLICATION, "SchedulerAutoRun.SETTING", 17);

    Wenn ich eine MessageBox nutze und DMX-Control ohne VisualStudio starte, erscheint die magische 17! :)

  • Die Einstellung die ich gesetzt habe, kann ich nach einem Neustart von DMX-Control aufrufen (Siehe Quellcode button1_Click() ). Allerdings stürzt das Programm ab, wenn ich mir die Einstellung schon im Konstruktor der SchedulerForm (Hauptfenster) holen möchte (Quellcode SchedulerForm() ).

    Wieso ist das so? Bzw.: Wie soll ich damit am Besten umgehen? Die SchedulerForm() wird in der initializePlugin()-Methode aufgerufen. Wenn ich mir die Einstellung in einer dieser Methoden holen möchte, kann ich das PlugIn nicht mehr starten (wahrscheinlich weil die Initiailisierung nicht klappt)


    Ich möchte, dass die CheckBox direkt beim Start des PlugIns den vorher gesetzten Wert bekommt und auch entsprechend die anderen Klassenbibliotheken diese Einstellung aufrufen können, damit bspw. die gesetzten Termine die Lichtszenen auch ohne manuellen Aufruf des PlugIns starten.


    Code
    private void button1_Click(object sender, EventArgs e)
    {
    var test2 = SettingsManager.getInstance().getSetting<bool>(ESettingsType.APPLICATION, "SchedulerAutoRun.SETTING");
    MessageBox.Show(test2.ToString());
    }
  • Ich vermute, weil du die Einstellung von einem "int" in ein "bool" umgedeutet hast, und der alte Wert noch als "INT" gespeichert ist. Such mal in der ApplicationSettings.xml nach deinem Schlüssel "SchedulerAutoRun.SETTING" welcher Wert da gespeichert ist, und mach daraus ein "true" oder "false" damit es ein valider bool Wert ist.


    Alternativ kannst du gerne auch ein paar Stack Traces schicken. Den Grund für einen Absturz ohne StackTrace zu finden ist eine Fähigkeit die ich noch lernen muss :D

  • Hallo Soon,


    sorry für die späte Antwort, ich bin leider nicht eher dazu gekommen.

    Wo finde ich denn die ApplicationSettings.xml? Habe jetzt einfach mal DMX-Control deinstalliert und wieder neu installiert. Demnach müsste ja alles resettet sein und beim Anlegen der Einstellung diesmal ein bool Wert gesetzt werden. Trotzdem habe ich den gleichen Fehler. Ohne Debugging und Start über Visual Studio funktioniert es, anderenfalls nicht.

    Zudem wundert mich folgendes:

    Ich muss in dem Programm ja überprüfen, ob diese Einstellung überhaupt angelegt wurde. Dafür habe ich in einer if-loop nach der Neuinstallation mir einfach mal den

    Wert der theoretisch noch nicht existierenden Einstellung ausgeben lassen:

    Code
    var test2 = SettingsManager.getInstance().getSetting<bool>(ESettingsType.APPLICATION, "SchedulerAutoRun.SETTING");
    MessageBox.Show(test2.ToString());

    Hast du eine Idee, warum da "True" ausgegeben wird?

    Bzgl StackTrace:
    Habe einen Break-Point vor die Setting-Abrage gesetzt und die Aufrufliste kopiert. Meinst du das?

  • Also ich gebe es auf. Ohne selber den Code zu Debuggen finden wir das nicht. Habt ihr ein Git Repo wo der Code liegt damit ich da mal reinschauen kann? Oder kannst du den Quellcode wie er stand jetzt ist mal als ZIP anhängen?

  • Ah. Das es ohne VS Debugging geht, liegt vermutlich daran, dass du das Setting aktuell im Kernel speicherst und du Probleme mit dem Remoting hast. Verwende mal anstelle von "getSetting" und "setSetting" die "getGuiSetting" und "setGuiSetting". Da musst du auch kein "ESettingsType.APPLICATION" übergeben, weil das implizit UI Einstellungen sind.

  • Es Funktioniert!! Danke :D
    Also lag es daran, dass ich über Visual Studio beim Debuggen nur die LumosGUI.exe aufrufe und demnach nicht die Einstellungen aus dem Kernel abgerufen werden können. Wenn ich DMXControl ohne VisualStudio aufrufe, wird automatisch der Kernel gestartet und demnach hat es funktioniert.

    Da ich jetzt alles über GuiSettings mache, funktioniert es auch beim Debuggen.

  • Newly created posts will remain inaccessible for others until approved by a moderator.

    The last reply was more than 365 days ago, this thread is most likely obsolete. It is recommended to create a new thread instead.