Made the SettingsPanel fancier (well, I tried xD)

Had to remove the "MENU" FlagType, which I replaced by the "subPanel" argument in the Flag itself.
This commit is contained in:
Florian CUNY 2018-06-16 17:10:00 +02:00
parent 4525a04324
commit b410d49c2b
7 changed files with 105 additions and 55 deletions

View File

@ -19,10 +19,19 @@ import us.tastybento.bskyblock.managers.RanksManager;
public class Flag implements Comparable<Flag> { public class Flag implements Comparable<Flag> {
public enum Type { public enum Type {
PROTECTION, PROTECTION(Material.SHIELD),
SETTING, SETTING(Material.COMMAND),
MENU, WORLD_SETTING(Material.GRASS);
WORLD_SETTING
private Material icon;
Type(Material icon) {
this.icon = icon;
}
public Material getIcon() {
return icon;
}
} }
private final String id; private final String id;
@ -32,8 +41,9 @@ public class Flag implements Comparable<Flag> {
private boolean setting; private boolean setting;
private final int defaultRank; private final int defaultRank;
private final PanelItem.ClickHandler clickHandler; private final PanelItem.ClickHandler clickHandler;
private final boolean subPanel;
Flag(String id, Material icon, Listener listener, boolean defaultSetting, Type type, int defaultRank, PanelItem.ClickHandler clickListener) { Flag(String id, Material icon, Listener listener, boolean defaultSetting, Type type, int defaultRank, PanelItem.ClickHandler clickListener, boolean subPanel) {
this.id = id; this.id = id;
this.icon = icon; this.icon = icon;
this.listener = listener; this.listener = listener;
@ -41,6 +51,7 @@ public class Flag implements Comparable<Flag> {
this.type = type; this.type = type;
this.defaultRank = defaultRank; this.defaultRank = defaultRank;
this.clickHandler = clickListener; this.clickHandler = clickListener;
this.subPanel = subPanel;
} }
public String getID() { public String getID() {
@ -99,6 +110,13 @@ public class Flag implements Comparable<Flag> {
return defaultRank; return defaultRank;
} }
/**
* @return whether the flag uses a subpanel or not
*/
public boolean hasSubPanel() {
return subPanel;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#hashCode() * @see java.lang.Object#hashCode()
*/ */
@ -157,7 +175,7 @@ public class Flag implements Comparable<Flag> {
.icon(new ItemStack(icon)) .icon(new ItemStack(icon))
.name(user.getTranslation("protection.panel.flag-item.name-layout", TextVariables.NAME, user.getTranslation(getNameReference()))) .name(user.getTranslation("protection.panel.flag-item.name-layout", TextVariables.NAME, user.getTranslation(getNameReference())))
.clickHandler(clickHandler); .clickHandler(clickHandler);
if (getType().equals(Type.MENU)) { if (hasSubPanel()) {
pib.description(user.getTranslation("protection.panel.flag-item.menu-layout", TextVariables.DESCRIPTION, user.getTranslation(getDescriptionReference()))); pib.description(user.getTranslation("protection.panel.flag-item.menu-layout", TextVariables.DESCRIPTION, user.getTranslation(getDescriptionReference())));
return pib.build(); return pib.build();
} }
@ -208,7 +226,7 @@ public class Flag implements Comparable<Flag> {
@Override @Override
public String toString() { public String toString() {
return "Flag [id=" + id + ", icon=" + icon + ", listener=" + listener + ", type=" + type + ", defaultSetting=" return "Flag [id=" + id + ", icon=" + icon + ", listener=" + listener + ", type=" + type + ", defaultSetting="
+ setting + ", defaultRank=" + defaultRank + ", clickHandler=" + clickHandler + "]"; + setting + ", defaultRank=" + defaultRank + ", clickHandler=" + clickHandler + ", subPanel=" + subPanel + "]";
} }
@Override @Override

View File

@ -17,6 +17,7 @@ public class FlagBuilder {
private Type type = Type.PROTECTION; private Type type = Type.PROTECTION;
private int defaultRank = RanksManager.MEMBER_RANK; private int defaultRank = RanksManager.MEMBER_RANK;
private PanelItem.ClickHandler onClick; private PanelItem.ClickHandler onClick;
private boolean subPanel = false;
public FlagBuilder id(String string) { public FlagBuilder id(String string) {
id = string; id = string;
@ -43,7 +44,7 @@ public class FlagBuilder {
} }
public Flag build() { public Flag build() {
return new Flag(id, icon, listener, setting, type, defaultRank, onClick); return new Flag(id, icon, listener, setting, type, defaultRank, onClick, subPanel);
} }
/** /**
@ -96,5 +97,15 @@ public class FlagBuilder {
this.onClick = onClickListener; this.onClick = onClickListener;
return this; return this;
} }
/**
* Marks this flag as "using a sub-panel"
* @param subPanel - whether the flag will use a sub-panel or not
* @return FlagBuilder
*/
public FlagBuilder subPanel(boolean subPanel) {
this.subPanel = subPanel;
return this;
}
} }

View File

@ -3,6 +3,7 @@ package us.tastybento.bskyblock.commands.admin;
import java.util.List; import java.util.List;
import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.CompositeCommand;
import us.tastybento.bskyblock.api.flags.Flag;
import us.tastybento.bskyblock.api.user.User; import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.panels.SettingsPanel; import us.tastybento.bskyblock.panels.SettingsPanel;
import us.tastybento.bskyblock.util.Util; import us.tastybento.bskyblock.util.Util;
@ -34,7 +35,7 @@ public class AdminWorldCommand extends CompositeCommand {
public boolean execute(User user, List<String> args) { public boolean execute(User user, List<String> args) {
// Settings are only shown if you are in the right world // Settings are only shown if you are in the right world
if (Util.getWorld(user.getWorld()).equals(getWorld())) { if (Util.getWorld(user.getWorld()).equals(getWorld())) {
SettingsPanel.openWorldSettingsPanel(getPlugin(), user); SettingsPanel.openPanel(getPlugin(), user, Flag.Type.WORLD_SETTING);
return true; return true;
} else { } else {
user.sendMessage("general.errors.wrong-world"); user.sendMessage("general.errors.wrong-world");

View File

@ -3,6 +3,7 @@ package us.tastybento.bskyblock.commands.island;
import java.util.List; import java.util.List;
import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.CompositeCommand;
import us.tastybento.bskyblock.api.flags.Flag;
import us.tastybento.bskyblock.api.user.User; import us.tastybento.bskyblock.api.user.User;
import us.tastybento.bskyblock.panels.SettingsPanel; import us.tastybento.bskyblock.panels.SettingsPanel;
import us.tastybento.bskyblock.util.Util; import us.tastybento.bskyblock.util.Util;
@ -33,7 +34,7 @@ public class IslandSettingsCommand extends CompositeCommand {
public boolean execute(User user, List<String> args) { public boolean execute(User user, List<String> args) {
// Settings are only shown if you are in the right world // Settings are only shown if you are in the right world
if (Util.getWorld(user.getWorld()).equals(getWorld())) { if (Util.getWorld(user.getWorld()).equals(getWorld())) {
SettingsPanel.openPanel(getPlugin(), user); SettingsPanel.openPanel(getPlugin(), user, Flag.Type.PROTECTION); //TODO keep track of history?
return true; return true;
} else { } else {
user.sendMessage("general.errors.wrong-world"); user.sendMessage("general.errors.wrong-world");

View File

@ -157,8 +157,8 @@ public class Flags {
.onClick(new WorldToggleClickListener("PISTON_PUSH")) .onClick(new WorldToggleClickListener("PISTON_PUSH"))
.build(); .build();
static InvincibleVisitorsListener ilv = new InvincibleVisitorsListener(); static InvincibleVisitorsListener ilv = new InvincibleVisitorsListener();
public static final Flag INVINCIBLE_VISITORS = new FlagBuilder().id("INVINCIBLE_VISITORS").icon(Material.DIAMOND_CHESTPLATE).type(Type.MENU) public static final Flag INVINCIBLE_VISITORS = new FlagBuilder().id("INVINCIBLE_VISITORS").icon(Material.DIAMOND_CHESTPLATE).type(Type.WORLD_SETTING)
.listener(ilv).onClick(ilv).build(); .listener(ilv).onClick(ilv).subPanel(true).build();
public static final Flag REMOVE_MOBS = new FlagBuilder().id("REMOVE_MOBS").icon(Material.GLOWSTONE_DUST).type(Type.WORLD_SETTING) public static final Flag REMOVE_MOBS = new FlagBuilder().id("REMOVE_MOBS").icon(Material.GLOWSTONE_DUST).type(Type.WORLD_SETTING)
.listener(new RemoveMobsListener()).allowedByDefault(true).onClick(new WorldToggleClickListener("REMOVE_MOBS")).build(); .listener(new RemoveMobsListener()).allowedByDefault(true).onClick(new WorldToggleClickListener("REMOVE_MOBS")).build();

View File

@ -1,8 +1,13 @@
package us.tastybento.bskyblock.panels; package us.tastybento.bskyblock.panels;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.Flag;
import us.tastybento.bskyblock.api.panels.PanelItem;
import us.tastybento.bskyblock.api.panels.builders.PanelBuilder; import us.tastybento.bskyblock.api.panels.builders.PanelBuilder;
import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder;
import us.tastybento.bskyblock.api.user.User; import us.tastybento.bskyblock.api.user.User;
/** /**
@ -11,35 +16,49 @@ import us.tastybento.bskyblock.api.user.User;
*/ */
public class SettingsPanel { public class SettingsPanel {
private SettingsPanel() {}
/** /**
* Dynamically creates the panel. * Dynamically creates the panel.
* @param plugin - plugin * @param plugin - plugin
* @param user the User to show the panel to * @param user the User to show the panel to
*/ */
public static void openPanel(BSkyBlock plugin, User user) { public static void openPanel(BSkyBlock plugin, User user, Flag.Type flagType) {
// Make a panel for settings // Create the panel
PanelBuilder panelBuilder = new PanelBuilder() PanelBuilder panelBuilder = new PanelBuilder()
.name(user.getTranslation("protection.panel.title")); .name(user.getTranslation("protection.panel." + flagType.toString() + ".title"))
.size(54);
// Add flags, sorted setupHeader(user, panelBuilder, flagType);
plugin.getFlagsManager().getFlags().stream().filter(f -> !f.getType().equals(Flag.Type.WORLD_SETTING))
.sorted((e1, e2) -> e1.getID().compareTo(e2.getID())).forEach((f -> panelBuilder.item(f.toPanelItem(plugin, user)))); plugin.getFlagsManager().getFlags().stream().filter(f -> f.getType().equals(flagType))
// Make the panel .sorted((e1, e2) -> e1.getID().compareTo(e2.getID())).forEach((f -> panelBuilder.item(f.toPanelItem(plugin, user))));
// Show it to the player
panelBuilder.build().open(user); panelBuilder.build().open(user);
} }
/** private static void setupHeader(User user, PanelBuilder panelBuilder, Flag.Type currentFlagType) {
* Dynamically creates the world settings panel. int slot = 2;
* @param plugin - plugin for (Flag.Type flagType : Flag.Type.values()) {
* @param user the User to show the panel to PanelItem panelItem = new PanelItemBuilder()
*/ .icon(flagType.getIcon())
public static void openWorldSettingsPanel(BSkyBlock plugin, User user) { .name(user.getTranslation("protection.panel." + flagType.toString() + ".title"))
// Make a panel for settings .description(user.getTranslation("protection.panel." + flagType.toString() + ".description"))
PanelBuilder panelBuilder = new PanelBuilder().name(user.getTranslation("protection.panel.world-settings", "[world_name]", plugin.getIWM().getWorldName(user.getWorld()))); .glow(flagType.equals(currentFlagType))
// Add flags, sorted .clickHandler((panel, user1, clickType, slot1) -> {
plugin.getFlagsManager().getFlags().stream().filter(f -> f.getType().equals(Flag.Type.WORLD_SETTING)) if (!flagType.equals(currentFlagType)) {
.sorted((e1, e2) -> e1.getID().compareTo(e2.getID())).forEach((f -> panelBuilder.item(f.toPanelItem(plugin, user)))); openPanel(BSkyBlock.getInstance(), user, flagType);
// Make the panel }
panelBuilder.build().open(user); return true;
})
.build();
panelBuilder.item(slot, panelItem);
slot += 2;
}
while(panelBuilder.nextSlot() < 9) {
panelBuilder.item(new PanelItemBuilder().icon(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 15)).build());
}
} }
} }

View File

@ -78,49 +78,49 @@ public class FlagTest {
@Test @Test
public void testHashCode() { public void testHashCode() {
Flag flag1 = new Flag(null, null, null, false, null, 0, null); Flag flag1 = new Flag(null, null, null, false, null, 0, null, false);
Flag flag2 = new Flag(null, null, null, false, null, 0, null); Flag flag2 = new Flag(null, null, null, false, null, 0, null, false);
assertTrue(flag1.hashCode() == flag2.hashCode()); assertTrue(flag1.hashCode() == flag2.hashCode());
} }
@Test @Test
public void testFlag() { public void testFlag() {
assertNotNull(new Flag(null, null, null, false, null, 0, null)); assertNotNull(new Flag(null, null, null, false, null, 0, null, false));
} }
@Test @Test
public void testGetID() { public void testGetID() {
Flag id = new Flag("id", null, null, false, null, 0, null); Flag id = new Flag("id", null, null, false, null, 0, null, false);
assertEquals("id", id.getID()); assertEquals("id", id.getID());
} }
@Test @Test
public void testGetIcon() { public void testGetIcon() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null, false);
assertEquals(Material.ACACIA_DOOR, id.getIcon()); assertEquals(Material.ACACIA_DOOR, id.getIcon());
} }
@Test @Test
public void testGetListener() { public void testGetListener() {
Listener l = mock(Listener.class); Listener l = mock(Listener.class);
Flag id = new Flag("id", Material.ACACIA_DOOR, l, false, null, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, l, false, null, 0, null, false);
Optional<Listener> ol = Optional.ofNullable(l); Optional<Listener> ol = Optional.ofNullable(l);
assertEquals(ol, id.getListener()); assertEquals(ol, id.getListener());
id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null); id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null, false);
assertEquals(Optional.empty(), id.getListener()); assertEquals(Optional.empty(), id.getListener());
} }
@Test @Test
public void testIsDefaultSetting() { public void testIsDefaultSetting() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null, false);
assertFalse(id.isSetForWorld(mock(World.class))); assertFalse(id.isSetForWorld(mock(World.class)));
id = new Flag("id", Material.ACACIA_DOOR, null, true, null, 0, null); id = new Flag("id", Material.ACACIA_DOOR, null, true, null, 0, null, false);
assertTrue(id.isSetForWorld(mock(World.class))); assertTrue(id.isSetForWorld(mock(World.class)));
} }
@Test @Test
public void testSetDefaultSetting() { public void testSetDefaultSetting() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, null, 0, null, false);
assertFalse(id.isSetForWorld(mock(World.class))); assertFalse(id.isSetForWorld(mock(World.class)));
id.setDefaultSetting(true); id.setDefaultSetting(true);
assertTrue(id.isSetForWorld(mock(World.class))); assertTrue(id.isSetForWorld(mock(World.class)));
@ -131,15 +131,15 @@ public class FlagTest {
@Test @Test
public void testGetType() { public void testGetType() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null, false);
assertEquals(Flag.Type.PROTECTION,id.getType()); assertEquals(Flag.Type.PROTECTION,id.getType());
id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.SETTING, 0, null); id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.SETTING, 0, null, false);
assertEquals(Flag.Type.SETTING,id.getType()); assertEquals(Flag.Type.SETTING,id.getType());
} }
@Test @Test
public void testGetDefaultRank() { public void testGetDefaultRank() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 100, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 100, null, false);
assertEquals(100, id.getDefaultRank()); assertEquals(100, id.getDefaultRank());
} }
@ -147,18 +147,18 @@ public class FlagTest {
@Test @Test
public void testEqualsObject() { public void testEqualsObject() {
Flag flag1 = null; Flag flag1 = null;
Flag flag2 = new Flag(null, null, null, false, null, 0, null); Flag flag2 = new Flag(null, null, null, false, null, 0, null, false);
assertFalse(flag2.equals(null)); assertFalse(flag2.equals(null));
int i = 45; int i = 45;
assertFalse(flag2.equals(i)); assertFalse(flag2.equals(i));
flag1 = new Flag(null, null, null, false, null, 0, null); flag1 = new Flag(null, null, null, false, null, 0, null, false);
flag2 = flag1; flag2 = flag1;
assertTrue(flag1.equals(flag2)); assertTrue(flag1.equals(flag2));
assertTrue(flag2.equals(flag1)); assertTrue(flag2.equals(flag1));
flag2 = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null); flag2 = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null, false);
assertFalse(flag1.equals(flag2)); assertFalse(flag1.equals(flag2));
assertFalse(flag2.equals(flag1)); assertFalse(flag2.equals(flag1));
@ -201,7 +201,7 @@ public class FlagTest {
when(rm.getRank(Mockito.eq(RanksManager.VISITOR_RANK))).thenReturn("Visitor"); when(rm.getRank(Mockito.eq(RanksManager.VISITOR_RANK))).thenReturn("Visitor");
when(rm.getRank(Mockito.eq(RanksManager.OWNER_RANK))).thenReturn("Owner"); when(rm.getRank(Mockito.eq(RanksManager.OWNER_RANK))).thenReturn("Owner");
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null, false);
PanelItem pi = id.toPanelItem(plugin, user); PanelItem pi = id.toPanelItem(plugin, user);
@ -214,14 +214,14 @@ public class FlagTest {
@Test @Test
public void testToString() { public void testToString() {
Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null); Flag id = new Flag("id", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null, false);
assertEquals("Flag [id=id, icon=ACACIA_DOOR, listener=null, type=PROTECTION, defaultSetting=false, defaultRank=0, clickHandler=null]", id.toString()); assertEquals("Flag [id=id, icon=ACACIA_DOOR, listener=null, type=PROTECTION, defaultSetting=false, defaultRank=0, clickHandler=null, subPanel=false]", id.toString());
} }
@Test @Test
public void testCompareTo() { public void testCompareTo() {
Flag aaa = new Flag("AAA", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null); Flag aaa = new Flag("AAA", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null, false);
Flag bbb = new Flag("BBB", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null); Flag bbb = new Flag("BBB", Material.ACACIA_DOOR, null, false, Flag.Type.PROTECTION, 0, null, false);
assertTrue(aaa.compareTo(bbb) < bbb.compareTo(aaa)); assertTrue(aaa.compareTo(bbb) < bbb.compareTo(aaa));
assertTrue(aaa.compareTo(aaa) == 0); assertTrue(aaa.compareTo(aaa) == 0);
} }