Skinning-Tipps

  • Das Tool stürzt bei mir leider ab. "Der Pfad hat ein ungültiges Format".
    Mein XBMC ist bei mir unter S:/XBMC/...

    [expander]

    [/expander]

  • zwei sachen...

    nummer 1 ist allerdings nur für frodo:

    in DialogContextMenu (container 996):

    [daten]<control type="button" id="2011">
    <height>58</height>
    <width>462</width>
    <textcolor>context</textcolor>
    <focusedcolor>white2</focusedcolor>
    <texturenofocus>dialogs/context_nofocus.png</texturenofocus>
    <texturefocus>dialogs/context_highlight.png</texturefocus>
    <colordiffuse>$VAR[SpotColorVar2]</colordiffuse>
    <align>center</align>
    <font>Font_Reg19</font>
    <textoffsety>12</textoffsety>
    <label>Set as startup music</label>
    <visible>Container.Content(albums) | Container.Content(songs) | Substring(ListItem.FolderPath,.xsp,right) | Substring(ListItem.FolderPath,.m3u,right)</visible>
    <onclick condition="Container.Content(albums)">Skin.SetString(Startup_Playlist_Path,RunScript(script.playalbum,albumid=$INFO[ListItem.DBID]))</onclick>
    <onclick condition="Container.Content(songs)">Skin.SetString(Startup_Playlist_Path,RunScript(script.playalbum,songid=$INFO[ListItem.DBID]))</onclick>
    <onclick condition="Substring(ListItem.FolderPath,.xsp,right) | Substring(ListItem.FolderPath,.m3u,right)">Skin.SetString(Startup_Playlist_Path,$INFO[ListItem.FolderPath])</onclick>
    <onclick>Skin.SetBool(Use_Startup_Playlist)</onclick>
    </control>[/daten]

    in den skin settings:

    [daten]<control type="radiobutton" id="107">
    <label>Use startup playlist</label>
    <include>Default_SettingRadioButton</include>
    <onclick>Skin.ToggleSetting(Use_Startup_Playlist)</onclick>
    <selected>Skin.HasSetting(Use_Startup_Playlist)</selected>
    </control>
    <control type="button" id="108">
    <label>- Playlist Path:</label>
    <label2>$INFO[Skin.String(Startup_Playlist_Path)]</label2>
    <include>Default_SettingRadioButton</include>
    <onclick>Skin.SetFile(Startup_Playlist_Path,.m3u|.xsp,t:\playlists\music\)</onclick>
    <enable>Skin.HasSetting(Use_Startup_Playlist)</enable>
    </control>[/daten]

    und in der startup.xml dann für nen button, der gefocust wird:

    [daten]
    <onfocus condition="Skin.HasSetting(Use_Startup_Playlist) + !IsEmpty(Skin.String(Startup_Playlist_Path)) + !SubString(Skin.String(Startup_Playlist_Path),RunScript,left)">PlayMedia($ESCINFO[Skin.String(Startup_Playlist_Path)])</onfocus>
    <onfocus condition="Skin.HasSetting(Use_Startup_Playlist) + !IsEmpty(Skin.String(Startup_Playlist_Path)) + SubString(Skin.String(Startup_Playlist_Path),RunScript,left)">$INFO[Skin.String(Startup_Playlist_Path)]</onfocus>

    [/daten]
    damit habt ihr die möglichkeit, als startup-musik entweder über die skin settings eine playlist auszuwählen oder über einen rechtsklick auf ein album / einen song aus der library auszuwählen.
    code könnte noch etwas aufgeräumt werden, aber es geht ja ums prinzip^^

    nummer 2)
    wer den menüpunkt, der am anfang ausgewählt sein soll, relativ einfach auswählbar haben möchte, kann es folgendermaßen machen:
    einen button in die settings:

    [daten]<control type="button" id="314">
    <label>Startmenüpunkt wählen</label>
    <label2>[COLOR $VAR[FontColorVar]]$INFO[Skin.String(CustomFocusOffset)]</label2>
    <include>Objects_CommonSettingsButton</include>
    <onclick>Notification(Achtung,Bitte exakten Titel des gewünschten Hauptmenüpunktes eingeben)</onclick>
    <onclick>Skin.SetString(CustomFocusOffset)</onclick>
    </control>[/daten]

    und das hier dann in die home.xml, anzahl der zeilen ist abhängig von anzahl der maximalen menüpunkte (hauptmenü container ist id 9000)

    [daten]<onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(1).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,1)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(2).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,2)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(3).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,3)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(4).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,4)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(5).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,5)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(6).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,6)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(7).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,7)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(8).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,8)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(9).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,9)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(10).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,10)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(11).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,11)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(12).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,12)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(13).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,13)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(14).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,14)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(15).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,15)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(16).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,16)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(17).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,17)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(18).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,18)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(19).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,19)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(20).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,20)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(21).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,21)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(22).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,22)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(23).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,23)</onfocus>
    <onfocus condition="Window.Previous(startup) + !IsEmpty(Skin.String(CustomFocusOffset)) + Stringcompare(Container(9000).ListItem(24).Label,Skin.String(CustomFocusOffset))">Control.Move(9000,24)</onfocus>[/daten]

    die onfocus sachen laufen wahrscheinlich auch mit onloads. dann braucht man keine pseudo-buttons.

  • ...und noch ne 3. sache, für die ich allerdings noch keine verwendung habe^^

    auch fürs context menü
    [daten]<control type="button" id="2010">
    <height>58</height>
    <width>462</width>
    <textcolor>context</textcolor>
    <focusedcolor>white2</focusedcolor>
    <texturenofocus>dialogs/context_nofocus.png</texturenofocus>
    <texturefocus>dialogs/context_highlight.png</texturefocus>
    <colordiffuse>$VAR[SpotColorVar2]</colordiffuse>
    <align>center</align>
    <font>Font_Reg19</font>
    <textoffsety>12</textoffsety>
    <label>Add To Album List</label>
    <visible>Container.Content(albums) | Container.Content(songs)</visible>

    <onclick>Skin.SetString(AlbumList8Title,$INFO[Skin.String(AlbumList7Title)])</onclick>
    <onclick>Skin.SetString(AlbumList8Artist,$INFO[Skin.String(AlbumList7Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList8DBID,$INFO[Skin.String(AlbumList7DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList7Title,$INFO[Skin.String(AlbumList16itle)])</onclick>
    <onclick>Skin.SetString(AlbumList7Artist,$INFO[Skin.String(AlbumList6Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList7DBID,$INFO[Skin.String(AlbumList6DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList6Title,$INFO[Skin.String(AlbumList5Title)])</onclick>
    <onclick>Skin.SetString(AlbumList6Artist,$INFO[Skin.String(AlbumList5Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList6DBID,$INFO[Skin.String(AlbumList5DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList5Title,$INFO[Skin.String(AlbumList4Title)])</onclick>
    <onclick>Skin.SetString(AlbumList5Artist,$INFO[Skin.String(AlbumList4Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList5DBID,$INFO[Skin.String(AlbumList4DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList4Title,$INFO[Skin.String(AlbumList3Title)])</onclick>
    <onclick>Skin.SetString(AlbumList4Artist,$INFO[Skin.String(AlbumList3Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList4DBID,$INFO[Skin.String(AlbumList3DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList3Title,$INFO[Skin.String(AlbumList2Title)])</onclick>
    <onclick>Skin.SetString(AlbumList3Artist,$INFO[Skin.String(AlbumList2Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList3DBID,$INFO[Skin.String(AlbumList2DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList2Title,$INFO[Skin.String(AlbumList1Title)])</onclick>
    <onclick>Skin.SetString(AlbumList2Artist,$INFO[Skin.String(AlbumList1Artist)])</onclick>
    <onclick>Skin.SetString(AlbumList2DBID,$INFO[Skin.String(AlbumList1DBID)])</onclick>

    <onclick>Skin.SetString(AlbumList1Title,$INFO[ListItem.Album])</onclick>
    <onclick>Skin.SetString(AlbumList1Artist,$INFO[ListItem.Artist])</onclick>
    <onclick>Skin.SetString(AlbumList1DBID,$INFO[ListItem.DBID])</onclick>
    <onclick>Skin.SetString(AlbumList1Thumb,$INFO[ListItem.Thumb])</onclick><!-- auch möglich -->
    </control>[/daten]

    damit kann man recht einfach ne liste erstellen, dessen einträge "durchgeschoben" werden.
    die gespeicherten inhalte könnte man z.B. in nem hauptmenü-widget zeigen, welches auf recht einfache weise über das contextmenü verwaltet werden kann. die ältesten einträge gehen verloren, wenn die liste "voll" ist.
    das gleiche geht auch analog für movies. (dort braucht man natürlich path anstatt DBID zum abspielen)

    hab auch schonmal propiert, mit dem gleichen prinzip ne "message-history" einzuführen und die KAI-Toast-Meldungen zu speichern. Mit Control.GetLabel() kommt man allerdings an die nachrichten nicht ran :/

    Einmal editiert, zuletzt von phil65 (29. November 2012 um 21:36)

  • so, jetzt was besonders schönes^^
    sozusagen der heilige gral... austauschbare menu items, und zwar ohne include-wahnsinn und ohne extra vis conditions.
    wirklich feiner code, also aufgepasst:

    ihr erstellt erstmal in den settings irgendwo eienn neuen container (hier im bsp id 9000).
    in den <content> tag kommt dann ein paar inludes, die auf folgende items verweisen:


    anzahl der einträge könnt ihr natürlich variieren, spielt keine rolle. ihr braucht sonst nirgendwo den code anzupassen, klappt alles vollautomatisch durch setzen von properties.^^
    dafür muss in den onload dieses fensters eine property gesetzt werden. Diese bestimmt, welche Properties beim klick auf die hauptmenüeinträge gesetzt werden.

    PHP
    <onload>SetProperty(MenuName,MenuItem,home)</onload>


    durch einen klick auf einen hauptmenüeintrag wird eine Property gesetzt und der Fokus auf Button 9006 gerichtet, der sieht folgendermaßen aus und ist natürlich im gleichen window plaziert:


  • Es werden also ein paar Strings gesetzt und dann ein Dialog geöffnet.
    Ab sofort müssen wir nur noch mit den ItemToEdit.xxx strings arbeiten, man muss die ganze Arbeit also nicht für jeden Menüpunkt wiederholen. Ist schonmal ein Riesenvorteil und kann für alles mögliche gut sein, nicht nur zum tauschen von hauptmenüeinträgen.
    Im Onload dieses Dialogs wird nun die Property überschrieben und die Zielproperties umgesetzt.
    Ausserdem befindet sich wieder ein Container in diesem Dialog mit exakt den gleichen Includes wie für die vorherige liste auch. nur der button 9006 in diesem Dialog unterscheidet sich und sieht folgendermaßen aus:


    Beim schließen werden nun onunloads aktiviert, und zwar folgendermaßen. hierbei werden die labels letztendlich ausgetauscht.


    tadaaaa. komplette hauptmenüpunkte inklusive widgets, untermenüs etc getauscht.
    wenn man das geschafft hat, kann man am ende zum krönenden abschluss sogar die gleichen hauptmenüincludes ganz elegant im hauptmenü nutzen. dort braucht man dann lediglich einen anderen button 9006:

    PHP
    <control type="button" id="9006">
                <include>HiddenObject</include>
               <onfocus condition="stringcompare(Container(9000).ListItem.Property(Type),0) | stringcompare(Container(9000).ListItem.Property(Type),1) | stringcompare(Container(9000).ListItem.Property(Type),2) | stringcompare(Container(9000).ListItem.Property(Type),3)">RunAddon($INFO[Container(9000).ListItem.Property(Path)])</onfocus>
                <onfocus condition="stringcompare(Container(9000).ListItem.Property(Type),4)">ActivateWindow(Videos,$INFO[Container(9000).ListItem.Property(Path)],return)</onfocus>
                <onfocus condition="stringcompare(Container(9000).ListItem.Property(Type),5)">ActivateWindow(MusicLibrary,$INFO[Container(9000).ListItem.Property(Path)],return)</onfocus>
                <onfocus condition="Stringcompare(Container(9000).ListItem.Property(Type),custom)">$INFO[Container(9000).ListItem.Property(Path)]</onfocus>
            </control>

    ich hoffe mal ich hab keine fehler eingebaut. viel spaß damit :P

    Einmal editiert, zuletzt von phil65 (6. Dezember 2012 um 04:19)

  • Ein Button für das Context Menu, um Addons direkt aus dem addonbrowser zu starten (dasselbe kann man auch in die dialogaddoninfo packen):

    [daten]<control type="button" id="2010">
    <height>58</height>
    <width>462</width>
    <textcolor>context</textcolor>
    <focusedcolor>white2</focusedcolor>
    <texturenofocus>dialogs/context_nofocus.png</texturenofocus>
    <texturefocus>dialogs/context_highlight.png</texturefocus>
    <colordiffuse>$VAR[SpotColorVar2]</colordiffuse>
    <align>center</align>
    <font>Font_Reg19</font>
    <textoffsety>12</textoffsety>
    <label>518</label>
    <visible>Window.IsActive(addonbrowser) + [Substring(ListItem.Property(Addon.ID),script.,left) | Substring(ListItem.Property(Addon.ID),plugin.,left)]</visible>
    <onclick condition="Substring(ListItem.Property(Addon.ID),script.,left)">Runscript($INFO[ListItem.Property(Addon.ID)])</onclick>
    <onclick condition="Substring(ListItem.Property(Addon.ID),plugin.,left)">RunAddon($INFO[ListItem.Property(Addon.ID)])</onclick>
    </control>[/daten]

  • bin grad dabei, n addon zu erstellen, um den ganzen kram wie genre fanart / zusätzliche themes / conditional weather fanart automatisch runterzuladen.
    hab mal n bisschen im inet rumgesucht und ne recht umfangreiche kollektion an extra artwork zusammengestellt. dazu gehören music / tv / film genre icons und fanarts, conditional weather fanart sowie einige hintergrundsets.
    vielleicht kann jemand da ja was von gebrauchen, hier ein link, um das zeug manuell runterzuladen.
    http://aeon-nox-background-packs.googlecode.com/svn/trunk/

  • Ja klar, dann könnte ich meine Backgrounds und co. raus-werfen und Nur wenn Jemand die haben mag kann er sich die optional nachinstallieren. Speckt Mein Joggler-Skin dann schon ziemlich ab. Wollte es schon länger so ... kann es aber nicht :(

    MQ3 oder MQ4 hat ja auch so was ähnliches bin aber da nicht durchgestiegen.

  • am einfachsten wäre es, wenn du dann deine pfade so wie nox anlegst.
    /backgrounds
    extras/genre/video/fanart
    extras/genre/audio/fanart

    extras/genre/music/icons
    extras/genre/music/icons

  • am einfachsten wäre es, wenn du dann deine pfade so wie nox anlegst.
    /backgrounds
    extras/genre/video/fanart
    extras/genre/audio/fanart

    extras/genre/music/icons
    extras/genre/music/icons


    Ja, ist o.K.


  • Ja, ist o.K.


    ok, dann brauchst du noch n repository, auf dem alle dateien rumliegen. google code bietet 4 gig, das sollte genug sein.
    Die Dateistruktur muss folgendermaßen sein:

    trunk


    Music ist für musik genres,
    genreart ist für video genres.
    in den ordnern liegen dann zip dateien rum, die extrahiert werden.
    kannst ja mal mein repository clonen und bei dir dann neu aufsetzen.

    http://code.google.com/p/aeon-nox-bac…source/checkout

  • :thumbup: Danke ... bei Fragen melde Ich Mich wieder

    [edit]EDIT:

    mhhhh .... script will nicht, hab dann xbmc mit Nox gestartet, wieder nix.

    LOG File[/edit]

  • :thumbup: Danke ... bei Fragen melde Ich Mich wieder

    [edit]EDIT:

    mhhhh .... script will nicht, hab dann xbmc mit Nox gestartet, wieder nix.

    LOG File[/edit]

    ich hab ja auch noch kein script veröffentlicht, mit dem das geht^^
    will noch erst den nox release abwarten. danach release ich das tool und passe es an deinen skin an.
    schon n repository erstellt?

Jetzt mitmachen!

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