Zum Inhalt springen

Layout-Dateiformat

Ein exportiertes Turnier (eine .pchq-Datei) ist JSON, und die Timer-Layouts des Turniers stehen darin. Diese Seite beschreibt diesen Teil der Datei, damit du ein Layout in der Datei ändern und mit Datei importieren zurückholen kannst, selbst oder mit einem KI-Assistenten, den du um Hilfe gebeten hast.

Alles hier geht auch in der App, unter Layout & Inhalt. Dort steht, was jede Einstellung tut, und hier, wo sie gespeichert ist.

Die Layouts des Turniers stehen unter dem Schlüssel c auf der obersten Ebene der Datei. Lass alles außerhalb von c, wie es ist: Das ist das Turnier selbst, mit seinen Spielern, Levels und seinem Protokoll.

SchlüsselWas er enthält
lyDie Layouts im Menü Anpassen, in ihrer Reihenfolge
tcWas jedes Layout zeigt und wie es aussieht
vInhalte, die sich alle Layouts teilen (Alle Layouts)
tcnDie ID des Layouts auf dem Bildschirm
sppfalse, wenn Tischdiagramme Spielernamen statt Fotos zeigen

Ein Schlüssel, der fehlt, hat seinen Standardwert, und das gilt auch für c selbst: Ein Turnier, dessen Layouts nie geändert wurden, hat gar kein c.

Jedes Element von ly ist {"i": id, "t": title}. Die drei Layouts, mit denen ein Turnier beginnt, haben die IDs "" (Aktuelles Level, ohne i geschrieben), "seating" und "payouts". Ihre Titel stehen englisch in der Datei, Current level, Seating und Payouts, und die App übersetzt sie bei der Anzeige. Ein Layout, das du hinzufügst, braucht eine eigene ID. Die App nimmt eine ULID, 26 Ziffern und Großbuchstaben wie 01K8Z3Q4M5N6P7R8S9T0V1W2X3, und eine ID darf nie einen Punkt enthalten.

Fehlt ly, hat das Turnier die drei Layouts, mit denen es begonnen hat. Steht es da, ist es die ganze Liste: Ein Layout, das sie nicht nennt, steht nicht im Menü. Um ein Layout hinzuzufügen, führst du also auch die auf, die schon da sind.

Jedes Element von tc ist ein Eintrag für ein Layout, benannt durch sein n:

nDer Eintrag für
Die ID des Layouts, oder default für Aktuelles LevelDas Layout in jedem Level
<id>.blinds, <id>.break oder <id>.pregameEine Art von Level
<id>.<level uid>Ein einzelnes Level

Bei Aktuelles Level fallen in den Einträgen für eine Art von Level oder ein einzelnes Level die ID und der Punkt weg: blinds, break, pregame oder die uid des Levels. Solche Einträge hat ein Layout erst, wenn es sich von Level zu Level unterscheidet. Der Eintrag für jedes Level ist der, an dem du arbeitest.

Ein Eintrag hat diese Schlüssel, alle optional:

SchlüsselEnthältIn der App
cDie äußerste Zelle des LayoutsLayout & Inhalt
bcHintergrundfarbeHintergrundfarbe
biHintergrundbildHintergrundbild
fSchriftart: eine Google-Fonts-Familie, genau so geschrieben, wie Google Fonts sie führt, etwa OswaldSchriftart
fcTextfarbeSchriftfarbe
sc, sttrue oder false: die Chips oder die Tische neben dem Layout zeigenChips ein-/ausblenden, Tische ein-/ausblenden
vInhalte, die zu diesem Layout gehören (Dieses Layout). Nur im Eintrag für jedes LevelInhalt

Die Datei enthält nur, was von den Layouts der App abweicht. Ein Layout, mit dem das Turnier begonnen hat und das nie geändert wurde, steht gar nicht darin, und auch nichts, was ein Layout mit der Fassung der App gemeinsam hat.

Um an einem Layout in der Datei zu arbeiten, fängst du deshalb mit einer Kopie an. Dupliziere das Layout unter Layouts verwalten, oder hol eines aus der Layout-Galerie. Hinter einer Kopie steht keine eingebaute Fassung, also steht alles an ihr in der Datei.

Ein Layout ist ein Baum aus Zellen. Jede Zelle ist ein Objekt, dessen type "text" oder "flex" ist. Eine Textzelle zeigt einen Inhalt. Eine Flex-Zelle ist eine Zeile oder eine Spalte, die andere Zellen enthält.

