added meteor rounded theme

This commit is contained in:
Cloudburst
2021-06-07 19:19:33 +02:00
parent 4a64ce606a
commit 8a39d00f55
26 changed files with 1300 additions and 1 deletions

View File

@@ -1,6 +1,8 @@
package cloudburst.rejects;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import minegame159.meteorclient.MeteorAddon;
import minegame159.meteorclient.gui.GuiThemes;
import minegame159.meteorclient.systems.commands.Commands;
import minegame159.meteorclient.systems.modules.Category;
import minegame159.meteorclient.systems.modules.Modules;
@@ -64,6 +66,8 @@ public class MeteorRejectsAddon extends MeteorAddon {
hud.elements.add(new AppleHud(hud));
hud.elements.add(new CrystalHud(hud));
hud.elements.add(new ExpHud(hud));
GuiThemes.add(new MeteorRoundedGuiTheme());
}
@Override

View File

@@ -0,0 +1,344 @@
package cloudburst.rejects.gui.themes.rounded;
import minegame159.meteorclient.gui.DefaultSettingsWidgetFactory;
import minegame159.meteorclient.gui.GuiTheme;
import minegame159.meteorclient.gui.WidgetScreen;
import minegame159.meteorclient.gui.renderer.packer.GuiTexture;
import cloudburst.rejects.gui.themes.rounded.widgets.*;
import cloudburst.rejects.gui.themes.rounded.widgets.input.WMeteorDropdown;
import cloudburst.rejects.gui.themes.rounded.widgets.input.WMeteorSlider;
import cloudburst.rejects.gui.themes.rounded.widgets.input.WMeteorTextBox;
import cloudburst.rejects.gui.themes.rounded.widgets.pressable.*;
import minegame159.meteorclient.gui.utils.AlignmentX;
import minegame159.meteorclient.gui.utils.CharFilter;
import minegame159.meteorclient.gui.widgets.*;
import minegame159.meteorclient.gui.widgets.containers.WSection;
import minegame159.meteorclient.gui.widgets.containers.WView;
import minegame159.meteorclient.gui.widgets.containers.WWindow;
import minegame159.meteorclient.gui.widgets.input.WDropdown;
import minegame159.meteorclient.gui.widgets.input.WSlider;
import minegame159.meteorclient.gui.widgets.input.WTextBox;
import minegame159.meteorclient.gui.widgets.pressable.*;
import minegame159.meteorclient.rendering.text.TextRenderer;
import minegame159.meteorclient.settings.*;
import minegame159.meteorclient.systems.accounts.Account;
import minegame159.meteorclient.systems.modules.Module;
import minegame159.meteorclient.utils.render.color.Color;
import minegame159.meteorclient.utils.render.color.SettingColor;
import static minegame159.meteorclient.utils.Utils.mc;
public class MeteorRoundedGuiTheme extends GuiTheme {
private final SettingGroup sgGeneral = settings.getDefaultGroup();
private final SettingGroup sgColors = settings.createGroup("Colors");
private final SettingGroup sgTextColors = settings.createGroup("Text");
private final SettingGroup sgBackgroundColors = settings.createGroup("Background");
private final SettingGroup sgOutline = settings.createGroup("Outline");
private final SettingGroup sgSeparator = settings.createGroup("Separator");
private final SettingGroup sgScrollbar = settings.createGroup("Scrollbar");
private final SettingGroup sgSlider = settings.createGroup("Slider");
// General
public final Setting<Double> scale = sgGeneral.add(new DoubleSetting.Builder()
.name("scale")
.description("Scale of the GUI.")
.defaultValue(1)
.min(0.75)
.sliderMin(0.75)
.sliderMax(4)
.onSliderRelease()
.onChanged(aDouble -> {
if (mc.currentScreen instanceof WidgetScreen) ((WidgetScreen) mc.currentScreen).invalidate();
})
.build()
);
public final Setting<AlignmentX> moduleAlignment = sgGeneral.add(new EnumSetting.Builder<AlignmentX>()
.name("module-alignment")
.description("How module titles are aligned.")
.defaultValue(AlignmentX.Center)
.build()
);
public final Setting<Boolean> categoryIcons = sgGeneral.add(new BoolSetting.Builder()
.name("category-icons")
.description("Adds item icons to module categories.")
.defaultValue(false)
.build()
);
public final Setting<Boolean> blur = sgGeneral.add(new BoolSetting.Builder()
.name("blur")
.description("Apply blur behind the GUI.")
.defaultValue(false)
.build()
);
public final Setting<Boolean> hideHUD = sgGeneral.add(new BoolSetting.Builder()
.name("hide-HUD")
.description("Hide HUD when in GUI.")
.defaultValue(false)
.onChanged(v -> {
if (mc.currentScreen instanceof WidgetScreen) mc.options.hudHidden = v;
})
.build()
);
public final Setting<Integer> round = sgGeneral.add(new IntSetting.Builder()
.name("round")
.description("How much windows should be rounded")
.defaultValue(0)
.min(0)
.max(20)
.sliderMin(0)
.sliderMax(15)
.build()
);
// Colors
public final Setting<SettingColor> accentColor = color("accent", "Main color of the GUI.", new SettingColor(135, 0, 255));
public final Setting<SettingColor> checkboxColor = color("checkbox", "Color of checkbox.", new SettingColor(135, 0, 255));
public final Setting<SettingColor> plusColor = color("plus", "Color of plus button.", new SettingColor(255, 255, 255));
public final Setting<SettingColor> minusColor = color("minus", "Color of minus button.", new SettingColor(255, 255, 255));
// Text
public final Setting<SettingColor> textColor = color(sgTextColors, "text", "Color of text.", new SettingColor(255, 255, 255));
public final Setting<SettingColor> textSecondaryColor = color(sgTextColors, "text-secondary-text", "Color of secondary text.", new SettingColor(150, 150, 150));
public final Setting<SettingColor> titleTextColor = color(sgTextColors, "title-text", "Color of title text.", new SettingColor(255, 255, 255));
public final Setting<SettingColor> loggedInColor = color(sgTextColors, "logged-in-text", "Color of logged in account name.", new SettingColor(45, 225, 45));
// Background
public final ThreeStateColorSetting backgroundColor = new ThreeStateColorSetting(
sgBackgroundColors,
"background",
new SettingColor(20, 20, 20, 200),
new SettingColor(30, 30, 30, 200),
new SettingColor(40, 40, 40, 200)
);
public final Setting<SettingColor> moduleBackground = color(sgBackgroundColors, "module-background", "Color of module background when active.", new SettingColor(50, 50, 50));
// Outline
public final ThreeStateColorSetting outlineColor = new ThreeStateColorSetting(
sgOutline,
"outline",
new SettingColor(0, 0, 0),
new SettingColor(10, 10, 10),
new SettingColor(20, 20, 20)
);
// Separator
public final Setting<SettingColor> separatorText = color(sgSeparator, "separator-text", "Color of separator text", new SettingColor(255, 255, 255));
public final Setting<SettingColor> separatorCenter = color(sgSeparator, "separator-center", "Center color of separators.", new SettingColor(255, 255, 255));
public final Setting<SettingColor> separatorEdges = color(sgSeparator, "separator-edges", "Color of separator edges.", new SettingColor(225, 225, 225, 150));
// Scrollbar
public final ThreeStateColorSetting scrollbarColor = new ThreeStateColorSetting(
sgScrollbar,
"Scrollbar",
new SettingColor(30, 30, 30, 200),
new SettingColor(40, 40, 40, 200),
new SettingColor(50, 50, 50, 200)
);
// Slider
public final ThreeStateColorSetting sliderHandle = new ThreeStateColorSetting(
sgSlider,
"slider-handle",
new SettingColor(0, 255, 180),
new SettingColor(0, 240, 165),
new SettingColor(0, 225, 150)
);
public final Setting<SettingColor> sliderLeft = color(sgSlider, "slider-left", "Color of slider left part.", new SettingColor(0, 150, 80));
public final Setting<SettingColor> sliderRight = color(sgSlider, "slider-right", "Color of slider right part.", new SettingColor(50, 50, 50));
public MeteorRoundedGuiTheme() {
super("Meteor Rounded");
settingsFactory = new DefaultSettingsWidgetFactory(this);
}
private Setting<SettingColor> color(SettingGroup group, String name, String description, SettingColor color) {
return group.add(new ColorSetting.Builder()
.name(name + "-color")
.description(description)
.defaultValue(color)
.build());
}
private Setting<SettingColor> color(String name, String description, SettingColor color) {
return color(sgColors, name, description, color);
}
// Widgets
@Override
public WWindow window(String title) {
return w(new WMeteorWindow(title));
}
@Override
public WLabel label(String text, boolean title, double maxWidth) {
if (maxWidth == 0) return w(new WMeteorLabel(text, title));
return w(new WMeteorMultiLabel(text, title, maxWidth));
}
@Override
public WHorizontalSeparator horizontalSeparator(String text) {
return w(new WMeteorHorizontalSeparator(text));
}
@Override
public WVerticalSeparator verticalSeparator() {
return w(new WMeteorVerticalSeparator());
}
@Override
protected WButton button(String text, GuiTexture texture) {
return w(new WMeteorButton(text, texture));
}
@Override
public WMinus minus() {
return w(new WMeteorMinus());
}
@Override
public WPlus plus() {
return w(new WMeteorPlus());
}
@Override
public WCheckbox checkbox(boolean checked) {
return w(new WMeteorCheckbox(checked));
}
@Override
public WSlider slider(double value, double min, double max) {
return w(new WMeteorSlider(value, min, max));
}
@Override
public WTextBox textBox(String text, CharFilter filter) {
return w(new WMeteorTextBox(text, filter));
}
@Override
public <T> WDropdown<T> dropdown(T[] values, T value) {
return w(new WMeteorDropdown<>(values, value));
}
@Override
public WTriangle triangle() {
return w(new WMeteorTriangle());
}
@Override
public WTooltip tooltip(String text) {
return w(new WMeteorTooltip(text));
}
@Override
public WView view() {
return w(new WMeteorView());
}
@Override
public WSection section(String title, boolean expanded, WWidget headerWidget) {
return w(new WMeteorSection(title, expanded, headerWidget));
}
@Override
public WAccount account(WidgetScreen screen, Account<?> account) {
return w(new WMeteorAccount(screen, account));
}
@Override
public WWidget module(Module module) {
return w(new WMeteorModule(module));
}
@Override
public WQuad quad(Color color) {
return w(new WMeteorQuad(color));
}
@Override
public WTopBar topBar() {
return w(new WMeteorTopBar());
}
// Colors
@Override
public Color textColor() {
return textColor.get();
}
@Override
public Color textSecondaryColor() {
return textSecondaryColor.get();
}
// Other
@Override
public TextRenderer textRenderer() {
return TextRenderer.get();
}
@Override
public double scale(double value) {
return value * scale.get();
}
@Override
public boolean categoryIcons() {
return categoryIcons.get();
}
@Override
public boolean blur() {
return blur.get();
}
@Override
public boolean hideHUD() {
return hideHUD.get();
}
public int roundAmount() {
return round.get();
}
public class ThreeStateColorSetting {
private final Setting<SettingColor> normal, hovered, pressed;
public ThreeStateColorSetting(SettingGroup group, String name, SettingColor c1, SettingColor c2, SettingColor c3) {
normal = color(group, name, "Color of " + name + ".", c1);
hovered = color(group, "hovered-" + name, "Color of " + name + " when hovered.", c2);
pressed = color(group, "pressed-" + name, "Color of " + name + " when pressed.", c3);
}
public SettingColor get() {
return normal.get();
}
public SettingColor get(boolean pressed, boolean hovered, boolean bypassDisableHoverColor) {
if (pressed) return this.pressed.get();
return (hovered && (bypassDisableHoverColor || !disableHoverColor)) ? this.hovered.get() : this.normal.get();
}
public SettingColor get(boolean pressed, boolean hovered) {
return get(pressed, hovered, false);
}
}
}

