Configliste innerhalb eines Plugins "on the fly" ändern

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Configliste innerhalb eines Plugins "on the fly" ändern

      Hi Spezialisten,
      in "meinem" Plugin Yamp will ich je nach gewählter Einstellung bestimmte Einträge in der Config-Liste aus- und bei Bedarf wieder einblenden.
      Auf meiner Dreambox funktioniert das sowohl unternewnigma2 als auch unter OATV problemlos. Ich selbst hab keine VU, aber @ekremtt testet da sehr viel für mich.
      Das Problem:
      Das Ein- und Ausblenden an sich funktioniert auch unter VTi, allerdings "verliert" VTi beim Wiedereinblenden (was tatsächlich ja ein neues Hinzufügen zur Liste ist) offensichtlich die korrekte Zuordnung zu den Einstellungen, das heisst, der Wert der neu hinzugefügten Einstellung wird nicht gespeichert, sondern auf den urspünglichen Default-Wert zurückgesetzt.

      Ich hoffe, ich habe mich verständlich ausgedrückt. Gibt es einen "Trick", damit das auch unter VTI funktioniert?

      So wird eine der Einstellungen initiiert:
      Spoiler anzeigen
      config.plugins.yampmusicplayer.lcdCoverSize = ConfigInteger(90,limits = (10, 2000))
      self.confCoverSize = getConfigListEntry(_("Cover size"), config.plugins.yampmusicplayer.lcdCoverSize)
      self.list.append(self.confCoverSize)


      So wird sie "ausgeblendet" (gelöscht)
      Spoiler anzeigen
      self.list.remove(self.confCoverSize)
      self["config"].l.invalidate()


      Und so wieder eingeblendet (hinzugefügt)
      Spoiler anzeigen

      config.plugins.yampmusicplayer.lcdCoverSize = ConfigInteger(coverSizeSetting,limits = (limitCoverSizeMin, limitCoverSizeMax))
      self.confCoverSize = getConfigListEntry(_("Cover size"), config.plugins.yampmusicplayer.lcdCoverSize)
      config.plugins.yampmusicplayer.lcdCoverSize.value = coverSizeSetting
      self["config"].l.invalidate()


      Wie gesagt, Aus-/Einblenden funktioniert auch unter VTi problemlos. Allerdings ist unter VTi dann der eingestellte Wert weg (obwohl ich ihn zur Sicherheit nochmal als coverSizeSetting gespeichert hatte (da steht er beim Aufruf auch noch drin, habe ich kontrolliert). Stattdessen steht dann der ursprüngliche Default-Wert (90, erster Spoiler) drin und wird auch so gespeichert.

      Ach ja: Und Gegencheck natürlich auch gemacht: Wenn ich Aus-/Einblenden lahmlege, wird der geänderte Wert richtig übernommen.

      Irgendwelche Ideen? Danke!
      Alfred
    • Danke dir! Kannst du mir noch einen Tip geben, wo ich nach diesem "Autoshutdown" suchen kann, damit ich sehe, was du dort anders machst als ich? Wie gesagt, bei mir (bzw. bei @ekremtt) funzt es eben nicht, obwohl es auf den Dreamboxen geht (egal, welches OS).
      Klar ist es wahrscheinlich der berühmte Fehler 50 (50 cm vor dem Bildschirm), ist aber eben schwierig, dem auf die Schliche zu kommen, wenn man selbst das System nicht hat. Kleine Änderung, verschicken an Tester, auf Rückmeldung warten, beinahe endlose Schleife....

      Und trotzdem noch die Nachfrage: Wird bei dir auch ein Wert richtig übernommen, wenn diese Konfig-Zeile erst ausgeblendet, dann wieder eingeblendet und dann erst geändert wird? Denn genau in der Reihenfolge tritt das Problem auf - es wird dann zwar der richtige (geänderte) Wert angezeigt, aber offensichtlich nicht übernommen. Beim erneuten Aufrufen der Config ist dann der Default-Wert der ursprünglichen Initialisierung drin.

      Danke!
      Alfred

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von AlfredENeumann ()

    • Schon wieder danke! Aber: nochmal: ich hab keine VU, mit Ausprobieren ist also nix. Wo kann ich das Ding denn runterladen und anschauen?
      Danke!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AlfredENeumann ()

    • Hi @stub
      danke auch dir. Nachdem ich jetzt aber gesucht hab: Ich sehe zwar einige Config-Einträge, die nur unter bestimmten Voraussetzungen aufgenommen werden. Aber : Vielleicht bin ich blind, ich sehe aber keinen, der "on the fly" aus- und wieder eingeblendet wird.
      Kannst du mir noch einen Tip geben, welche(r) Eintrag (oder Einträge) das ist/sind, die auch abhängig von anderen Einstellungen aus- bzw. wieder eingeblendet werden, während du im Config-Screen bist?
      Danke!
      Alfred

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AlfredENeumann ()

    • ok, kannst du vergessen. @ekremtt hat das für mich angeschaut; offensichtlich ist "Ausschalten für vorgegebenes Zeitintervall aktivieren" so ein Eintrag, der dann 2 weitere ein- bzw. ausblendet. Damit weiss ich, wonach ich suchen muss. :thumbup:
    • Vor dem Entfernen würde ich den Wert durch
      self["config"].list[ .... ].save()
      erstmal sichern.
      Dann sollte er eigentlich beim nächsten Einfügen wieder da sein.

      Wenn er nicht gespeichert werden soll, muss er in einer Variable gesichert werden. und dann beim erneuten Einfügen wiederhersgestellt werden value=...

      EDIT: Das könntest du außerdem auch mal ohne "invalidate()" testen.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Oberhesse ()

    • danke auch dir.
      • PUNKT 1 Ja, das mit dem save() hätte ich noch probieren können; schien mir aber nicht wichtig, weil ja auch die anderen Einstellungen zumindest intern alle auch ohne save() erhalten bleiben und es auf meinen anderen Boxen auch so funktioniert.
      • Punkt 2 (vorher speichern und wieder eintragen) hab ich auch gemacht (sh. Spoiler 3); der Wert steht auch im ....value() (über print kontrolliert), wird aber eben beim erneuten Aufruf des Screens wieder mit dem Init-Wert überschrieben.
      • Punkt 3 macht keinen Sinn, denn erst durch das invalidate() wird das aus-/einblenden sichtbar.


      Ich hab aber woanders (PM) noch einen Tip bekommen: Möglicherweise kommt die interne enigma-config-Verwaltung durcheinander, wenn ich nach Initialisierung noch einmal einen "= ConfigInteger.." aufrufe. Das scheint mir schlüssig. Stattdessen also nur die komplette Liste neu aufbauen. Das wird mein nächster Versuch sein.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AlfredENeumann ()

    • Bei einem meiner Plugins funktioniert es ohne invalidate(), wobei die Veränderung aus refresh heraus aufgerufen wird.
      Dazu modifitiere ich erst self.list (durch list.remove oder list.insert) und weise dann die veränderte Liste der eigentlichen Konfigurationsliste zu
      self["config"].setList(self.list)
      Ob das das Problem der verlorenen Werte löst, weiss ich allerdings nicht.
    • Vielleicht besser wie bei Autoshutdown lösen. Ist simpel und sollte in allen Images funktionieren.


      ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.changedEntry)
      ...
      if config.autoshutdown.autostart.value == True:
      self.list.append(getConfigListEntry(_("Time in standby for power off (min):"), config.autoshutdown.time))
      ...
      def changedEntry(self):
      self.createConfigList()
      cur = self["config"].getCurrent()
      self["config"].setList(self.list)
      if cur and cur is not None:
      self["config"].updateConfigListView(cur)
      Carpe diem!

      Skin: CerX FHD | Plugins: TMDb, BacksNcovers, FritzDect, AutoShredder, PluginMover | EPG: GraphMultiEPG | ... [Alle anzeigen]

      Vu+ Wiki
    • Hi zusammen,
      nochmal danke an alle Helfer. Ein erster Versuch sieht schonmal vielversprechend aus. :) Dauert halt alles etwas: Umprogrammieren, unvermeidliche neu eingebaute Fehler korrigieren, an den VU-Tester schicken, warten, bis der Zeit zum Testen und zur Rückmeldung hat...

      Ich habe mich weitgehend an die Vorlage vom autoshutdown gehalten - macht den Code tatsächlich einfacher als mein kopliziertes Konstrukt. :thumbup:
      2 Fragen bleiben allerdings, speziell an @schomi
      • from Components.config import ConfigDescription
        wird in newnigma nicht gefunden - ist das spezieller VTi-Code? Ich hatte das nur versuchsweise übernommen, weil auch die folgende Funktion nicht gefunden wird:
      • self["config"].updateConfigListView() : 'ConfigList' object has no attribute 'updateConfigListView'
        Was macht diese Funktion, und ist die (auch) speziell VTi? Wie gesagt, scheint auch ohne die zu funktionieren, interessiert mich halt
      Danke und Grüsse
      Alfred
      P.S.: Trotzdem bitte noch nicht als gelöst markieren; Dauertest steht noch aus, und es könnten ja auch noch Nachfragen kommen ;) Danke!
    • ConfigDescription,
      ermöglicht eine optische Trennung, z.B. "------", in einer Liste von Config-Einträgen. Ist zumindest im VTi drin.

      updateConfigListView,
      keine Ahnung, habe ich noch nie genutzt.
      Carpe diem!

      Skin: CerX FHD | Plugins: TMDb, BacksNcovers, FritzDect, AutoShredder, PluginMover | EPG: GraphMultiEPG | ... [Alle anzeigen]

      Vu+ Wiki
    • Hi @schomi,
      danke dir schon wieder für deine Erklärungen - passt dann halt doch nicht 1:1 für alle images. Ist aber auch egal: Auch ohne die beiden VTi-spezifischen Dinge funktionierts sowohl bei mir auf den Dreams (alt und neu) als auch auf der VU mit VTi, und darum gings ja. :thumbsup: Und, wie gesagt, der Code ist dazu auch noch einfacher geworden - da hatte ich zu kompliziert gedacht.
      Grüsse
      Alfred