Aller au contenu principal

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

OptionTypeDéfautDescription
.tab(String, Runnable)String, RunnableAjoute un onglet. labelKey = clé i18n du libellé. onSelect = callback au clic. Au moins un requis.
.activeTab(int)int0Index de l'onglet actif à l'affichage initial.
.visibleIf(boolean)booleantrueMasque 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 onglets

init() 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