HolographicDisplays/core/src/main/java/me/filoghost/holographicdisplays/core/base/BaseHologramLines.java

149 lines
3.7 KiB
Java

/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.core.base;
import me.filoghost.holographicdisplays.api.Position;
import me.filoghost.holographicdisplays.core.CoreGlobalConfig;
import me.filoghost.holographicdisplays.core.CorePreconditions;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class BaseHologramLines<T extends EditableHologramLine> implements Iterable<T> {
private final BaseHologram hologram;
private final List<T> lines;
private final List<T> unmodifiableLinesView;
public BaseHologramLines(BaseHologram hologram) {
this.hologram = hologram;
this.lines = new ArrayList<>();
this.unmodifiableLinesView = Collections.unmodifiableList(lines);
}
@Override
public Iterator<T> iterator() {
CorePreconditions.checkMainThread();
return unmodifiableLinesView.iterator();
}
public int size() {
CorePreconditions.checkMainThread();
return lines.size();
}
public @NotNull T get(int index) {
CorePreconditions.checkMainThread();
return lines.get(index);
}
public void add(T line) {
CorePreconditions.checkMainThread();
checkNotDeleted();
lines.add(line);
updatePositions();
}
public void insert(int beforeIndex, T line) {
CorePreconditions.checkMainThread();
checkNotDeleted();
lines.add(beforeIndex, line);
updatePositions();
}
public void remove(int index) {
CorePreconditions.checkMainThread();
checkNotDeleted();
lines.remove(index).setDeleted();
updatePositions();
}
public boolean remove(T line) {
CorePreconditions.checkMainThread();
checkNotDeleted();
boolean removed = lines.remove(line);
if (removed) {
line.setDeleted();
updatePositions();
}
return removed;
}
public void clear() {
CorePreconditions.checkMainThread();
checkNotDeleted();
Iterator<T> iterator = lines.iterator();
while (iterator.hasNext()) {
T line = iterator.next();
iterator.remove();
line.setDeleted();
}
// No need to update positions, since there are no lines
}
/**
* The top part of the first line should be exactly on the Y position of the hologram.
* The second line is below the first, and so on.
*/
public void updatePositions() {
Position hologramPosition = hologram.getPosition();
double currentLineY = hologramPosition.getY();
for (int i = 0; i < lines.size(); i++) {
T line = lines.get(i);
currentLineY -= line.getHeight();
if (i > 0) {
currentLineY -= CoreGlobalConfig.spaceBetweenLines;
}
line.setCoordinates(hologramPosition.getX(), currentLineY, hologramPosition.getZ());
}
}
public double getHeight() {
CorePreconditions.checkMainThread();
if (lines.isEmpty()) {
return 0;
}
double height = 0.0;
for (EditableHologramLine line : lines) {
height += line.getHeight();
}
height += CoreGlobalConfig.spaceBetweenLines * (lines.size() - 1);
return height;
}
public void setDeleted() {
for (T line : lines) {
line.setDeleted();
}
}
protected void checkNotDeleted() {
hologram.checkNotDeleted();
}
@Override
public String toString() {
return lines.toString();
}
}