View File

@@ -0,0 +1,26 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded;
import cloudburst.rejects.utils.gui.GuiUtils;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import minegame159.meteorclient.gui.utils.BaseWidget;
import minegame159.meteorclient.gui.widgets.WWidget;
import minegame159.meteorclient.utils.render.color.Color;
public interface MeteorWidget extends BaseWidget {
default MeteorRoundedGuiTheme theme() {
return (MeteorRoundedGuiTheme) getTheme();
}
default void renderBackground(GuiRenderer renderer, WWidget widget, boolean pressed, boolean mouseOver) {
MeteorRoundedGuiTheme theme = theme();
int r = theme.roundAmount();
Color outlineColor = theme.outlineColor.get(pressed, mouseOver);
GuiUtils.quadRounded(renderer, widget, theme.backgroundColor.get(pressed, mouseOver), r);
GuiUtils.quadOutlineRounded(renderer, widget, outlineColor, r, theme.scale(2));
}
}

View File

@@ -0,0 +1,28 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.WidgetScreen;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WAccount;
import minegame159.meteorclient.systems.accounts.Account;
import minegame159.meteorclient.utils.render.color.Color;
public class WMeteorAccount extends WAccount implements MeteorWidget {
public WMeteorAccount(WidgetScreen screen, Account<?> account) {
super(screen, account);
}
@Override
protected Color loggedInColor() {
return theme().loggedInColor.get();
}
@Override
protected Color accountTypeColor() {
return theme().textSecondaryColor.get();
}
}

