TabBar
Barre d'onglets horizontale pour switcher entre plusieurs vues. L'onglet actif est mis en évidence (fond header + soulignement jaune).
package ca.tawess123.apocalyinterface.api.widget;
Builder
TabBar bar = TabBar.builder()
.tab(String labelKey, Runnable onSelect) // ajouter un onglet (requis, répétable)
.activeTab(int index) // onglet actif au départ (défaut : 0)
.visibleIf(boolean visible) // visibilité conditionnelle
.build();
Options du builder
| Option | Type | Défaut | Description |
|---|---|---|---|
.tab(String, Runnable) | String, Runnable | — | Ajoute un onglet. labelKey = clé i18n du libellé. onSelect = callback au clic. Au moins un requis. |
.activeTab(int) | int | 0 | Index de l'onglet actif à l'affichage initial. |
.visibleIf(boolean) | boolean | true | Masque la barre si false (0 px). |
Hauteur
20 px (ApocalyDimensions.BUTTON_HEIGHT).
Pattern recommandé — champ d'état + init()
TabBar ne maintient pas l'onglet actif en interne entre deux buildLayout. Il faut stocker l'index dans un champ et le repasser à .activeTab() :
import ca.tawess123.apocalyinterface.api.widget.TabBar;
private int activeTab = 0;
@Override
protected void buildLayout(Column root) {
root.add(TabBar.builder()
.tab("monmod.tab.membres", () -> { activeTab = 0; init(); })
.tab("monmod.tab.stats", () -> { activeTab = 1; init(); })
.tab("monmod.tab.historique",() -> { activeTab = 2; init(); })
.activeTab(activeTab) // ← repasse l'index courant
.build());
root.add(buildMembresPanel().visibleIf(activeTab == 0));
root.add(buildStatsPanel() .visibleIf(activeTab == 1));
root.add(buildHistorique() .visibleIf(activeTab == 2));
}
Utiliser
init() pour les ongletsinit() remet le scroll à zéro et reconstruit le layout — comportement attendu quand on change d'onglet. Si tu veux préserver le scroll, utilise update() à la place.
Exemple complet — profil joueur avec onglets
import ca.tawess123.apocalyinterface.api.layout.Card;
import ca.tawess123.apocalyinterface.api.layout.Column;
import ca.tawess123.apocalyinterface.api.screen.ApocalyScreen;
import ca.tawess123.apocalyinterface.api.widget.KeyValueRow;
import ca.tawess123.apocalyinterface.api.widget.TabBar;
import ca.tawess123.apocalyinterface.api.data.DataSource;
import net.minecraft.network.chat.Component;
public final class ProfilScreen extends ApocalyScreen {
private int activeTab = 0;
public ProfilScreen() {
super(Component.translatable("monmod.screen.profil"), 240);
}
@Override
protected void buildLayout(Column root) {
root.add(TabBar.builder()
.tab("monmod.tab.general", () -> { activeTab = 0; init(); })
.tab("monmod.tab.stats", () -> { activeTab = 1; init(); })
.tab("monmod.tab.historique",() -> { activeTab = 2; init(); })
.activeTab(activeTab)
.build());
root.add(buildGeneral() .visibleIf(activeTab == 0));
root.add(buildStats() .visibleIf(activeTab == 1));
root.add(buildHistorique().visibleIf(activeTab == 2));
}
private Widget buildGeneral() {
return Card.create()
.add(KeyValueRow.builder()
.key("monmod.row.clan")
.value(DataSource.of("Les Loups"))
.build())
.add(KeyValueRow.builder()
.key("monmod.row.rang")
.value(DataSource.of("#2"))
.build());
}
private Widget buildStats() { /* ... */ return Card.create(); }
private Widget buildHistorique() { /* ... */ return Card.create(); }
}
Voir aussi
- Guide : Visibilité conditionnelle —
visibleIfavec onglets - Référence Label