Some Fixes for SchematicSelector #140
@ -20,6 +20,7 @@
|
||||
package de.steamwar.inventory;
|
||||
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.sql.NodeMember;
|
||||
import de.steamwar.sql.SchematicNode;
|
||||
import de.steamwar.sql.SchematicType;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
@ -52,6 +53,9 @@ public class SchematicSelector {
|
||||
@Getter
|
||||
private boolean singleDirOpen;
|
||||
private boolean sdoTrigger = false;
|
||||
@Getter
|
||||
@Setter
|
||||
private int depth = 0;
|
||||
private Sorting sorting = Sorting.NAME;
|
||||
private boolean invertSorting = false;
|
||||
|
||||
@ -81,12 +85,13 @@ public class SchematicSelector {
|
||||
|
||||
if(sdoTrigger) {
|
||||
sdoTrigger = false;
|
||||
openList(nodes.get(0));
|
||||
return;
|
||||
}
|
||||
|
||||
List<SWListInv.SWListEntry<SchematicNode>> list = new ArrayList<>();
|
||||
|
||||
if(parent != null) {
|
||||
if(depth != 0) {
|
||||
list.add(new SWListInv.SWListEntry<>(new SWItem(Material.ARROW, Core.MESSAGE.parse("SCHEM_SELECTOR_BACK", player), clickType -> {}), null));
|
||||
}
|
||||
|
||||
@ -137,7 +142,32 @@ public class SchematicSelector {
|
||||
|
||||
private void handleClick(SchematicNode node, SchematicNode parent) {
|
||||
if(node == null) {
|
||||
openList(getParent(parent));
|
||||
depth--;
|
||||
if(!singleDirOpen) {
|
||||
if(NodeMember.getNodeMember(parent.getId(), user.getId()) != null) {
|
||||
openList(null);
|
||||
} else {
|
||||
openList(getParent(parent));
|
||||
}
|
||||
} else {
|
||||
SchematicNode currentParent = parent;
|
||||
boolean isMember = false;
|
||||
do {
|
||||
sdoTrigger = false;
|
||||
if(NodeMember.getNodeMember(currentParent.getId(), user.getId()) != null) {
|
||||
isMember = true;
|
||||
}
|
||||
currentParent = getParent(currentParent);
|
||||
if(currentParent == null)
|
||||
break;
|
||||
getSchematicList(currentParent);
|
||||
} while (sdoTrigger);
|
||||
if(isMember || NodeMember.getNodeMember(parent.getId(), user.getId()) != null) {
|
||||
openList(null);
|
||||
} else {
|
||||
openList(currentParent);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(node.isDir()) {
|
||||
@ -147,6 +177,7 @@ public class SchematicSelector {
|
||||
return;
|
||||
}
|
||||
filter.reset();
|
||||
depth++;
|
||||
openList(node);
|
||||
return;
|
||||
}
|
||||
@ -323,7 +354,7 @@ public class SchematicSelector {
|
||||
nodes.removeIf(node -> !node.isDir());
|
||||
}
|
||||
if(target.target == Target.SCHEMATIC_TYPE) {
|
||||
nodes.removeIf(node -> node.isDir() || !node.getType().equals(target.type.toDB()));
|
||||
nodes.removeIf(node -> node.isDir() || !node.getSchemtype().equals(target.type));
|
||||
}
|
||||
return nodes;
|
||||
}
|
||||
@ -342,7 +373,12 @@ public class SchematicSelector {
|
||||
case SCHEMATIC_TYPE:
|
||||
nodes.addAll(SchematicNode.getAccessibleSchematicsOfTypeInParent(user.getId(), target.type.toDB(), parent==null?0:parent.getId()));
|
||||
if(target.rank >= 0) {
|
||||
nodes.removeIf(node -> node.getRank() > target.rank);
|
||||
nodes.removeIf(node -> {
|
||||
if(node.isDir()) {
|
||||
return false;
|
||||
}
|
||||
return node.getRank() > target.rank;
|
||||
});
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -350,7 +386,6 @@ public class SchematicSelector {
|
||||
}
|
||||
|
||||
if(singleDirOpen && nodes.size() == 1 && nodes.get(0).isDir()) {
|
||||
openList(nodes.get(0));
|
||||
sdoTrigger = true;
|
||||
}
|
||||
return nodes;
|
||||
|
@ -34,6 +34,7 @@ import java.sql.SQLException;
|
||||
import java.sql.Timestamp;
|
||||
import java.time.Instant;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
@ -488,13 +489,14 @@ public class SchematicNode {
|
||||
StringBuilder builder = new StringBuilder(getName());
|
||||
SchematicNode currentNode = this;
|
||||
if (currentNode.isDir()) builder.append("/");
|
||||
|
||||
while (currentNode.getParentNode() != null) {
|
||||
final Set<NodeMember> nodeMembers = NodeMember.getSchematics(user.getId());
|
||||
AtomicInteger i = new AtomicInteger();
|
||||
i.set(currentNode.getId());
|
||||
while (currentNode.getParentNode() != null && nodeMembers.stream().noneMatch(nodeMember -> nodeMember.getNode() == i.get())) {
|
||||
currentNode = currentNode.getParentNode();
|
||||
i.set(currentNode.getId());
|
||||
builder.insert(0, split)
|
||||
.insert(0, currentNode.getName());
|
||||
if (currentNode.getMembers().stream().anyMatch(member -> member.getMember() == user.getId())) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Wie häufig wird das ausgeführt? Falls häufig, dürfte das wsl. ungeil sein, weil da glaube immer eine DB-Abfrage dahinterhängt
Sollte jetzt nicht mehr so viele SQL-Statements aufrufen, ist die Methode, welche denn Pfad zu einer Schematic erstellt, da würde das currentNode.getMembers() für jede ParentNode ausgeführt werden.