View File

@@ -0,0 +1,47 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WHorizontalSeparator;
public class WMeteorHorizontalSeparator extends WHorizontalSeparator implements MeteorWidget {
public WMeteorHorizontalSeparator(String text) {
super(text);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
if (text == null) renderWithoutText(renderer);
else renderWithText(renderer);
}
private void renderWithoutText(GuiRenderer renderer) {
MeteorRoundedGuiTheme theme = theme();
double s = theme.scale(1);
double w = width / 2;
renderer.quad(x, y + s, w, s, theme.separatorEdges.get(), theme.separatorCenter.get());
renderer.quad(x + w, y + s, w, s, theme.separatorCenter.get(), theme.separatorEdges.get());
}
private void renderWithText(GuiRenderer renderer) {
MeteorRoundedGuiTheme theme = theme();
double s = theme.scale(2);
double h = theme.scale(1);
double textStart = Math.round(width / 2.0 - textWidth / 2.0 - s);
double textEnd = s + textStart + textWidth + s;
double offsetY = Math.round(height / 2.0);
renderer.quad(x, y + offsetY, textStart, h, theme.separatorEdges.get(), theme.separatorCenter.get());
renderer.text(text, x + textStart + s, y, theme.separatorText.get(), false);
renderer.quad(x + textEnd, y + offsetY, width - textEnd, h, theme.separatorCenter.get(), theme.separatorEdges.get());
}
}