Zahlen sind ganze Zahlen, außer die Tabelle nennt sie Dezimalzahlen. Größen sind Verhältnisse, keine Punkte, denn der Timer skaliert das ganze Layout passend zum Bildschirm: Die eingebauten Layouts nehmen Schriftgrößen von 7 für Kleingedrucktes bis 50 für die Uhr.

SchlüsselEnthält
vDen Namen des Inhalts, den die Zelle zeigt
fsSchriftgröße, 2 bis 100. Setz sie immer: Eine Zelle ohne sie wird in Größe 2 gezeichnet
fwSchriftgewicht, 0 bis 8: 0 ist dünn (100), 3 normal (400), 6 fett (700) und 8 schwarz (900). Ohne den Schlüssel ist das Gewicht 0
lhZeilenabstand, 1.0 bis 2.0, eine Dezimalzahl
fSchriftart, wenn sie von der des Layouts abweicht
rgbTextfarbe, wenn sie von der des Layouts abweicht
aAusrichtung, "start" (links) oder "end" (rechts). Ohne den Schlüssel steht der Text mittig
wrtrue, um den Text umzubrechen
SchlüsselEnthält
ft"row" (Zeile) oder "column" (Spalte)
cdDie Zellen darin, in ihrer Reihenfolge. Jede Flex-Zelle braucht ihn, auch eine leere: []
autrue für Auto, auf einem breiten Bildschirm eine Zeile und auf einem hohen eine Spalte. ft sagt dann, was sie auf einem breiten Bildschirm ist
cEine Bedingung: Die Zelle samt allem darin erscheint nur, solange sie wahr ist
aWie die Zellen darin quer zur Laufrichtung dieser Zelle ausgerichtet sind: "start" oder "end". Ohne den Schlüssel stehen sie mittig
sAbstand zwischen den Zellen darin, 0 bis 100
pdInnenabstand, 0 bis 100
mgAußenabstand, 0 bis 100
mnw, mnhMindestbreite und Mindesthöhe, 0 bis 2000. Innenabstand, Außenabstand und Rahmen nutzen dieselbe Skala, und eine Schriftgröße von 20 ist rund 80 dieser Einheiten hoch
bgHintergrundfarbe
bwRahmenbreite, 0 bis 20
bcRahmenfarbe
crEckenradius, 0 bis 100
angDrehung im Bogenmaß, eine Dezimalzahl: 0.26 dreht die Zelle um etwa 15° im Uhrzeigersinn, -0.26 andersherum
imgEin Bild, so wie die App es speichert
fitWie das Bild die Zelle füllt, "contain" oder "fill". Ohne den Schlüssel deckt das Bild die Zelle ab
sptrue zum Verteilen. Nur bei der äußersten Zelle
vw"chips", "tables" oder "qrCode" zeigt dieses Widget anstelle von Zellen. Gib ihr ein mnw oder mnh und ein leeres cd
vInhalte, die nur die Zellen darin sehen (Dieses Widget)

Ein Bild muss in der App hochgeladen werden, mit Bild → Bild hochladen, und dafür brauchst du ein Abo. Lass einen Wert von img oder bi genau so, wie du ihn vorfindest.

Eine Textzelle enthält ihren Text nicht selbst. Sie nennt einen Inhalt, und dessen Wert ist eine Vorlage, die Wörter mit laufenden Turnierdaten mischen kann.

In der Datei ist ein Inhalt ein Name mit drei Zeichenketten: seiner Bedingung, der Sprache seiner Wörter und seinem Wert. Eine leere Bedingung zeigt ihn immer. Als Sprache nimmst du den Code der Sprache, in der du die Wörter geschrieben hast, etwa de für Deutsch.

"club name": ["", "de", "Donnerstagspoker"],
"winner": ["playersActive.isNotEmpty", "de", "Glückwunsch, {{ playersActive.first.name }}!"]

Ein Wert ist eine JSON-Zeichenkette. Ein Anführungszeichen darin schreibst du also \", und das "\n", das jedes Element einer Liste in eine eigene Zeile setzt, schreibst du \"\\n\".

Inhalte liegen an einem von drei Orten in der Datei, denselben drei wie in der App, und eine Zelle nimmt einen Namen vom nächsten Ort, der ihn hat:

