Skinning-Tipps

  • Dachte ich poste ab und zu mal n paar Sachen, die auch für die etwas erfahreneren Skinner interessant sein könnten.
    nummer eins:
    man kann die infos vom artistslideshow script auch in der dialogalbuminfo.xml nutzen. klappt allerdings nur, wenn grad keine musik läuft, da immer nur eine instanz von dem script laufen kann.

    DialogAlbumInfo.xml:

    das hier am Anfang:

    [daten] <onload codition="!Player.HasAudio + System.HasAddon(script.artistslideshow) + Skin.HasSetting(usescriptalbumlist)">SetProperty(CURRENTARTIST,$INFO[ListItem.Artist])</onload>
    <onload codition="!Player.HasAudio + System.HasAddon(script.artistslideshow) + Skin.HasSetting(usescriptalbumlist)">SetProperty(ArtistSlideshow.ExternalCall,True)</onload>
    <onload codition="!Player.HasAudio + System.HasAddon(script.artistslideshow) + Skin.HasSetting(usescriptalbumlist)">XBMC.RunScript(script.artistslideshow,windowid=12001&amp;artistfield=CURRENTARTIST)</onload>
    <onunload codition="System.HasAddon(script.artistslideshow) + Skin.HasSetting(usescriptalbumlist)">clearProperty(ArtistSlideshow.ExternalCall)</onunload>[/daten]

    und dann zum darstellen der infos zum Beispiel:

    [daten] <label>$INFO[Window.Property(ArtistSlideshow.27.AlbumName)]</label>
    [/daten]
    analog gehn auch alle anderen properties von dem script.

    more to come.

  • kleiner zusatz:
    für discography kann man das hier nehmen:

    [daten]<label>$INFO[Window.Property(ArtistSlideshow.27.AlbumName)]</label>
    <onclick>ActivateWindow(videos,plugin://plugin.video.youtube/?path=/root/search&amp;feed=search&amp;search=$INFO[ListItem.Artist] $INFO[Window.Property(ArtistSlideshow.27.AlbumName)],return)</onclick>
    <onclick>Dialog.Close(all,true)</onclick>[/daten]

    und für similar artists:

    [daten]<label>$INFO[Window.Property(ArtistSlideshow.1.SimilarName)]</label>
    <onclick>ActivateWindow(videos,plugin://plugin.video.youtube/?path=/root/search&amp;feed=search&amp;search=$INFO[Window.Property(ArtistSlideshow.1.SimilarName)],return)</onclick>
    <onclick>Dialog.Close(all,true)</onclick>[/daten]

    dann kann man auch direkt bei youtube nach den alben / artists suchen.

    Einmal editiert, zuletzt von phil65 (29. Oktober 2012 um 16:42)

  • um die setting-areas etwas zu "entlasten", kann man mehr als einen boolean mit einem button kontrollieren.
    sieht bei 2 booleans so aus:

    [daten]<control type="button" id="1642">
    <include>Objects_MediaMenuButtonAlt2</include>
    <label>$LOCALIZE[31482]:</label>
    <label2>$VAR[SettingVar]</label2>
    <onclick condition="!Skin.HasSetting(a) + !Skin.HasSetting(b)">Skin.SetBool(b)</onclick>
    <onclick condition="Skin.HasSetting(b)">Skin.SetBool(a)</onclick>
    <onclick condition="Skin.HasSetting(b)">Skin.Reset(b)</onclick>
    <onclick condition="Skin.HasSetting(a)">Skin.Reset(a)</onclick>

    </control>

    <variable name="
    SettingVar
    ">
    <value condition="Skin.HasSetting(a)">$LOCALIZE[31282]</value>
    <value condition="Skin.HasSetting(b)">$LOCALIZE[31248]</value>
    <value>$LOCALIZE[106]</value>
    </variable>
    [/daten]

    btw vielleicht kann jemand diesen thread mal in die skinning-area verschieben. hab wohl das falsche subforum genommen.

  • Hier auch ein Tip von mir. Wer sich darüber wundern sollte, warum ein View trotz eines performanten Systems beim Scrollen ruckelt, sollte überprüfen, wie viele visible conditions im item- sowie focusedlayout vorhanden sind.

    PHP
    <itemlayout condition="Container.Content(movies)">
        [...]
    </itemlayout>
    <itemlayout condition="Container.Content(episodes)">
        [...]
    </itemlayout>

    ist schneller als

    PHP
    <itemlayout condition="Container.Content(movies) | Container.Content(episodes)">
        <control type="group">
            <visible>Container.Content(movies)</visible>
            [...]
        </control>
        <control type="group">
            <visible>Container.Content(episodes)</visible>
            [...]
        </control>
    </itemlayout>

    Bei größeren Layoutunterschieden sollte man also immer auf die erste Variante setzen. Wenn es nur darum geht, dass sich vielleicht 1-2 Labels unterscheiden, dann kann man das z.B. mit einer Variable lösen.

    Des Weiteren sollten substring Vergleiche so gut es geht vermieden werden, diese sind langsam... ich greife darauf nur zurück, wenn es nicht anders geht, z.B. bei Mediaflags.

    Externer Inhalt www.planet-ira.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Hier auch ein Tip von mir. Wer sich darüber wundern sollte, warum ein View trotz eines performanten Systems beim Scrollen ruckelt, sollte überprüfen, wie viele visible conditions im item- sowie focusedlayout vorhanden sind.

    PHP
    [...]
    
    
    
    
        [...]

    ist schneller als

    PHP
    Container.Content(movies)
            [...]
        
        
            Container.Content(episodes)
            [...]

    Bei größeren Layoutunterschieden sollte man also immer auf die erste Variante setzen. Wenn es nur darum geht, dass sich vielleicht 1-2 Labels unterscheiden, dann kann man das z.B. mit einer Variable lösen.

    Des Weiteren sollten substring Vergleiche so gut es geht vermieden werden, diese sind langsam... ich greife darauf nur zurück, wenn es nicht anders geht, z.B. bei Mediaflags.


    bist du dir sicher, dass das die performance merklich beeinflusst? ich hab vor ein paar wochen mal zum testen mehrere 100 substring conditions in einem window verbaut und konnte keinen unterschied feststellen.
    seitdem verwende ich an vielen stellen lieber string + stringcompare/substring anstatt booleans. ist für viele sachen einfach eleganter und deutlich weniger code.
    sachen wie fehlende "background=true" wirken sich deutlich deutlich stärker aus denk ich.

    Einmal editiert, zuletzt von phil65 (29. Oktober 2012 um 16:48)

  • Das mit dem Scrolling ist in der Tat so, kann jeder ausprobieren. Es muss sich nicht auswirken, kann aber. Kommt immer darauf an... ich hatte bei mir für einen View z.B. ein itemlayout mit mehreren Gruppen unterteilt nach Content (movies, tvshows, seasons, episodes) und mich immer über das ruckelige Scrolling gewundert. Habe es dann aufgeteilt wie beschrieben und siehe da, alles flüssig. Ist auch logisch, da die anderen Layouts komplett ignoriert werden.

    Das mit den stringcompares/substrings wirkt sich normalerweise auch nicht so aus, meinte damit auch hauptsächlich die Verwendung in list controls... z.B. würde ich


    jederzeit

    vorziehen. Beim Laden eines Windows einmalig einige substrings oder stringcompares auswerten macht nicht viel aus, in list views können sich sehr viele stringcompares/substrings, allgemeine viele Controls mit visible conditions, aber schon negativ auswirken.

    Externer Inhalt www.planet-ira.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • Das mit dem Scrolling ist in der Tat so, kann jeder ausprobieren. Es muss sich nicht auswirken, kann aber. Kommt immer darauf an... ich hatte bei mir für einen View z.B. ein itemlayout mit mehreren Gruppen unterteilt nach Content (movies, tvshows, seasons, episodes) und mich immer über das ruckelige Scrolling gewundert. Habe es dann aufgeteilt wie beschrieben und siehe da, alles flüssig. Ist auch logisch, da die anderen Layouts komplett ignoriert werden.

    Das mit den stringcompares/substrings wirkt sich normalerweise auch nicht so aus, meinte damit auch hauptsächlich die Verwendung in list controls... z.B. würde ich


    jederzeit

    vorziehen. Beim Laden eines Windows einmalig einige substrings oder stringcompares auswerten macht nicht viel aus, in list views können sich sehr viele stringcompares/substrings, allgemeine viele Controls mit visible conditions, aber schon negativ auswirken.

    ich habe die substring/stringcompares natürlich als visible conditions getestet, nicht als onloads oder include conditions. da sollte es dann ja eigentlich keinen unterschied machen, ob innerhalb eines containers oder nicht.
    wie gesagt, hab das mal getestet und konnte selbst bei 1000 substrings keinen merklichen unterschied feststellen. werd da vielleicht nochmal weiter nachforschen, aber viele sachen lassen sich mit stringcompares einfach so viel schöner umsetzen. nur booleans zu benutzen ist schon ziemlich limitierend. deutlich effektiver zur verbesserung der performance ist es, an den angezeigten pngs / jpgs zu schrauben. (weniger jpgs /pngs gleichzeitig anzeigen, border tags weglassen wenns geht, background=true setzen etc)
    mal ein beispiel für stringcompare-spielereien:
    info panels werden ja von vielen skins genutzt, oft mit den möglichkeiten "off", "on", "manual" und "auto".
    wenn man jetzt für die verschiedenen contentarten seperate settings haben möchte, kann das ja ganz schön ausufern, wenn man booleans nutzt.
    um das zu vereinfachen, hab ich folgendes gemacht:

    erstmal eine variable, die je nach content auf unterschiedliche strings verweist:

    [daten]<variable name="InfoPanelVar">
    <value condition="Container.Content(tvshows)">$INFO[Skin.String(InfoPanelTVShows)]</value>
    <value condition="Container.Content(movies)">$INFO[Skin.String(InfoPanelMovies)]</value>
    <value condition="Container.Content(seasons)">$INFO[Skin.String(InfoPanelSeasons)]</value>
    <value condition="Container.Content(episodes)">$INFO[Skin.String(InfoPanelEpisodes)]</value>
    <value condition="Container.Content(musicvideos)">$INFO[Skin.String(InfoPanelMusicVideos)]</value>
    <value condition="Container.Content(albums)">$INFO[Skin.String(InfoPanelAlbums)]</value>
    <value condition="Container.Content(artists)">$INFO[Skin.String(InfoPanelArtists)]</value>
    <value condition="Container.Content(addons)">$INFO[Skin.String(InfoPanelAddons)]</value>
    </variable>[/daten]


    dann braucht man eine (unsichtbare) label control, um die variable "InfoPanelVar" stringcomparen zu können:

    [daten]<control type="label" id="4421">
    <label>$VAR[InfoPanelVar]</label>
    <include>HiddenControl</include>
    </control>[/daten]
    und mit einem einzigen button kann man jetzt für alle contentarten seperate settings erzeugen

    [daten] <control type="button" id="1614">
    <include>Objects_MediaMenuButtonAlt2</include>
    <label>$LOCALIZE[31166]:</label>
    <label2>[COLOR $VAR[FontColorVar]]$VAR[InfoPanelToggleLabelVar]</label2>
    <onclick condition="Container.Content(episodes)">SetProperty(Area,Episodes)</onclick>
    <onclick condition="Container.Content(movies)">SetProperty(Area,Movies)</onclick>
    <onclick condition="Container.Content(TVShows)">SetProperty(Area,TVShows)</onclick>
    <onclick condition="Container.Content(seasons)">SetProperty(Area,Seasons)</onclick>
    <onclick condition="Container.Content(musicvideos)">SetProperty(Area,MusicVideos)</onclick>
    <onclick condition="Container.Content(albums)">SetProperty(Area,Albums)</onclick>
    <onclick condition="Container.Content(artists)">SetProperty(Area,Artists)</onclick>
    <onclick condition="Container.Content(addons)">SetProperty(Area,Addons)</onclick>
    <onclick condition="stringcompare(Control.GetLabel(4421),infopanelonauto) | IsEmpty(Control.GetLabel(4421))">Skin.SetString(InfoPanel$INFO[Window.Property(Area)],infopanelon)</onclick>
    <onclick condition="stringcompare(Control.GetLabel(4421),infopanelonmanual)">Skin.SetString(InfoPanel$INFO[Window.Property(Area)],infopanelonauto)</onclick>
    <onclick condition="stringcompare(Control.GetLabel(4421),infopaneloff)">Skin.SetString(InfoPanel$INFO[Window.Property(Area)],infopanelonmanual)</onclick>
    <onclick condition="stringcompare(Control.GetLabel(4421),infopanelon)">Skin.SetString(InfoPanel$INFO[Window.Property(Area)],infopaneloff)</onclick>
    <onclick condition="stringcompare(Control.GetLabel(4421),infopanelonauto)">Skin.SetString(InfoPanel$INFO[Window.Property(Area)],infopanelon)</onclick>
    </control>[/daten]

    mit nem einfachen substring(control.getlabel(4421),infopanelon)) / stringcompare (control.getlabel(4421),infopanelonauto) oder wasauchimmer kann man jetzt ganz einfach die visibility des infopanels sowie der dazugehörigen controls kontrollieren.
    macht nicht bei jedem anwendungsfall sinn, kann aber teilweise komplexe vis conditions deutlich vereinfachen und auch die codemenge deutlich reduzieren.

  • @phil65

    Deine gezeigte Methode ist in etwa ja genau das, was ich auch für meinen Fake-Spin-Control verwende. In dem Fall ist es völlig egal, ob man 1 oder 20000 Vergleiche einbaut, da es dort auch nicht unbedingt auf die maximale Performance ankommt. In einem list control kann das aber wie gesagt Unterschiede beim schnellen Scrollen machen. Es ging an sich nur darum, dass ein substring eine der langsamsten Operationen ist, z.B. ist

    IsEmpty(Window.Property(property))

    schneller als

    substring(Window.Property(property),test)

    Das beides nicht das gleiche macht, ist erst mal klar, allerdings gibt es durchaus Situationen, in denen man sicherlich etwas Feinschliff betreiben kann. Ob das viel ausmacht, sei dahin gestellt, je langsamer das System, je stärker kann es deutlich werden. Natürlich sind viele verschiedene, dazu noch sehr große Texturen oder das Fehlen von background="true" schlimmer, das sollte klar sein. :)

    Ich habe das eben auch noch mal bei mir getestet, in der Frodo Alpha kann ich bei meinem View auch keine Unterschiede mehr feststellen, mein System ist allerdings auch nicht gerade langsam. Kann aber auch an diversen Optimierungen von XBMC liegen, so dass die Unterschiede mittlerweile kaum noch ins Gewicht fallen.

    Externer Inhalt www.planet-ira.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

  • ja, das durchtogglen durch strings ist an deine fake spincontrol angelehnt, allerdings mit variablem target (--> Skin.SetString(InfoPanel$INFO[Window.Property(Area)],infopanelon) ). erspart seperate buttons für jede contentart.
    ging aber hauptsächlich auch darum, zu zeigen, wie man mit nem workaround variablen stringcomparen kann. sollte man natürlich nicht mit übertreiben, sonst verliert man den überblick über die ids der fake labels, kann aber für einige komplexe settings ziemlich nützlich sein.
    hinsichtlich performance: es geht mir ja nicht um die stringcompares in den onclicks, die sind natürlich sch***egal, mit der vorgestellten variante braucht man allerdings auch stringcompares als vis conditions für das infopanel.

    ich hab stringcompare / substring unter eden getestet, auch da kein fühlbarer performanceverlust. ich denke, dass das abändern einer einzigen textur, so dass sie von texturepacker zu dxt1/5 anstatt zu argb konvertiert wird, deutlich mehr bringt als etliche stringcompares zu IsEmptys "umzuwandeln". strings zu vergleichen sollte selbst für low-powered maschinen ein klacks sein.

  • Hallo zusammen,

    Ich denke das kann man auch als Skining-Tipp ansehen - zumindest ist es eine nützliche Information für Skinner.

    Wenn Cover/Icons/Thumbnails dargestellt werden sollen, sollte (zumindest ab Frodo) immer ListItem.Icon statt ListItem.Thumb verwendet werden.
    Der Grund ist, dass wenn die Abfrage nach Icon fehlschlägt (Property leer oder ein Request ergibt kein Bild) automatisch auf Thumb ausgewichen wird. Andersrum ist das nicht der Fall.

    Es hat also keine negativen Auswirkungen Icon zu benutzen - im Gegenteil: Es ermöglicht uns Add-on Entwicklern Favorisierte Bilder als Thumb und Fallback-Bilder als Icon zu deklarieren.

    Hier der entsprechende Thread im xbmc.org Forum, jmarshall hatte auf ein Feature Request von mir geantwortet.

    Grüße,
    sphere

  • Hier noch ein weiterer Tip von mir, den vielleicht nicht alle kennen. In einer Liste werden Labels seit längerem automatisch abgeschnitten, damit diese sich nicht überlagern. Das ist beispielsweise nützlich, wenn man ein Label linksbündig und eins rechtsbündig hat.

    Ein kurzes Beispiel:

    Damit klarer wird wie sich das auswirkt, hier eine kurze Illustration in Photoshop:

    Externer Inhalt f.cl.ly
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    Im ersten Fall sind beide Strings gleich ("Lorem ipsum dolor sit amet, consetetur"). Im zweiten Fall besteht der rechte String nur aus "Lorem" und der linke wird passend abgeschnitten. Man kann das Abschneiden auch gewichten, indem man das zweite Label z.B. nur halb so lang macht wie das erste. Dann wird bei gleicher String-Länge im Verhältnis 2/1 abgeschnitten.

    Externer Inhalt www.planet-ira.de
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
  • ...des weiteren ne kleine hilfe, um untranslated strings zu finden.
    notepad++ --> search dialog --> in dateien suchen ---> "reguläre ausdrücke" option aktivieren
    und dann suchen nach
    [daten]<label>[^0-9$][/daten]
    sollte euch ne einigermaßen kompakte liste mit unübersetzten strings geben. könnte noch verfeinert werden, aber sicherlich auch so schon deutlich besser als manuell rumzusuchen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!