View File

@@ -0,0 +1,23 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WLabel;
public class WMeteorLabel extends WLabel implements MeteorWidget {
public WMeteorLabel(String text, boolean title) {
super(text, title);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
if (!text.isEmpty()) {
renderer.text(text, x, y, color != null ? color : (title ? theme().titleTextColor.get() : theme().textColor.get()), title);
}
}
}

View File

@@ -0,0 +1,92 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.utils.AlignmentX;
import minegame159.meteorclient.gui.widgets.pressable.WPressable;
import minegame159.meteorclient.systems.modules.Module;
import minegame159.meteorclient.utils.Utils;
import static minegame159.meteorclient.utils.Utils.mc;
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT;
import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_RIGHT;
public class WMeteorModule extends WPressable implements MeteorWidget {
private final Module module;
private double titleWidth;
private double animationProgress1;
private double animationProgress2;
public WMeteorModule(Module module) {
this.module = module;
if (module.isActive()) {
animationProgress1 = 1;
animationProgress2 = 1;
} else {
animationProgress1 = 0;
animationProgress2 = 0;
}
}
@Override
public double pad() {
return theme.scale(4);
}
@Override
protected void onCalculateSize() {
double pad = pad();
if (titleWidth == 0) titleWidth = theme.textWidth(module.title);
width = pad + titleWidth + pad;
height = pad + theme.textHeight() + pad;
}
@Override
protected void onPressed(int button) {
if (button == GLFW_MOUSE_BUTTON_LEFT) module.toggle(Utils.canUpdate());
else if (button == GLFW_MOUSE_BUTTON_RIGHT) mc.openScreen(theme.moduleScreen(module));
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
double pad = pad();
animationProgress1 += delta * 4 * ((module.isActive() || mouseOver) ? 1 : -1);
animationProgress1 = Utils.clamp(animationProgress1, 0, 1);
animationProgress2 += delta * 6 * (module.isActive() ? 1 : -1);
animationProgress2 = Utils.clamp(animationProgress2, 0, 1);
if (animationProgress1 > 0) {
renderer.quad(x, y, width * animationProgress1, height, theme.moduleBackground.get());
}
if (animationProgress2 > 0) {
renderer.quad(x, y + height * (1 - animationProgress2), theme.scale(2), height * animationProgress2, theme.accentColor.get());
}
double x = this.x + pad;
double w = width - pad * 2;
if (theme.moduleAlignment.get() == AlignmentX.Center) {
x += w / 2 - titleWidth / 2;
}
else if (theme.moduleAlignment.get() == AlignmentX.Right) {
x += w - titleWidth;
}
renderer.text(module.title, x, y + pad, theme.textColor.get(), false);
}
}

View File

@@ -0,0 +1,27 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WMultiLabel;
import minegame159.meteorclient.utils.render.color.Color;
public class WMeteorMultiLabel extends WMultiLabel implements MeteorWidget {
public WMeteorMultiLabel(String text, boolean title, double maxWidth) {
super(text, title, maxWidth);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
double h = theme.textHeight(title);
Color color = theme().textColor.get();
for (int i = 0; i < lines.size(); i++) {
renderer.text(lines.get(i), x, y + h * i, color, false);
}
}
}

View File

@@ -0,0 +1,23 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.utils.gui.GuiUtils;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import minegame159.meteorclient.gui.widgets.WQuad;
import minegame159.meteorclient.utils.render.color.Color;
public class WMeteorQuad extends WQuad {
public WMeteorQuad(Color color) {
super(color);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
GuiUtils.quadRounded(renderer, x, y, width, height, color, ((MeteorRoundedGuiTheme)theme).roundAmount());
}
}

View File

