SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/gui/components/special/ConsoleComponent.java

223 lines
5.3 KiB
Java

package speiger.src.coreengine.rendering.gui.components.special;
import java.util.List;
import java.util.function.Consumer;
import org.lwjgl.glfw.GLFW;
import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.coreengine.math.misc.ColorUtils;
import speiger.src.coreengine.rendering.gui.GuiComponent;
import speiger.src.coreengine.rendering.gui.base.IKeyComponent;
import speiger.src.coreengine.rendering.gui.components.ListComponent;
import speiger.src.coreengine.rendering.gui.components.ScrollBarComponent;
import speiger.src.coreengine.rendering.gui.components.TextFieldComponent;
import speiger.src.coreengine.rendering.gui.components.list.TextListEntry;
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrains;
import speiger.src.coreengine.rendering.gui.helper.constrains.ParentConstrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.PixelConstrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.RelativeConstrain;
import speiger.src.coreengine.rendering.gui.renderer.IFontRenderer;
public class ConsoleComponent extends GuiComponent implements IKeyComponent
{
TextFieldComponent chat = new TextFieldComponent(ColorUtils.DARK_GRAY).setCanLoseFocus(false).setInfiniteText(true).setMaxTextLength(Integer.MAX_VALUE).setFocused(true);
ListComponent<MessageEntry> list = new ListComponent<>(ColorUtils.setA(ColorUtils.DARK_GRAY, 120), 8F);
float lastWidth = 0F;
List<ConsoleMessage> messages = new ObjectArrayList<>();
Consumer<String> listener;
int messageIterator = 0;
boolean started = false;
public ConsoleComponent()
{
this(0F, 0F, 0F, 0F);
}
public ConsoleComponent(float x, float y, float width, float height)
{
super(x, y, width, height);
}
public ConsoleComponent setListener(Consumer<String> listener)
{
this.listener = listener;
return this;
}
@Override
public void init()
{
chat.getRawText().setTextScale(0.45F);
chat.addUserActionListener(this::onEnter);
list.setSelectionMode(ListComponent.SELECTION_MODE_DISABLE);
list.setStartAtBottom(true);
addChild(chat, new Constrains(new ParentConstrain(), new ParentConstrain(12F).invert(), new ParentConstrain(), new PixelConstrain(12F)));
addChild(list, new Constrains(new ParentConstrain(), new ParentConstrain(100).invert(), new RelativeConstrain(0.8F), new PixelConstrain(88)));
}
@Override
protected void updateState()
{
float width = list.getBox().getWidth();
if(lastWidth != width)
{
lastWidth = width;
updateMessages();
}
}
protected void updateMessages()
{
list.clear();
for(int i = 0,m=messages.size();i<m;i++)
{
ConsoleMessage message = messages.get(i);
addMessage(message.getMessage(), message.getMessageId(), false);
}
}
public void toggleVisiblity()
{
setVisible(!isVisible());
chat.setFocused(isVisible());
}
private void onEnter()
{
if(!chat.isVisible())
{
chat.setText("");
return;
}
if(chat.getText().isEmpty()) return;
addMessage(chat.getText(), 0);
chat.setText("");
}
@Override
public boolean isAcceptingInput()
{
return isVisible();
}
@Override
public boolean isBlockingMovement()
{
return true;
}
@Override
public boolean onKeyPressed(int key)
{
if(key == GLFW.GLFW_KEY_UP)
{
if(messageIterator < messages.size())
{
chat.setText(messages.get((messages.size()-1 - messageIterator)).getMessage()).setCurserToEnd();
messageIterator++;
started = true;
}
return true;
}
else if(key == GLFW.GLFW_KEY_DOWN)
{
if(messageIterator > 0)
{
messageIterator--;
chat.setText(messages.get((messages.size()-1 - messageIterator)).getMessage()).setCurserToEnd();
}
else if(started)
{
chat.setText("").setCurserToEnd();
started = false;
}
return true;
}
return false;
}
public void addMessage(String text)
{
addMessage(text, 0);
}
public void addMessage(String text, int messageId)
{
addMessage(text, messageId, true);
}
private void addMessage(String text, int messageId, boolean add)
{
if(listener != null && text.startsWith("/"))
{
listener.accept(text.substring(1));
return;
}
ScrollBarComponent scroll = list.getVerticalBar();
boolean atEnd = scroll.isAtEnd();
float width = (list.getBox().getWidth() -5F) / 0.45F;
for(String s : getGui().getFont().split(text, width, IFontRenderer.SPECIAL))
{
list.add(new MessageEntry(s, messageId));
}
if(atEnd) scroll.setScrollEnd();
if(add)
{
messages.add(new ConsoleMessage(messageId, text));
messageIterator = 0;
}
}
public void clearMessages()
{
messages.clear();
list.clear();
messageIterator = 0;
}
public void removeMessage(int messageId)
{
messages.removeIf(T -> T.getMessageId() == messageId);
list.removeIf(T -> T.getMessageId() == messageId);
}
private static class ConsoleMessage
{
int messageId;
String message;
public ConsoleMessage(int messageId, String message)
{
this.messageId = messageId;
this.message = message;
}
public String getMessage()
{
return message;
}
public int getMessageId()
{
return messageId;
}
}
private static class MessageEntry extends TextListEntry
{
int messageId;
public MessageEntry(String s, int messageId)
{
super(s);
this.messageId = messageId;
setScale(0.45F);
}
public int getMessageId()
{
return messageId;
}
}
}