-- Gelöscht, da Anmerkung wegen zwischenzeitlich geändertem Threadtitel hinfällig ist. --
Aktueller Stand:
Movies : 558 (davon 169 Konzertfilme)
TV Shows : 0
Musik : 937 Alben, ca. 10k Tracks
Retrogamer : 0
-- Gelöscht, da Anmerkung wegen zwischenzeitlich geändertem Threadtitel hinfällig ist. --
Aktueller Stand:
Movies : 558 (davon 169 Konzertfilme)
TV Shows : 0
Musik : 937 Alben, ca. 10k Tracks
Retrogamer : 0
Da beide Teile (X400 und Display) mit 12V DC laufen (können), bietet sich hier wie von @BJ1 schon empfohlen ein Schaltnetzteil mit 12V und mind. 100W Leistung an. Damit könntest du alles befeuern. Das mit den GPIO-Pins vergiss am besten gleich wieder. Pro Pin sollten nicht mehr als 20mA gezogen werden, alle Pins zusammen können max. 250mA liefern. Alles darüber grillt den Pi!
Und auch das hat @BJ1 richtigerweise schon geschrieben, aber man kann es nicht oft genug erwähnen: 230V AC sind potenziell lebensgefährlich! Wenn man damit hantiert, sollte man sich auf jeden Fall auskennen! Also im Zweifel suche dir einen Fachmann!
Zu dem Thema habe ich mir auch schon einen Wolf gesucht. Das <align> funktioniert halt nur in Verbindung mit Labels, also mit Text, nicht aber mit Image- oder sonstigen Controls. Die einzige funktionierende Lösung die ich gefunden habe ist die, mit Animationen zu arbeiten. Das folgende Beispiel ordnet in meinem Skin den Inhalt eines Panel-Containers mittig auf dem Screen an, abhängig von der Anzahl der enthaltenen Objekte:
<animation effect="slide" start="0,0" end="-35,0" time="0" condition="String.IsEqual(Container(9003).NumItems,12)">conditional</animation>
<animation effect="slide" start="0,0" end="20,0" time="0" condition="String.IsEqual(Container(9003).NumItems,11)">conditional</animation>
<animation effect="slide" start="0,0" end="75,0" time="0" condition="String.IsEqual(Container(9003).NumItems,10)">conditional</animation>
<animation effect="slide" start="0,0" end="130,0" time="0" condition="String.IsEqual(Container(9003).NumItems,9)">conditional</animation>
<animation effect="slide" start="0,0" end="185,0" time="0" condition="String.IsEqual(Container(9003).NumItems,8)">conditional</animation>
<animation effect="slide" start="0,0" end="240,0" time="0" condition="String.IsEqual(Container(9003).NumItems,7)">conditional</animation>
<animation effect="slide" start="0,0" end="295,0" time="0" condition="String.IsEqual(Container(9003).NumItems,6)">conditional</animation>
<animation effect="slide" start="0,0" end="350,0" time="0" condition="String.IsEqual(Container(9003).NumItems,5)">conditional</animation>
<animation effect="slide" start="0,0" end="405,0" time="0" condition="String.IsEqual(Container(9003).NumItems,4)">conditional</animation>
<animation effect="slide" start="0,0" end="460,0" time="0" condition="String.IsEqual(Container(9003).NumItems,3)">conditional</animation>
<animation effect="slide" start="0,0" end="515,0" time="0" condition="String.IsEqual(Container(9003).NumItems,2)">conditional</animation>
<animation effect="slide" start="0,0" end="570,0" time="0" condition="String.IsEqual(Container(9003).NumItems,1)">conditional</animation>
Alles anzeigen
Es sind hier also maximal 12 Controls im Container möglich, für jede Anzahl gibt es einen definierten Endpunkt. Wichtig dabei: es werden nicht die Controls im Panel sondern der Panel-Container selber positioniert. Das Ganze lässt sich gemäß Schema auch auf beliebigen "Füllgrad" erweitern. Das macht Arbeit, aber es funktioniert!
Ist die Windows-Version wichtig oder geht es nur um die Plattform? Falls letzteres, dann gäbe es auch noch das Infolabel System.Platform.Windows, das dann eben nur ein True oder False liefert.
String.IsEqual() ist das neue StringCompare().
Das wurde eigentlich schon mit Krypton geändert, nur übergangsweise wurde das alte Infobool in Kodi 17 noch weiter unterstützt.
Hier gibt es die entsprechenden Infos dazu und zu weiteren "neuen" Infobools.
Ok, danke euch für die Erklärungen. Mal sehen, ob ich das in meinem Skin dann auch mal nutzbringend verwenden kann.
ja sicher, nur sind focused layout und itemlayout der sselbe content.
Deswegen das param.
Ja, und genau das verwirrt mich eben. In itemlayout und focusedlayout wird eigentlich nur das Styling für den Inhalt des Container definiert. Der eigentliche Content kommt dann normalerweise zwischen die <content> … </content> Tags. Es heißt ja nicht umsonst itemlayout und focusedlayout.
@Marc0810
Da geht es mir wie dir. So ganz bin ich noch nicht hinter die Sinnhaftigkeit der params gestiegen. Die wirken auf mich irgendwie umständlich und machen den Code für mich nur schwerer lesbar. Aber ich bin auch nur ein Gestalter und kein Programmierer. Mein Verständnis für solche Sachen ist entsprechend begrenzt.
Ich muss gestehen, dass ich mich mit params noch nicht so befasst habe. Aber gelten die nicht global? Kann denn ein param dann gleichzeitig "true" (für das focused Item in der Liste) und "false" (für die unfocused Items) sein?
Wäre es nicht besser, das Image-Control nur in das focusedlayout reinzustecken?
Nur ein spontaner Gedanke ohne es selber getestet zu haben …
Dieses $VAR[OtherBG] ist eine Variable. Variablen erlauben es kurz gesagt, Grafiken, Texte, Farben etc. mit relativ wenig Code und basierend auf festgelegten Conditions auswechselbar zu machen. Schaut mal in die Variables.xml. Da müsstest du mal suchen nach
<variable name="OtherBG">
<value condition="hierstehtirgendeinecondition">Bild1.png</value>
<value condition="hierstehteinezweitecondition">Bild2.png</value>
...
<value>EinFallbackImage.png</value>
</variable>
So ähnlich sollte das aussehen. Das Wichtigste wäre nun, herauszufinden, welche Condition hier erfüllt sein muss, damit das Bild angezeigt wird. Das kann irgendein Setting sein, das in deinem Skin eben nicht existiert, weil die dazugehörige Einstellung nicht vorhanden ist. Das ist halt das Problem, wenn man zwei Skins so wie du es versuchst, fusionieren möchte. Da hängt bei einer eigentlich ganz einfachen Sache noch oft ein ganzer Rattenschwanz dahinter, den zu erfassen sich zu einer Riesenaufgabe auswachsen kann.
Du könntest in diesem speziellen Fall aber auch das $VAR[OtherBG] einfach durch den Dateinamen ersetzen. Dann ist das halt fix festgelegt.
Das sind globale Skinfarben, die der Skin sich aus der /colors/defaults.xml holt. Du müsstest also noch die entsprechenden Einträge vom einen Skin in den anderen übertragen.
Edit: Knapp zu spät …
hehe, der Tiroler ist der jack. der screenshot hat dich verraten.
btw: wann gibts deine skin? ich muss mein addon damit testen?
Na das hat ja jetzt aber auch gedauert!
Zwecks Skin: Schau mal in deine Konversationen!
@Marc0810
Da gebe ich dir wieder mal recht. Die unterschiedlichen Eingabemöglichkeiten machen's nicht weniger kompliziert. Mein Skin ist primär auf Touchbedienung ausgelegt. Nichtsdestotrotz habe ich schon drauf geachtet, das Ganze auch per Tastatur bedienbar zu machen. Das gibt bisweilen schon graue Haare, wenn man eine möglichst logisch nachvollziehbare Navigation durch diverse Schalter und Buttons, Listen und sonstigen Containern (innerhalb und außerhalb) basteln muss. Da gibt es schon mal knifflige Situationen, wo's echt nicht einfach ist. Aber hey – "Per aspera ad astra" sagte schon der olle Lateiner!
Schon verstanden. Nur geht es hier doch nicht primär darum, wie man das coded (einen Button muss man nicht wirklich erklären, oder?). Hier geht es um Useability. Wie konzipiere ich ein Bedienelement, das für den User möglichst intuitiv und einfach bedienbar ist? Es geht also nicht darum, was ich coden kann sondern was soll am Ende da stehen? Will ich einen einzelnen Button, der für den unbedarften User höchstwahrscheinlich sogar erklärungsbedürftig ist ("Klicke hier bitte so oft, bis dir das Ergebnis gefällt") oder einen selbsterklärenden "Balken", der nicht ganz zufälligerweise an einen Slider erinnern kann (wie ja ursprünglich im Startpost angedacht)?
So sieht das in meinem Skin aus:
Muss ich mich jetzt verteidigen? 20 Buttons in einer Reihe, die einen Balken bilden (mit oder ohne Skala ist eine Frage der grafischen Gestaltung), kann man sich vorstellen, oder? Dass jeder Button eine onclick Aktion hat, die einen entsprechenden SkinString-Wert setzt – entsprechend dem repräsentierten %-Wert – kann man sich auch vorstellen, nicht? Das ist keine hohe Skinning-Kunst, die man erst vorführen müsste. Der Punkt ist doch nur der, dass ich (bei Bedienung per Maus oder Touchscreen) direkt den Bereich anklicke, den ich auch auswählen möchte und nicht erst soundsoviele Schritte durchgehen muss, um zum Ergebnis zu kommen. Die Aus- bzw. Verwertung erfolgt dann wie in der von Marc0810 oben vorgeschlagenen Methode. Dazu muss ich doch jetzt nicht wirklich vorkauen, wie man in Kodi einen Button coded, oder?
Sehe ich jetzt nicht so. Gerade mit Maus oder Touchscreen musst du doch nur auf den gewünschten Button gehen und nicht erst mühsam dahin navigieren. Die 20 Buttons können ja optisch wie ein einziger langer Balken gestaltet werden, wenn es sein muss auch mit einer Skala. Oder verstehe ich da jetzt etwas komplett falsch?
Zumal man bei der Ein-Button-Lösung noch einen zweiten dazumachen müsste, um auch mal rückwärts gehen zu können. Ansonsten ist's von 75% auf 70% ein gar sehr langer Weg …
Ohne jetzt quer reden zu wollen: Aus Skinner-Sicht mag dieses Konstrukt ja ganz gut funktionieren. Aus User-Sicht finde ich das aber höchst unpraktisch. Muss ich z.B. wirklich 15 mal auf einen Button klicken, um einen Wert von 75% einzustellen? Wäre es da nicht besser, 20 Buttons aufzureihen und jeden eine definierte onclick-Aktion ausführen zu lassen? Da muss der User dann nur einmal klicken. Das ganze dann mit einem entsprechend langen Balken unterlegen oder eine Marke an die betreffende Stelle positionieren zur Visualisierung des aktuellen Wertes und gut ist. Das ist dann zwar kein Slider, aber wenigstens nahe dran und für den User verständlich.
In meinem Skin mache ich das so und es hat sich zumindest noch keiner darüber beschwert.
Ich spinne jetzt mal ein bisschen rum (hab' gerade kein Kodi vor mir um es auszuprobieren) – könnte man das nicht vielleicht mit einem Fixedlist-Container und einem zugehörigen Scrollbar (pagecontrol) faken? In den Container entsprechend viele Buttons füllen. Im Fixedlist-Container ist ja die Focusposition fixiert, während die Items durchscrollen. So müsste es reichen, die Items jeweils mit einer onfocus-action zu versehen, um beim Betätigen des Scrollbars einen Wert zu setzen.
<item>
<onfocus>Skin.Setstring(background_colordiffuse,1A)</onfocus>
</item>
<item>
<onfocus>Skin.Setstring(background_colordiffuse,1F)</onfocus>
</item>
<item>
<onfocus>Skin.Setstring(background_colordiffuse,24)</onfocus>
</item>
<item>
<onfocus>Skin.Setstring(background_colordiffuse,29)</onfocus>
</item>
…
Alles anzeigen
Die Buttons würde ich dann jeweils so breit machen wie der Container ist. Den Container selber außerhalb des sichtbaren Bereichs positionieren und den Scrollbar nach Belieben stylen. Was denkt ihr, könnte das funktionieren?
Kannst ja mal das hier ausprobieren. Ist zwar speziell für das CarPC-Projekt geschrieben worden (das mit einem gepatchten Kodi läuft), aber vielleicht funktioniert es auch mit dem ganz normalen Kodi.
Ok, ich muss zurückrudern. Hab ganz außer Acht gelassen, dass Kodi in der DialogAddonSettings.xml ja eine vorgegebene Struktur erwartet. Es ist also nicht möglich, da einfach aus einer Grouplist ein Panel oder List-Container zu machen. Mea culpa!
Die von Marco810 oben erwähnte Methode sollte funktionieren. Alternativ lässt sich, wenn die Maus ein Scrollrad hat (rechts-/links-Scroll), in der Kategorieleiste auch scrollen. Das geht aber, zumindest wenn ich das in meinem Skin mache, recht hakelig. Es wäre aber einen Versuch wert.