Skin Entwicklung

  • Ein Renderer ist kein Plugin.
    Also ein Plugin sagt dem Renderer gar nichts. Dafür gibt es Converter/Sources.


    Wohin was wie wo hingemalt wird musst Du schon selber im Render entscheiden.
    Du willst es doch dynamisch haben ;), also musst Du das selber entscheiden und dafür was im Renderer programmieren.

  • Ich glaube Du begreifst nicht, was ich geschrieben habe. Lese Dir das noch mal aufmerksam durch.


    Beispiel:
    Dein Renderer holt sich (beipielsweise über eine Source) einen oder mehrere Texte.
    Du kannst die Size des Renderers (das entscheidet der Skinner!) ermitteln im Code, und berechnest, ob der Text in diesen Renderer reinpasst. Wenn ja, berechne, ob auch der zweite Text mit reinpasst oder sowas...
    wenn nein, mache irgendwas, damit das so aussieht wie Du magst.
    wenn ja, mache irgendwas anderes...


    Also ein Renderer ist ja nur ein Objekt, welches Du im Skin dann definieren kannst. In diesem Objekt kannst Du andere Objekte dynamisch aufbauen, wenn Du sowas implementierst.
    Das "kleiner Malen" ist dann, dass Du in dem Renderer beispielsweise in ein eLabel malst (so habe ich damals den Running-Text Renderer umgeschrieben, der war ja in seiner ursprünglichen Form gar nicht zu gebrauchen).

  • Dein Renderer holt sich (beipielsweise über eine Source) einen oder mehrere Texte.

    ok, ich glaube, ich spuere so langsam, was du meinst...
    "mein" renderer holt sich short event description und long event description ueber die source (wie genau werden wir sehen) und wenn short event name == "" ist, dann malt er groesser und wenn nicht, dann kleiner. :smiling_face:

  • noch eine "letzte" frage:
    im moment wird nur die extended description uebergeben.


    Code
    <widget source="Service" render="RunningText"
    		position="1235,345" size="560,510" font="Regular;26"
    		foregroundColor="grey"
    		options="...">
    		<convert type="EventName">ExtendedDescription</convert>
    	</widget>


    wenn ich jetzt short description und extended description uebergeben will... schreibe ich dann einen neuen convertertyp:


    Code
    <convert type="EventName">ShortAndExtendedDescription</convert>

    in dem beide descriptions irgendwie separiert enthalten sind... oder gibt es da eine elegantere loesung?

    • Offizieller Beitrag

    Es sauber zu trennen ist doch so elegant wie's geht :).
    Zum Rest bist du fast schon auf dem richtigen Weg!
    Du kannst dir für diesen Fall auch on-top noch einen eigenen converter bauen, oder aber du lässt deinen renderer direkt auf der source arbeiten und den Converter weg.
    Was mehr sinn macht hängt davon hab ob du eventuell mehrere Kombinationen von "String-Paaren" ermöglichen willst.
    Wenn ja -> Converter bauen
    Wenn nein -> geht's ohne genau so gut und ist etwas übersichtlicher für den Anfang.


    Eine kleine Erläuterung wie das Source/Converter/Renderer "gedöhns" tickt:


    Wenn du z.B. eine Source -> Converter -> Renderer kombination hast, so zeigt self.source in deinem aktuellen "Element" (Die Basisklasse aller sourcen, converter und renderer) immer auf den "Vorgänger" in der Kette.


    - Im Converter zeigt es auf die direkte Source
    - Im Renderer zeigt es auf den letzten converter


    Streichst du nun den Converter hast du aus dem renderer direkten Zugriff auf deine tats. Source.


    Am Beispiel des skins von oben:
    Source -> "Service"
    Converter -> EventName:ExtendedDescription
    Renderer -> RunningText


    Wir fangen beim Renderer an:
    RunningText erwartet, wie z.B. auch Label, dass seine Source (in dem Fall der Converter EventName mit ExtendedDescription) eine "text" property liefert
    EventName tut genau das, in etwa so:

    Python
    def getText(self):
            blabla
        text = property(getText)


    EventName im Gegenzug erwartet dass seine Source eine event property liefert. Im skin ist natürlich nicht direkt erkennbar welche Source-Class genau genommen wurde, aber in Frage käme z.B. ServiceEvent, welche ungefähr wie folgt aussieht


    Python
    def getCurrentEvent(self):
            return self.service and self.info and self.info.getEvent(self.service)
    
    
        event = property(getCurrentEvent)

    Wichtig ist immer dass der Vorgänger liefert was der Nachfolger erwartet. Den rest übernimmt dann e2 ;).

    mfg ,
    Reichi

  • Dann nimm doch gleich den Converter, den ich weiter oben schon genannt habe :winking_face:


    Der macht genau das.


    Der von DMM kann auch beides zurückgeben, allerdings nur mit einem zusätzlichem Enter (Leerzeile) dazwischen.
    Das geht dort mit „FullDescription“

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    Einmal editiert, zuletzt von Sven H ()

  • Ja, genau den.
    Anstelle des EventName.


    Das ist ja „nur“ der Converter.
    Der Renderer runningtext bleibt ja.


    Ich schau Abend mal, wie mein widget dazu im Skin aussieht.


    Aber eigentlich musst du nur im widget die Converter-Zeile anpassen.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Hier nochmal mein Widget, wo ich shortdesc und extdesc in einem Feld als runningtext ausgeben lasse.
    Allerdings heißt meine source="Event" und als render hab ich extRunningText :winking_face:
    Wenn es eine shortdesc gibt, wird diese angezeigt und ab der nächsten Zeile dann die extdesc.
    Gibt es keine shortdesc, dann beginnt die extdesc sofort in der 1. Zeile und man hat das volle Feld zur Verfügung und hat keine "sinnlose" Leerzeile/Leerfeld.

    XML
    <widget source="Event" render="extRunningText" position="200,585" size="775,70" font="Regular;20" options="movetype=swimming,direction=top,startpoint=0,startdelay=3000,wrap=1,always=0,repeat=1,oneshot=1,steptime=100" backgroundColor="#24101214" transparent="1" >
    	<convert type="mvepgEventDesc">Full</convert>
    </widget>


    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • danke @Sven H
    habe mir den code mal angeschaut... der mvepg... converter haengt eigentlich nur short und extended description hintereinander... und der extrunningtext ist der weitverbreitete runningtext.
    das ist nicht das, was ich gesucht habe.
    aber ich denke, ich habe jetzt durch die geduldige hilfe alle information, um mir das, was ich mir vorstelle, selbst basteln zu koennen.
    dazu muss ich auf jeden fall den runningtext renderer aendern und im converter die descriptions so hintereinander haengen, dass ich sie im runningtext renderer wieder einfach splitten und die widget-hoehe abhaengig von der short description anpassen kann.

  • letztendlich wird dann das widget so aussehen (wenn ich alles richtig verstanden habe):



    Code
    <widget source="Service" render="RunningText"
    		position="1235,345" size="560,510" size2="560,550"
                    font="Regular;26" foregroundColor="grey"
    		options="...">
    		<convert type="EventName">ShortAndExtendedDescription</convert>
    	</widget>

    der renderer bekommt einen zusaetzlichen parameter fuer die zweite size, die dann verwendet wird, wenn eine shortdescription vorhanden ist, und der converter eventname bekommt einen zusaetzlichen parameter shortandextendeddescription, der dann einen text mit shortdescription + "|" + extendeddescription an den renderer weitergibt.

    2 Mal editiert, zuletzt von alpha ()

  • Und wozu ist dann <convert type="EventName">ShortAndExtendedDescription</convert> ?
    Oder hast du jetzt nur "ExtendedDescription" genommen ?


    Weil wenn du jetzt doch 2 getrennte Felder für shortDesc und extDest gemacht hast, brauchst du das "ShortAndExtendedDescription" ja nicht.
    Sonst hast du ja bei einem vorhandenen shortDesc diesen im extra Feld und dann nochmal am Begin von extDesc, oder ?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • das ShortAndExtendedDescription returned
    shortDesc + "|" + extDesc
    also beides.
    aber im runningtext renderer verwende ich die existenz von shortdescription nur zur entscheidung welche groesse die extendeddescription haben soll. der shortdescription text wird nicht verwendet.