@@ -0,0 +1,56 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WWidget;
import minegame159.meteorclient.gui.widgets.containers.WSection;
import minegame159.meteorclient.gui.widgets.pressable.WTriangle;
public class WMeteorSection extends WSection {
public WMeteorSection(String title, boolean expanded, WWidget headerWidget) {
super(title, expanded, headerWidget);
}
@Override
protected WHeader createHeader() {
return new WMeteorHeader(title);
}
protected class WMeteorHeader extends WHeader {
private WTriangle triangle;
public WMeteorHeader(String title) {
super(title);
}
@Override
public void init() {
add(theme.horizontalSeparator(title)).expandX();
if (headerWidget != null) add(headerWidget);
triangle = new WHeaderTriangle();
triangle.theme = theme;
triangle.action = this::onClick;
add(triangle);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
triangle.rotation = (1 - animProgress) * -90;
}
}
protected static class WHeaderTriangle extends WTriangle implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
renderer.rotatedQuad(x, y, width, height, rotation, GuiRenderer.TRIANGLE, theme().textColor.get());
}
}
}

View File

@@ -0,0 +1,21 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WTooltip;
public class WMeteorTooltip extends WTooltip implements MeteorWidget {
public WMeteorTooltip(String text) {
super(text);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
renderer.quad(this, theme().backgroundColor.get());
}
}

View File

@@ -0,0 +1,22 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WTopBar;
import minegame159.meteorclient.utils.render.color.Color;
public class WMeteorTopBar extends WTopBar implements MeteorWidget {
@Override
protected Color getButtonColor(boolean pressed, boolean hovered) {
return theme().backgroundColor.get(pressed, hovered);
}
@Override
protected Color getNameColor() {
return theme().textColor.get();
}
}

View File

@@ -0,0 +1,27 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.WVerticalSeparator;
import minegame159.meteorclient.utils.render.color.Color;
public class WMeteorVerticalSeparator extends WVerticalSeparator implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
Color colorEdges = theme.separatorEdges.get();
Color colorCenter = theme.separatorCenter.get();
double s = theme.scale(1);
double offsetX = Math.round(width / 2.0);
renderer.quad(x + offsetX, y, s, height / 2, colorEdges, colorEdges, colorCenter, colorCenter);
renderer.quad(x + offsetX, y + height / 2, s, height / 2, colorCenter, colorCenter, colorEdges, colorEdges);
}
}

View File

@@ -0,0 +1,19 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.containers.WView;
public class WMeteorView extends WView implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
if (canScroll && hasScrollBar) {
renderer.quad(handleX(), handleY(), handleWidth(), handleHeight(), theme().scrollbarColor.get(handlePressed, handleMouseOver));
}
}
}

View File

@@ -0,0 +1,37 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.utils.gui.GuiUtils;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.containers.WWindow;
public class WMeteorWindow extends WWindow implements MeteorWidget {
public WMeteorWindow(String title) {
super(title);
}
@Override
protected WHeader header() {
return new WMeteorHeader();
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
if (expanded || animProgress > 0) {
GuiUtils.quadRounded(renderer,x , y + header.height / 2, width, height - header.height / 2, theme().backgroundColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount(), false);
}
}
private class WMeteorHeader extends WHeader {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
GuiUtils.quadRounded(renderer, this, theme().accentColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount());
}
}
}

View File

@@ -0,0 +1,83 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.input;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.input.WDropdown;
import minegame159.meteorclient.utils.render.color.Color;
public class WMeteorDropdown<T> extends WDropdown<T> implements MeteorWidget {
public WMeteorDropdown(T[] values, T value) {
super(values, value);
}
@Override
protected WDropdownRoot createRootWidget() {
return new WRoot();
}
@Override
protected WDropdownValue createValueWidget() {
return new WValue();
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
double pad = pad();
double s = theme.textHeight();
renderBackground(renderer, this, pressed, mouseOver);
String text = get().toString();
double w = theme.textWidth(text);
renderer.text(text, x + pad + maxValueWidth / 2 - w / 2, y + pad, theme.textColor.get(), false);
renderer.rotatedQuad(x + pad + maxValueWidth + pad, y + pad, s, s, 0, GuiRenderer.TRIANGLE, theme.textColor.get());
}
private static class WRoot extends WDropdownRoot implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
double s = theme.scale(2);
Color c = theme.outlineColor.get();
renderer.quad(x, y + height - s, width, s, c);
renderer.quad(x, y, s, height - s, c);
renderer.quad(x + width - s, y, s, height - s, c);
}
}
private class WValue extends WDropdownValue implements MeteorWidget {
@Override
protected void onCalculateSize() {
double pad = pad();
width = pad + theme.textWidth(value.toString()) + pad;
height = pad + theme.textHeight() + pad;
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
Color color = theme.backgroundColor.get(pressed, mouseOver, true);
int preA = color.a;
color.a += color.a / 2;
color.validate();
renderer.quad(this, color);
color.a = preA;
String text = value.toString();
renderer.text(text, x + width / 2 - theme.textWidth(text) / 2, y + pad(), theme.textColor.get(), false);
}
}
}

View File