In der AppIn der Datei
Dieses Widgetv an einer Flex-Zelle, für die Zellen darin
Dieses Layoutv im Eintrag des Layouts für jedes Level
Alle Layoutsv in c

Die eingebauten Inhalte der App, etwa clock, blinds und tournament title, stehen nicht in der Datei: Eine Zelle nennt einen, und die App liefert ihn. Ein paar eingebaute Inhalte, die sich lohnen listet die nützlichsten auf. Ein Inhalt in der Datei mit dem Namen eines eingebauten tritt an dessen Stelle. Im v einer Zelle oder eines Layouts bedeutet null anstelle der drei Zeichenketten den eingebauten Inhalt selbst, egal was der Rest des Turniers unter diesem Namen festlegt.

Eine Farbe ist eine einzige ganze Zahl: ihr Hex-Code mit FF davor für volle Deckkraft, dezimal geschrieben. Eine Farbe als Text, etwa "#FFFFFF", wird nicht gelesen, und die Farbe bleibt bei ihrem Standardwert.

FarbeHexIn der Datei
Weiß#FFFFFF4294967295
Schwarz#0000004278190080
Orange#F568184294273048
Dunkelgrün#14532D4279522093

Um eine auszurechnen, setzt du FF vor die sechs Hex-Ziffern, also FFF56818, und rechnest das von hexadezimal in dezimal um.

Hier ist c für ein Turnier mit einem zusätzlichen Layout, Club night: oben der Titel des Turniers und der Name des Clubs, die Uhr und die Blinds, solange das Turnier läuft, und am Ende der Sieger in einem orangen Kasten. Es nutzt die eingebauten Inhalte tournament title, clock und blinds und bringt club name und winner selbst mit.

"c": {
"tcn": "01K8Z3Q4M5N6P7R8S9T0V1W2X3",
"ly": [
{ "t": "Current level" },
{ "i": "seating", "t": "Seating" },
{ "i": "payouts", "t": "Payouts" },
{ "i": "01K8Z3Q4M5N6P7R8S9T0V1W2X3", "t": "Club night" }
],
"tc": [
{
"n": "01K8Z3Q4M5N6P7R8S9T0V1W2X3",
"bc": 4279522093,
"fc": 4294967295,
"f": "Oswald",
"c": {
"type": "flex",
"ft": "column",
"s": 16,
"pd": 40,
"cd": [
{ "type": "text", "v": "tournament title", "fs": 24, "fw": 6 },
{ "type": "text", "v": "club name", "fs": 12, "fw": 3, "rgb": 4294273048 },
{
"type": "flex",
"ft": "column",
"c": "!isPostgame",
"s": 8,
"cd": [
{ "type": "text", "v": "clock", "fs": 60, "fw": 6 },
{ "type": "text", "v": "blinds", "fs": 24, "fw": 5 }
]
},
{
"type": "flex",
"ft": "column",
"c": "isPostgame",
"pd": 24,
"bw": 2,
"bc": 4294273048,
"cr": 16,
"cd": [
{ "type": "text", "v": "winner", "fs": 28, "fw": 7, "wr": true }
]
}
]
},
"v": {
"club name": ["", "de", "Donnerstagspoker"],
"winner": ["playersActive.isNotEmpty", "de", "Glückwunsch, {{ playersActive.first.name }}!"]
}
}
]
}

Hol die Datei als neues Turnier in die App: Auf iPhone und iPad tippst du die Datei an, damit sie sich in Poker Club HQ öffnet, und unter Android und im Web nutzt du + → Datei importieren auf dem Startbildschirm. Siehe Eine Datei öffnen, die dir jemand geschickt hat.

Schlägt der Import fehl, ist die Datei kein gültiges JSON, oder einer Flex-Zelle fehlt ihr cd. Steht in einer Zelle im Bearbeitungsmodus Fehlende Variable "…", nennt ihr v einen Inhalt, den es nicht gibt.

Manche Fehler halten den Import nicht auf. Sie lassen das Layout nur falsch aussehen:

  • Eine Zahl mit Dezimalpunkt, etwa 16.0, wo eine ganze Zahl hingehört, kann ignoriert werden.
  • Eine Farbe als Text wird ignoriert.
  • Eine Textzelle ohne fs ist winzig.
  • Ein Layout, das ly nicht aufführt, steht nicht im Menü.