Files
Client/src/main/java/de/fullrisk/citrusDev/UIHelper/ModuleRow.java
T
2026-07-11 20:30:17 +02:00

101 lines
3.8 KiB
Java

package de.fullrisk.citrusDev.UIHelper;
import io.wispforest.owo.ui.component.UIComponents;
import io.wispforest.owo.ui.container.FlowLayout;
import io.wispforest.owo.ui.container.UIContainers;
import io.wispforest.owo.ui.core.*;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FontDescription;
import net.minecraft.resources.Identifier;
import net.minecraft.sounds.SoundEvents;
public class ModuleRow {
public interface ToggleState {
boolean get();
void set(boolean value);
}
public static FlowLayout build(
Surface enabledSurface,
Surface disabledSurface,
Surface flatSurface,
Identifier icon,
int iconWidth,
int iconHeight,
Identifier titleFont,
String title,
String description,
ToggleState state,
Identifier settingsIcon,
Runnable onSettingsClick,
String enabledToastTitle,
String enabledToastMessage,
String disabledToastTitle,
String disabledToastMessage
) {
FlowLayout row = UIContainers.horizontalFlow(Sizing.content(), Sizing.content());
row.gap(8);
row.verticalAlignment(VerticalAlignment.TOP);
row.horizontalAlignment(HorizontalAlignment.CENTER);
row.padding(Insets.of(6));
row.horizontalSizing(Sizing.fixed(0));
row.verticalSizing(Sizing.fixed(0));
row.surface(state.get() ? enabledSurface : disabledSurface);
row.child(UIComponents.texture(icon, 0, 0, iconWidth, iconHeight, iconWidth, iconHeight))
.horizontalAlignment(HorizontalAlignment.LEFT)
.verticalAlignment(VerticalAlignment.CENTER);
FlowLayout textStack = UIContainers.verticalFlow(Sizing.content(), Sizing.content());
textStack.gap(2);
textStack.horizontalAlignment(HorizontalAlignment.LEFT);
textStack.verticalAlignment(VerticalAlignment.CENTER);
var titleLabel = UIComponents.label(
Component.literal(title)
.withStyle(style -> style.withFont(new FontDescription.Resource(titleFont)))
);
titleLabel.color(Color.ofRgb(state.get() ? 0xffffff : 0x797b86));
textStack.child(titleLabel);
textStack.child(UIComponents.label(Component.literal(description))
.color(Color.ofRgb(0xa3a3ac))
.maxWidth(130));
row.child(textStack);
row.child(UIComponents.spacer());
FlowLayout settingsButton = SettingsControls.makeSmallButton(flatSurface, settingsIcon, onSettingsClick);
row.child(settingsButton);
row.mouseEnter().subscribe(() -> row.surface(state.get() ? enabledSurface : disabledSurface));
row.mouseLeave().subscribe(() -> row.surface(state.get() ? enabledSurface : disabledSurface));
row.mouseDown().subscribe((click, doubled) -> {
boolean newState = !state.get();
state.set(newState);
titleLabel.color(Color.ofRgb(newState ? 0xffffff : 0x797b86));
row.surface(newState ? enabledSurface : disabledSurface);
if (newState) {
CitrusToast.show(enabledToastTitle, enabledToastMessage);
} else {
CitrusToast.show(disabledToastTitle, disabledToastMessage);
}
Minecraft.getInstance().getSoundManager().play(
SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 2.0F, 2)
);
return true;
});
row.horizontalSizing().animate(150, Easing.CUBIC, Sizing.fixed(200)).forwards();
row.verticalSizing().animate(150, Easing.CUBIC, Sizing.fixed(35)).forwards();
return row;
}
}