@@ -0,0 +1,45 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.input;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.input.WSlider;
public class WMeteorSlider extends WSlider implements MeteorWidget {
public WMeteorSlider(double value, double min, double max) {
super(value, min, max);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
double valueWidth = valueWidth();
renderBar(renderer, valueWidth);
renderHandle(renderer, valueWidth);
}
private void renderBar(GuiRenderer renderer, double valueWidth) {
MeteorRoundedGuiTheme theme = theme();
double s = theme.scale(3);
double handleSize = handleSize();
double x = this.x + handleSize / 2;
double y = this.y + height / 2 - s / 2;
renderer.quad(x, y, valueWidth, s, theme.sliderLeft.get());
renderer.quad(x + valueWidth, y, width - valueWidth - handleSize, s, theme.sliderRight.get());
}
private void renderHandle(GuiRenderer renderer, double valueWidth) {
MeteorRoundedGuiTheme theme = theme();
double s = handleSize();
renderer.quad(x + valueWidth, y, s, s, GuiRenderer.CIRCLE, theme.sliderHandle.get(dragging, handleMouseOver));
}
}

View File

@@ -0,0 +1,66 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.input;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.utils.CharFilter;
import minegame159.meteorclient.gui.widgets.input.WTextBox;
import minegame159.meteorclient.utils.Utils;
public class WMeteorTextBox extends WTextBox implements MeteorWidget {
private boolean cursorVisible;
private double cursorTimer;
private double animProgress;
public WMeteorTextBox(String text, CharFilter filter) {
super(text, filter);
}
@Override
protected void onCursorChanged() {
cursorVisible = true;
cursorTimer = 0;
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
if (cursorTimer >= 1) {
cursorVisible = !cursorVisible;
cursorTimer = 0;
}
else {
cursorTimer += delta * 1.75;
}
renderBackground(renderer, this, false, false);
renderTextAndCursor(renderer, delta);
}
private void renderTextAndCursor(GuiRenderer renderer, double delta) {
MeteorRoundedGuiTheme theme = theme();
double pad = pad();
double overflowWidth = getOverflowWidthForRender();
if (!text.isEmpty()) {
renderer.scissorStart(x + pad, y + pad, width - pad * 2, height - pad * 2);
renderer.text(text, x + pad - overflowWidth, y + pad, theme.textColor.get(), false);
renderer.scissorEnd();
}
animProgress += delta * 10 * (focused && cursorVisible ? 1 : -1);
animProgress = Utils.clamp(animProgress, 0, 1);
if ((focused && cursorVisible) || animProgress > 0) {
renderer.setAlpha(animProgress);
renderer.quad(x + pad + getCursorTextWidth() - overflowWidth, y + pad, theme.scale(1), theme.textHeight(), theme.textColor.get());
renderer.setAlpha(1);
}
}
}

View File

@@ -0,0 +1,34 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.pressable;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import minegame159.meteorclient.gui.renderer.packer.GuiTexture;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.pressable.WButton;
public class WMeteorButton extends WButton implements MeteorWidget {
public WMeteorButton(String text, GuiTexture texture) {
super(text, texture);
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
double pad = pad();
renderBackground(renderer, this, pressed, mouseOver);
if (text != null) {
renderer.text(text, x + width / 2 - textWidth / 2, y + pad, theme.textColor.get(), false);
}
else {
double ts = theme.textHeight();
renderer.quad(x + width / 2 - ts / 2, y + pad, ts, ts, texture, theme.textColor.get());
}
}
}

View File

@@ -0,0 +1,37 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.pressable;
import cloudburst.rejects.utils.gui.GuiUtils;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.pressable.WCheckbox;
import minegame159.meteorclient.utils.Utils;
public class WMeteorCheckbox extends WCheckbox implements MeteorWidget {
private double animProgress;
public WMeteorCheckbox(boolean checked) {
super(checked);
animProgress = checked ? 1 : 0;
}
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
animProgress += (checked ? 1 : -1) * delta * 14;
animProgress = Utils.clamp(animProgress, 0, 1);
renderBackground(renderer, this, pressed, mouseOver);
if (animProgress > 0) {
double cs = (width - theme.scale(2)) / 1.75 * animProgress;
GuiUtils.quadRounded(renderer, x + (width - cs) / 2, y + (height - cs) / 2, cs, cs, theme.checkboxColor.get(), ((MeteorRoundedGuiTheme)theme).roundAmount());
}
}
}

View File

@@ -0,0 +1,21 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.pressable;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.pressable.WMinus;
public class WMeteorMinus extends WMinus implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
double pad = pad();
double s = theme.scale(3);
renderBackground(renderer, this, pressed, mouseOver);
renderer.quad(x + pad, y + height / 2 - s / 2, width - pad * 2, s, theme().minusColor.get());
}
}

View File

