// Class click gui
// Список категорий
private ArrayList<Panel> panels = new ArrayList<>();
// Конструктор. В нем инициализируешь все переменные, списки
public ClickGui() {
int offset = 200;
// Проходимся по каждой категории которая enum, а не ui. Хз как иначе объяснить
for(Category category : Category.values()) {
// Переменная из которой можно будет извлечь ширину категории
Panel panel = new Panel(category, offset, posY);
// Добавления категии в список
panels.add(panel);
// Добавления ширины категории к offset что-бы категории не были в друг друге
offset += panel.getWidth() + 10; // 10 отступ между категориями
}
}
// Метод отрисовки
@Override
public void render(MatrixStack stack, double mouseX, double mouseY) {
// Здесь рисуешь что будет на заднем фоне будь-то размытие либо фон окна если стиль cs gui
// Проходимся по каждой категории
for(Panel panel : panels) {
// Отрисовка категории
panel.render(mouseX, mouseY);
}
}
// Метод срабатывающий при клике
@Override
public void mouseClicked(double mouseX, double mouseY, int mouseClicked) {
// Проходимся по каждой панели
for(Panel panel : panels) {
// Вызов метода клика для категории
panel.mouseClicked(mouseX, mouseY, mouseClicked);
// Если панель открыта. Условие не для cs gui
if(panel.isOpened()) {
// Проходимся по каждой функции категории
for(Module module : panel.getModules()) {
// Вызов метода клика для функции
module.mouseClicked(mouseX, mouseY, mouseClicked);
}
}
}
}
// class Panel
// тут dropdown имеется в виду как у экспы, где панели не закрываются и не передвигаются
private Category category;
private int posX, posY, width;
// final потому что высота не будет менятся в будущем
private final int height;
// если не dropdown
private boolean opened;
private ArrayList<Module> modules = new ArrayList<>();
/*
Конструктор который принимает категорию и позиции по Х Y.
int хавает меньше памяти по этому он, но если нужно более точная позиция,
то float или double для тебя
*/
public Panel(Category category, int posX, int posY) {
// Присваивание переменным значения из аргументов
this.category = category;
this.posX = posX;
this.posY = posY;
// Размеры панели
// В данном случае я написал размеры лишь самого заголовка
width = 100; // ширина
height = 30; // высота
// Открыта ли панель
opened = true;
int offset = posY + height;
// Проходимся по каждой функции категории панели
for(Function function : Client.INSTANCE.getModuleManager().getModulesByCategory(category)) {
// Переменная Module из которой можно извлечь высоту
Module module = new Module(function, posX, offset);
// Добавления переменной module в список функций панели
modules.add(module);
// Добавления суммы высоты модуля и 5 к offset
offset += module.getHeight() + 5; // 5 - отступ между функциями
}
}
// Метод отрисовки
public void render(double mouseX, double mouseY) {
// Задний фон заголовка панели
RenderUtil.drawRect(posX, posY, width, height, new Color(0, 0, 240));
// Заголовок
Fonts.sfMedium.drawCenteredText(category.name(), posX + (width / 2), posY + (height / 2), new Color(255, 255, 255));
// Если панель открыта
if(opened) {
// Проходимся по каждой функции панели
for(Module module : modules) {
// Отрисовываешь каждую фукнцию панели
module.render(mouseX, mouseY);
}
}
}