@@ -0,0 +1,24 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.pressable;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorRoundedGuiTheme;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.pressable.WPlus;
public class WMeteorPlus extends WPlus implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
MeteorRoundedGuiTheme theme = theme();
double pad = pad();
double s = theme.scale(3);
renderBackground(renderer, this, pressed, mouseOver);
renderer.quad(x + pad, y + height / 2 - s / 2, width - pad * 2, s, theme.plusColor.get());
renderer.quad(x + width / 2 - s / 2, y + pad, s, height - pad * 2, theme.plusColor.get());
}
}

View File

@@ -0,0 +1,17 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client/).
* Copyright (c) 2021 Meteor Development.
*/
package cloudburst.rejects.gui.themes.rounded.widgets.pressable;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import cloudburst.rejects.gui.themes.rounded.MeteorWidget;
import minegame159.meteorclient.gui.widgets.pressable.WTriangle;
public class WMeteorTriangle extends WTriangle implements MeteorWidget {
@Override
protected void onRender(GuiRenderer renderer, double mouseX, double mouseY, double delta) {
renderer.rotatedQuad(x, y, width, height, rotation, GuiRenderer.TRIANGLE, theme().backgroundColor.get(pressed, mouseOver));
}
}

View File

@@ -8,5 +8,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(GuiRenderer.class)
public interface GuiRendererAccessor {
@Accessor("mb")
public MeshBuilder getMeshbuilder();
MeshBuilder getMeshbuilder();
}

View File

@@ -0,0 +1,42 @@
package cloudburst.rejects.utils.gui;
import cloudburst.rejects.mixin.meteor.GuiRendererAccessor;
import minegame159.meteorclient.gui.renderer.GuiRenderer;
import minegame159.meteorclient.gui.widgets.WWidget;
import minegame159.meteorclient.rendering.MeshBuilder;
import minegame159.meteorclient.utils.render.color.Color;
public class GuiUtils {
public static void quadRounded(GuiRenderer renderer, double x, double y, double width, double height, Color color, int round, boolean roundTop) {
MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder();
RoundedMeshBuilder.quadRounded(mb, x, y, width, height, color, round, roundTop);
}
public static void quadRounded(GuiRenderer renderer, double x, double y, double width, double height, Color color, int round) {
quadRounded(renderer, x, y, width, height, color, round, true);
}
public static void quadRounded(GuiRenderer renderer, WWidget widget, Color color, int round) {
quadRounded(renderer, widget.x, widget.y, widget.width, widget.height, color, round);
}
public static void quadOutlineRounded(GuiRenderer renderer, double x, double y, double width, double height, Color color, int round, double s) {
MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder();
RoundedMeshBuilder.quadRoundedOutline(mb, x, y, width, height, color, round, s);
}
public static void quadOutlineRounded(GuiRenderer renderer, WWidget widget, Color color, int round, double s) {
quadOutlineRounded(renderer, widget.x, widget.y, widget.width, widget.height, color, round, s);
}
public static void quadRoundedSide(GuiRenderer renderer, double x, double y, double width, double height, Color color, int r, boolean right) {
MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder();
RoundedMeshBuilder.quadRoundedSide(mb, x, y, width, height, color, r, right);
}
public static void quadRoundedSide(GuiRenderer renderer, WWidget widget, Color color, int round, boolean right) {
quadRoundedSide(renderer, widget.x, widget.y, widget.width, widget.height, color, round, right);
}
public static void circlePart(GuiRenderer renderer, double x, double y, double r, double startAngle, double angle, Color color) {
MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder();
RoundedMeshBuilder.circlePart(mb, x, y, r, startAngle, angle, color);
}
public static void circlePartOutline(GuiRenderer renderer, double x, double y, double r, double startAngle, double angle, Color color, double outlineWidth) {
MeshBuilder mb = ((GuiRendererAccessor)renderer).getMeshbuilder();
RoundedMeshBuilder.circlePartOutline(mb, x, y, r, startAngle, angle, color, outlineWidth);
}
}

View File

@@ -0,0 +1,134 @@
package cloudburst.rejects.utils.gui;
import minegame159.meteorclient.rendering.MeshBuilder;
import minegame159.meteorclient.utils.render.color.Color;
public class RoundedMeshBuilder {
private static final double circleNone = 0;
private static final double circleQuarter = Math.PI / 2;
private static final double circleHalf = circleQuarter * 2;
private static final double circleThreeQuarter = circleQuarter * 3;
public static void quadRoundedOutline(MeshBuilder mb, double x, double y, double width, double height, Color color, int r, double s) {
r = getR(r, width, height);
if (r == 0) {
mb.quad(x, y, width, s, color);
mb.quad(x, y + height - s, width, s, color);
mb.quad(x, y + s, s, height - s * 2, color);
mb.quad(x + width - s, y + s, s, height - s * 2, color);
}
else {
//top
circlePartOutline(mb, x + r, y + r, r, circleThreeQuarter, circleQuarter, color, s);
mb.quad(x + r, y, width - r * 2, s, color);
circlePartOutline(mb, x + width - r, y + r, r, circleNone, circleQuarter, color, s);
//middle
mb.quad(x, y + r, s, height - r * 2, color);
mb.quad(x + width - s, y + r, s, height - r * 2, color);
//bottom
circlePartOutline(mb, x + width - r, y + height - r, r, circleQuarter, circleQuarter, color, s);
mb.quad(x + r, y + height - s, width - r * 2, s, color);
circlePartOutline(mb, x + r, y + height - r, r, circleHalf, circleQuarter, color, s);
}
}
public static void quadRounded(MeshBuilder mb, double x, double y, double width, double height, Color color, int r, boolean roundTop) {
r = getR(r, width, height);
if (r == 0)
mb.quad(x, y, width, height, color);
else {
if (roundTop) {
//top
circlePart(mb, x + r, y + r, r, circleThreeQuarter, circleQuarter, color);
mb.quad(x + r, y, width - 2 * r, r, color);
circlePart(mb, x + width - r, y + r, r, circleNone, circleQuarter, color);
//middle
mb.quad(x, y + r, width, height - 2 * r, color);
}
else {
//middle
mb.quad(x, y, width, height - r, color);
}
//bottom
circlePart(mb, x + width - r, y + height - r, r, circleQuarter, circleQuarter, color);
mb.quad(x + r, y + height - r, width - 2 * r, r, color);
circlePart(mb, x + r, y + height - r, r, circleHalf, circleQuarter, color);
}
}
public static void quadRoundedSide(MeshBuilder mb, double x, double y, double width, double height, Color color, int r, boolean right) {
r = getR(r, width, height);
if (r == 0)
mb.quad(x, y, width, height, color);
else {
if (right) {
circlePart(mb, x + width - r, y + r, r, circleNone, circleQuarter, color);
circlePart(mb, x + width - r, y + height - r, r, circleQuarter, circleQuarter, color);
mb.quad(x, y, width - r, height, color);
mb.quad(x + width - r, y + r, r, height - r * 2, color);
}
else {
circlePart(mb, x + r, y + r, r, circleThreeQuarter, circleQuarter, color);
circlePart(mb, x + r, y + height - r, r, circleHalf, circleQuarter, color);
mb.quad(x + r, y, width - r, height, color);
mb.quad(x, y + r, r, height - r * 2, color);
}
}
}
private static int getR(int r, double w, double h) {
if (r * 2 > h) {
r = (int)h / 2;
}
if (r * 2 > w) {
r = (int)w / 2;
}
return r;
}
private static int getCirDepth(double r, double angle) {
return Math.max(1, (int)(angle * r / circleQuarter));
}
public static void circlePart(MeshBuilder mb, double x, double y, double r, double startAngle, double angle, Color color) {
int cirDepth = getCirDepth(r, angle);
double cirPart = angle / cirDepth;
vert2(mb,x + Math.sin(startAngle) * r, y - Math.cos(startAngle) * r, color);
for (int i = 1; i < cirDepth + 1; i++) {
vert2(mb, x, y, color);
double xV = x + Math.sin(startAngle + cirPart * i) * r;
double yV = y - Math.cos(startAngle + cirPart * i) * r;
vert2(mb, xV, yV, color);
if (i != cirDepth)
vert2(mb, xV, yV, color);
}
}
public static void circlePartOutline(MeshBuilder mb, double x, double y, double r, double startAngle, double angle, Color color, double outlineWidth) {
int cirDepth = getCirDepth(r, angle);
double cirPart = angle / cirDepth;
for (int i = 0; i < cirDepth; i++) {
double xOC = x + Math.sin(startAngle + cirPart * i) * r;
double yOC = y - Math.cos(startAngle + cirPart * i) * r;
double xIC = x + Math.sin(startAngle + cirPart * i) * (r - outlineWidth);
double yIC = y - Math.cos(startAngle + cirPart * i) * (r - outlineWidth);
double xON = x + Math.sin(startAngle + cirPart * (i + 1)) * r;
double yON = y - Math.cos(startAngle + cirPart * (i + 1)) * r;
double xIN = x + Math.sin(startAngle + cirPart * (i + 1)) * (r - outlineWidth);
double yIN = y - Math.cos(startAngle + cirPart * (i + 1)) * (r - outlineWidth);
//
vert2(mb, xOC, yOC, color);
vert2(mb, xON, yON, color);
vert2(mb, xIC, yIC, color);
//
vert2(mb, xIC, yIC, color);
vert2(mb, xON, yON, color);
vert2(mb, xIN, yIN, color);
}
}
public static void vert2(MeshBuilder mb, double x, double y, Color c) {
mb.pos(x, y, 0).color(c).endVertex();
}
}