From bd0b42fe82248ade513025ff0e764d35ce0badb1 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:23:41 +0100 Subject: [PATCH 001/117] Added Platform enum --- .../com/wolfyscript/utilities/Platform.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/Platform.java diff --git a/src/main/java/com/wolfyscript/utilities/Platform.java b/src/main/java/com/wolfyscript/utilities/Platform.java new file mode 100644 index 000000000..028d64a8a --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/Platform.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities; + +public enum Platform { + + SPIGOT, + PAPER, + SPONGE + +} From d10d52e00868cf67dbaac526a5be05f412a094fa Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:24:01 +0100 Subject: [PATCH 002/117] Added Platform getter to WolfyCore --- src/main/java/com/wolfyscript/utilities/common/WolfyCore.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java b/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java index 1aebe07ca..7b026cba6 100644 --- a/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java +++ b/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java @@ -19,6 +19,7 @@ package com.wolfyscript.utilities.common; import com.fasterxml.jackson.databind.ObjectMapper; +import com.wolfyscript.utilities.Platform; import com.wolfyscript.utilities.common.chat.Chat; import com.wolfyscript.utilities.common.registry.Registries; import org.reflections.Reflections; @@ -38,4 +39,6 @@ public interface WolfyCore { Reflections getReflections(); Registries getRegistries(); + + Platform getPlatform(); } From b45d2d6ccf889044066732ddb04265976265f279 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:28:30 +0100 Subject: [PATCH 003/117] Renamed GUIInteractionDetails to InteractionDetails. * Renamed ButtonInteractionResult to InteractionResult --- ...tails.java => ClickInteractionDetails.java} | 2 +- ...etails.java => DragInteractionDetails.java} | 2 +- .../common/gui/GUIInteractionDetails.java | 9 --------- .../common/gui/InteractionDetails.java | 10 ++++++++++ ...ctionResult.java => InteractionResult.java} | 18 +++++++++--------- 5 files changed, 21 insertions(+), 20 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{GUIClickInteractionDetails.java => ClickInteractionDetails.java} (72%) rename src/main/java/com/wolfyscript/utilities/common/gui/{GUIDragInteractionDetails.java => DragInteractionDetails.java} (65%) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GUIInteractionDetails.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java rename src/main/java/com/wolfyscript/utilities/common/gui/{ButtonInteractionResult.java => InteractionResult.java} (72%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GUIClickInteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java similarity index 72% rename from src/main/java/com/wolfyscript/utilities/common/gui/GUIClickInteractionDetails.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java index 245bf92d9..b38a536aa 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GUIClickInteractionDetails.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java @@ -1,6 +1,6 @@ package com.wolfyscript.utilities.common.gui; -public interface GUIClickInteractionDetails extends GUIInteractionDetails { +public interface ClickInteractionDetails extends InteractionDetails { boolean isShift(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GUIDragInteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java similarity index 65% rename from src/main/java/com/wolfyscript/utilities/common/gui/GUIDragInteractionDetails.java rename to src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java index ba089c767..46663bf1d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GUIDragInteractionDetails.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java @@ -2,7 +2,7 @@ import java.util.Set; -public interface GUIDragInteractionDetails extends GUIInteractionDetails { +public interface DragInteractionDetails extends InteractionDetails { Set getInventorySlots(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GUIInteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/GUIInteractionDetails.java deleted file mode 100644 index 7e43063b0..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GUIInteractionDetails.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.wolfyscript.utilities.common.gui; - -public interface GUIInteractionDetails { - - boolean isCancelled(); - - ButtonInteractionResult.ResultType getResultType(); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java new file mode 100644 index 000000000..553572349 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java @@ -0,0 +1,10 @@ +package com.wolfyscript.utilities.common.gui; + +public interface InteractionDetails { + + boolean isCancelled(); + + InteractionResult.ResultType getResultType(); + + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonInteractionResult.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionResult.java similarity index 72% rename from src/main/java/com/wolfyscript/utilities/common/gui/ButtonInteractionResult.java rename to src/main/java/com/wolfyscript/utilities/common/gui/InteractionResult.java index b83dd7851..667bb3a20 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonInteractionResult.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionResult.java @@ -1,14 +1,14 @@ package com.wolfyscript.utilities.common.gui; -public class ButtonInteractionResult { +public class InteractionResult { private ResultType type; - ButtonInteractionResult() { + InteractionResult() { type = ResultType.DEFAULT; } - ButtonInteractionResult(ResultType type) { + InteractionResult(ResultType type) { this.type = type; } @@ -28,18 +28,18 @@ public void setType(ResultType type) { this.type = type; } - public static ButtonInteractionResult cancel(boolean cancelled) { - ButtonInteractionResult result = new ButtonInteractionResult(); + public static InteractionResult cancel(boolean cancelled) { + InteractionResult result = new InteractionResult(); result.setCancelled(cancelled); return result; } - public static ButtonInteractionResult def() { - return new ButtonInteractionResult(); + public static InteractionResult def() { + return new InteractionResult(); } - public static ButtonInteractionResult type(ResultType type) { - return new ButtonInteractionResult(type); + public static InteractionResult type(ResultType type) { + return new InteractionResult(type); } public enum ResultType { From 38a6081aecf291556b93ca34f7600a7a2e238df2 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:33:03 +0100 Subject: [PATCH 004/117] Added abstract Data class --- .../utilities/common/gui/Data.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Data.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Data.java b/src/main/java/com/wolfyscript/utilities/common/gui/Data.java new file mode 100644 index 000000000..eaa7fa558 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Data.java @@ -0,0 +1,24 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +/** + * Data object that can be extended to store custom data for GUI Views.
+ */ +public abstract class Data { } From 2e554af2fa919fb652e8008591936ccbfeea4508 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:34:17 +0100 Subject: [PATCH 005/117] Added ItemStack methods * This should allow for access to NBT etc. of stacks in common implementations in the future. --- .../utilities/common/adapters/ItemStack.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/adapters/ItemStack.java b/src/main/java/com/wolfyscript/utilities/common/adapters/ItemStack.java index 2e0fa5f08..8146a19b4 100644 --- a/src/main/java/com/wolfyscript/utilities/common/adapters/ItemStack.java +++ b/src/main/java/com/wolfyscript/utilities/common/adapters/ItemStack.java @@ -18,10 +18,33 @@ package com.wolfyscript.utilities.common.adapters; +import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.common.items.ItemStackConfig; + public interface ItemStack { - Item getItem(); + /** + * The id representing the item of this ItemStack.
+ * Usually e.g.
minecraft:<item_id>
+ * + * @return The id of the item. + */ + NamespacedKey getItem(); + /** + * The stack amount of this ItemStack. + * + * @return The stack amount. + */ int getAmount(); + /** + * Creates a snapshot of the whole ItemStack including the full NBT.
+ * This can be quite resource heavy!
+ * The snapshot can be simply written to json using the Json mapper of WolfyUtils. + * + * @return The snapshot ItemStack config of this ItemStack. + */ + ItemStackConfig snapshot(); + } From c3ea8dce4cddb41d9db36aaa4c9f992d79c65a5f Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:37:39 +0100 Subject: [PATCH 006/117] Added Component, ComponentState and various other GUI lifecycle interfaces. --- .../utilities/common/gui/Component.java | 190 ++++++++++++++++++ .../utilities/common/gui/ComponentState.java | 114 +++++++++++ .../utilities/common/gui/GuiHolder.java | 27 +++ .../utilities/common/gui/GuiViewManager.java | 44 ++++ .../common/gui/InteractionCallback.java | 26 +++ .../common/gui/InteractionPostCallback.java | 25 +++ .../utilities/common/gui/RenderCallback.java | 26 +++ .../utilities/common/gui/RenderContext.java | 28 +++ .../common/gui/RenderPreCallback.java | 26 +++ 9 files changed, 506 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Component.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java new file mode 100644 index 000000000..ca00cb667 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -0,0 +1,190 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Deque; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; + +public interface Component { + + /** + * Gets the unique id (in context of the parent) of this component. + * + * @return The id of this component. + */ + String getID(); + + /** + * Gets the global WolfyUtils instance, this component belongs to. + * + * @return The WolfyUtils API instance. + */ + WolfyUtils getWolfyUtils(); + + /** + * The children of this Component; or an empty Set if there are no children. + * + * @return The child Components of this Component. + */ + Set> children(); + + /** + * The parent of this Component, or null if it is a root Component. + * + * @return The parent; or null if root Component. + */ + Component parent(); + + /** + * + * @param path + * @return + */ + default Optional> getChild(String... path) { + if (path == null || path.length == 0) return Optional.of(this); + return getChild(path[0]).flatMap(component -> component.getChild(Arrays.copyOfRange(path, 1, path.length))); + } + + Optional> getChild(String id); + + /** + * The state of this Component for the specified + * {@link GuiHolder } (e.g. Data, Permission, etc.) + * + * @param holder The holder to select the state for. + * @return The selected state for the holder. + */ + ComponentState getState(GuiHolder holder); + + /** + * Called when the Component is initialised. + * + */ + void init(); + + default Deque> getPathToRoot() { + if (parent() == null) return new ArrayDeque<>(); + Deque> path = parent().getPathToRoot(); + path.add(parent()); + return path; + } + + /** + * Called when an interaction occurs inside the Component.
+ * This may be called if a child Component is interacted with, for example a Button will cause this interaction to
+ * propagate from the root Cluster, down the Windows to the Button that caused the interaction to be called.
+ *
+ * For this behaviour any implementation must first call the parent interaction, before continuing.
+ * Only if there is no parent available (root Component) it continues, going back to the interaction cause.
+ * + * @param holder The holder that caused the interaction. + * @param data The data of the handler (for convenience) + * @param interactionDetails The details about the interaction. + * @return The interaction result. + */ + default InteractionResult interact(GuiHolder holder, D data, InteractionDetails interactionDetails) { + if (parent() != null) { + InteractionResult result = parent().interact(holder, data, interactionDetails); + if (result.isCancelled()) return result; + } + return getState(holder).interactCallback().interact(holder, data, this, interactionDetails); + } + + /** + * Called after the interaction was completed.
+ * + * @param holder The holder that caused the interaction. + * @param data The data of the handler (for convenience) + * @param interactionDetails The details about the interaction. + */ + default void postInteract(GuiHolder holder, D data, InteractionDetails interactionDetails) { + if (parent() != null) parent().postInteract(holder, data, interactionDetails); + getState(holder).interactPostCallback().run(holder, data, this, interactionDetails); + } + + default void preRender(GuiHolder holder, D data) { + if (parent() != null) parent().preRender(holder, data); + } + + /** + * Called whenever a Component is rendered. + * + * @param holder + * @param data + * @param context + */ + default void render(GuiHolder holder, D data, RenderContext context) { + if (parent() != null) parent().render(holder, data, context); + getState(holder).renderCallback().render(holder, data, this, context); + } + + /** + * Builder used to create Components.
+ * A Builder should always be preferred over creating Components via constructor. + * + * @param + * @param + */ + interface Builder, CB extends ChildComponentBuilder> { + + /** + * Specifies the StateSelector to use to select the Components state based on + * current data and holder. + * + * @param stateSelector The state selector to use. + * @return This builder for chaining. + */ + Builder stateSelector(StateSelector stateSelector); + + /** + * Specifies the state of the Component.
+ * Depending on the owning Component this may set or add the state.
+ * For example, some Components can have multiple states that are selected using the state selector specified using {@link #stateSelector(StateSelector)}.
+ * In these cases the states are added in the order of invocations of this method.
+ *
+ * The consumer must not call {@link ComponentState.Builder#create()} as that is handled by the implementation of this builder! + * + * @param builderConsumer The consumer that provides an instance of a new {@link ComponentState.Builder} + * @return This builder for chaining. + */ + Builder state(Consumer>> builderConsumer); + + /** + * The ChildComponentBuilder is used to create and register + * child Components for this Component. + * + * @return The ChildComponentBuilder of this Component. + */ + Component.Builder children(Consumer childComponentBuilder); + + /** + * Creates the Component this builder belongs to. + * + * @return The new instance of the Component. + */ + C create(); + + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java new file mode 100644 index 000000000..228e48e7e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java @@ -0,0 +1,114 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +/** + *

+ * The State represents a State of a Component, that handles the functionality of the Component.
+ * It provides several runtime callbacks that are called whenever an interaction or render request occurs. + *

+ *

+ * For example inside Windows and Buttons these States are used to draw the proper icons and textures of the GUI and handle the interactions and data manipulation. + *
+ * Buttons like ToggleButtons use two states, and can sync it to the provided data ({@link D}) using the {@link StateSelector}. + *

+ *

+ * The State of a Component is independent of its children and won't change if a children changes its state.
+ * Instead, the state is selected based on the data of the {@link GuiViewManager} each time an update occurs. + *

+ * + * @param The type of data. + */ +public interface ComponentState { + + /** + * The key of the state. This is mostly used for translations.
+ * By default, it is the same as the owner Component. + * But it can be different or a sub key from the owner key. + * + * @return The key of the state. + */ + String key(); + + /** + * Called whenever an interaction occurs.
+ * This propagates from the root Component to the Component that caused the interaction. + * + * @return The interaction callback + */ + InteractionCallback interactCallback(); + + /** + * Called after each interaction. + * This propagates from the root Component to the Component that caused the interaction. + * This is called before the interaction of the child Component. + * + * @return The post interact callback + */ + InteractionPostCallback interactPostCallback(); + + /** + * Called before each render. + * + * + * @return + */ + RenderPreCallback renderPreCallback(); + + /** + * Called each time the Component or a child Component is rendered in the GUI. + * + * + * @return + */ + RenderCallback renderCallback(); + + interface Builder> { + + /** + * Specifies the sub key of the state relative to the owner key or previously specified key or subKey, separated by a dot ('.'). + * These keys are used as language keys to lookup translations in the lang files. + * + * @param subKey The sub key of this state. + * @return This Builder for chaining. + */ + Builder subKey(String subKey); + + /** + * Specifies the key of the state. + * These keys are used as language keys to lookup translations in the lang files. + * + * @param key The key of this state. + * @return This Builder for chaining. + */ + Builder key(String key); + + Builder interact(InteractionCallback interactionCallback); + + Builder interactPost(InteractionPostCallback interactPostCallback); + + Builder renderPre(RenderPreCallback renderPreCallback); + + Builder render(RenderCallback renderCallback); + + S create(); + + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java new file mode 100644 index 000000000..09a420f58 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface GuiHolder { + + GuiViewManager getHandler(); + + Window getCurrentWindow(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java new file mode 100644 index 000000000..d73e5af1e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -0,0 +1,44 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +public interface GuiViewManager { + + void openNew(String... path); + + void openNew(); + + void openPrevious(); + + D getData(); + + Cluster getRoot(); + + Optional> getCurrentMenu(); + + Set getViewers(); + + WolfyUtils getWolfyUtils(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java new file mode 100644 index 000000000..f02f71692 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java @@ -0,0 +1,26 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +@FunctionalInterface +public interface InteractionCallback { + + InteractionResult interact(GuiHolder holder, D data, Component component, InteractionDetails details); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java new file mode 100644 index 000000000..fed609ded --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java @@ -0,0 +1,25 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +@FunctionalInterface +public interface InteractionPostCallback { + + void run(GuiHolder holder, D data, Component component, InteractionDetails details); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java new file mode 100644 index 000000000..31aff56d4 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java @@ -0,0 +1,26 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +@FunctionalInterface +public interface RenderCallback { + + void render(GuiHolder holder, D data, Component component, RenderContext context); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java new file mode 100644 index 000000000..cd11bc512 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -0,0 +1,28 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +/** + * The data that contains all the information needed to render the Menu. + * + * @param + */ +public interface RenderContext { + //TODO +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java new file mode 100644 index 000000000..3ff5cdf33 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java @@ -0,0 +1,26 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +@FunctionalInterface +public interface RenderPreCallback { + + void run(GuiHolder holder, D data, Component component, RenderContext context); + +} From 6c55f4dd7ce3409b33290507d18fa44917dbbf65 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:40:08 +0100 Subject: [PATCH 007/117] Added StateSelector to select states of Components --- .../utilities/common/gui/StateSelector.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java b/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java new file mode 100644 index 000000000..fd202aeca --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java @@ -0,0 +1,25 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface StateSelector { + + int run(GuiHolder holder, D data, Component component); + +} From b8872a31d273b71c85f7da50397856037bbd5729 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:41:30 +0100 Subject: [PATCH 008/117] Added other types of Components --- .../utilities/common/gui/AreaComponent.java | 23 ++++++++++++ .../utilities/common/gui/Cluster.java | 35 +++++++++++++++++++ .../utilities/common/gui/MenuComponent.java | 29 +++++++++++++++ .../utilities/common/gui/SlotComponent.java | 34 ++++++++++++++++++ .../utilities/common/gui/Window.java | 30 ++++++++++++++++ 5 files changed, 151 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Window.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java new file mode 100644 index 000000000..64cdcde4e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java @@ -0,0 +1,23 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface AreaComponent extends SlotComponent { + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java b/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java new file mode 100644 index 000000000..0c6d60ee5 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java @@ -0,0 +1,35 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.Set; + +public interface Cluster extends MenuComponent { + + MenuComponent entry(); + + @Override + Cluster parent(); + + @Override + Set> children(); + + Class dataType(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java new file mode 100644 index 000000000..8cbbe0703 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java @@ -0,0 +1,29 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.UUID; + +public interface MenuComponent extends Component { + + @Override + MenuComponent parent(); + + void open(GuiViewManager guiHandler, UUID uuid); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java new file mode 100644 index 000000000..c43c2594f --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java @@ -0,0 +1,34 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.Set; + +public interface SlotComponent extends Component { + + @Override + Set> children(); + + int position(); + + int width(); + + int height(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java new file mode 100644 index 000000000..c83c8c90d --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -0,0 +1,30 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.Set; + +public interface Window extends MenuComponent { + + @Override + MenuComponent parent(); + + @Override + Set> children(); +} From 857f1cb9ea3df605f95615f9561a78746256a3ca Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:42:52 +0100 Subject: [PATCH 009/117] Added ChildComponentBuilder and Cluster and Window builders --- .../common/gui/ChildComponentBuilder.java | 31 ++++++++++++++++++ .../gui/ClusterChildComponentBuilder.java | 32 +++++++++++++++++++ .../common/gui/ClusterComponentBuilder.java | 25 +++++++++++++++ .../gui/WindowChildComponentBuilder.java | 27 ++++++++++++++++ .../common/gui/WindowComponentBuilder.java | 23 +++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java new file mode 100644 index 000000000..1920c1703 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java @@ -0,0 +1,31 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.collect.BiMap; +import com.wolfyscript.utilities.NamespacedKey; +import java.util.function.Consumer; + +public interface ChildComponentBuilder { + + // TODO: This needs proper testing + > ChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer); + + BiMap> create(); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java new file mode 100644 index 000000000..09f8cf3c3 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java @@ -0,0 +1,32 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.collect.BiMap; +import java.util.function.Consumer; + +public interface ClusterChildComponentBuilder extends ChildComponentBuilder { + + ClusterChildComponentBuilder window(String id, Consumer> builderConsumer); + + ClusterChildComponentBuilder cluster(String id, Consumer> builderConsumer); + + @Override + BiMap> create(); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java new file mode 100644 index 000000000..d8ce619f9 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java @@ -0,0 +1,25 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface ClusterComponentBuilder extends Component.Builder, ClusterChildComponentBuilder> { + + ClusterComponentBuilder entry(String subID); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java new file mode 100644 index 000000000..2286e0901 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.collect.BiMap; + +public interface WindowChildComponentBuilder extends ChildComponentBuilder { + + @Override + BiMap> create(); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java new file mode 100644 index 000000000..23c60a852 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java @@ -0,0 +1,23 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface WindowComponentBuilder extends Component.Builder, WindowChildComponentBuilder> { + +} From 1b63689b54c67c829668d86bbef99c09b19f8c6c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 19:48:52 +0100 Subject: [PATCH 010/117] Added GuiAPIManager --- .../utilities/common/WolfyUtils.java | 3 ++ .../utilities/common/gui/GuiAPIManager.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java diff --git a/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java b/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java index 02eef6276..6d4ca19ed 100644 --- a/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java +++ b/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIncludeProperties; import com.wolfyscript.utilities.common.chat.Chat; +import com.wolfyscript.utilities.common.gui.GuiAPIManager; import com.wolfyscript.utilities.common.json.jackson.MapperUtil; import com.wolfyscript.utilities.common.registry.Registries; import java.util.logging.Logger; @@ -68,6 +69,8 @@ public static boolean isProdEnv() { public abstract Identifiers getIdentifiers(); + public abstract GuiAPIManager getGUIManager(); + public Registries getRegistries() { return getCore().getRegistries(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java new file mode 100644 index 000000000..7790dd890 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -0,0 +1,32 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.UUID; +import java.util.function.Consumer; + +public interface GuiAPIManager { + + void registerCluster(String id, Class dataType, Consumer> clusterBuilderConsumer); + + GuiViewManager createView(String clusterId, Class dataType, UUID... viewers); + + GuiViewManager createViewAndOpen(String clusterID, Class dataType, UUID... players); + +} From 0091e8cd33c3b51ef2ed13b8d3e859e00a814174 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 20:40:07 +0100 Subject: [PATCH 011/117] Added default ButtonState implementation --- .../common/gui/ComponentStateDefault.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java new file mode 100644 index 000000000..4797ecc03 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java @@ -0,0 +1,124 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.base.Preconditions; +import java.util.Objects; + +public class ComponentStateDefault implements ComponentState { + + private final String key; + private final InteractionCallback interactionCallback; + private final InteractionPostCallback interactPostCallback; + private final RenderPreCallback renderPreCallback; + private final RenderCallback renderCallback; + + protected ComponentStateDefault(String key, InteractionCallback interactionCallback, InteractionPostCallback interactPostCallback, RenderPreCallback renderPreCallback, RenderCallback renderCallback) { + this.key = key; + this.interactionCallback = interactionCallback; + this.interactPostCallback = interactPostCallback; + this.renderPreCallback = renderPreCallback; + this.renderCallback = renderCallback; + } + + @Override + public InteractionCallback interactCallback() { + return interactionCallback; + } + + @Override + public InteractionPostCallback interactPostCallback() { + return interactPostCallback; + } + + @Override + public RenderCallback renderCallback() { + return renderCallback; + } + + @Override + public RenderPreCallback renderPreCallback() { + return renderPreCallback; + } + + @Override + public String key() { + return key; + } + + public static class Builder implements ComponentState.Builder> { + + private String key; + private InteractionCallback interactionCallback; + private InteractionPostCallback interactPostCallback; + private RenderPreCallback renderPreCallback; + private RenderCallback renderCallback; + + protected Builder(String ownerID) { + this.key = ownerID; + } + + @Override + public Builder subKey(String subKey) { + this.key += "." + subKey; + return this; + } + + @Override + public Builder key(String key) { + this.key = key; + return this; + } + + @Override + public Builder interact(InteractionCallback interactionCallback) { + this.interactionCallback = interactionCallback; + return this; + } + + @Override + public Builder interactPost(InteractionPostCallback interactPostCallback) { + this.interactPostCallback = interactPostCallback; + return this; + } + + @Override + public Builder renderPre(RenderPreCallback renderPreCallback) { + this.renderPreCallback = renderPreCallback; + return null; + } + + @Override + public Builder render(RenderCallback renderCallback) { + this.renderCallback = renderCallback; + return null; + } + + @Override + public ComponentStateDefault create() { + Preconditions.checkNotNull(renderCallback, "Cannot create Component without a RenderCallback!"); + final var interactCallback = Objects.requireNonNullElseGet(this.interactionCallback, () -> (holder, data, component, details) -> InteractionResult.def()); + final var interactPostCallback = Objects.requireNonNullElseGet(this.interactPostCallback, () -> (holder, data, component, details) -> {}); + final var renderPreCallback = Objects.requireNonNullElseGet(this.renderPreCallback, () -> (holder, data, component, context) -> {}); + final var renderCallback = Objects.requireNonNullElseGet(this.renderCallback, () -> (holder, data, component, context) -> {}); + + return new ComponentStateDefault<>(key, interactCallback, interactPostCallback, renderPreCallback, renderCallback); + } + } + } From 5af3dc0f6d7e4c29c5a0c75147f8b6ba0999edfb Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 20:40:51 +0100 Subject: [PATCH 012/117] Added Cluster and Window common implementation --- .../common/gui/ClusterCommonImpl.java | 231 ++++++++++++++++++ .../common/gui/WindowCommonImpl.java | 165 +++++++++++++ 2 files changed, 396 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java new file mode 100644 index 000000000..f534c04b1 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java @@ -0,0 +1,231 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; + +public abstract class ClusterCommonImpl implements Cluster { + + private final WolfyUtils wolfyUtils; + private final Cluster parent; + private final ComponentState[] states; + private final StateSelector stateSelector; + private final String id; + private final MenuComponent entry; + private final Class dataType; + private final BiMap> children; + + protected ClusterCommonImpl(String id, Class dataType, WolfyUtils wolfyUtils, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry) { + Preconditions.checkNotNull(id); + Preconditions.checkNotNull(stateSelector); + Preconditions.checkNotNull(dataType); + Preconditions.checkNotNull(wolfyUtils); + Preconditions.checkNotNull(entry, "Cluster must have an entry Component!"); + Preconditions.checkArgument(states != null && states.length > 0, "ComponentStates cannot be null or empty!"); + this.parent = parent; + this.dataType = dataType; + this.wolfyUtils = wolfyUtils; + this.id = id; + this.stateSelector = stateSelector; + this.states = states; + this.children = HashBiMap.create(children); + this.entry = entry; + } + + protected ClusterCommonImpl(String id, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry) { + this(id, parent.dataType(), parent.getWolfyUtils(), parent, stateSelector, states, children, entry); + } + + protected ClusterCommonImpl(String id, WolfyUtils wolfyUtils, Class dataType, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry) { + this(id, dataType, wolfyUtils, null, stateSelector, states, children, entry); + } + + @Override + public String getID() { + return id; + } + + @Override + public WolfyUtils getWolfyUtils() { + return wolfyUtils; + } + + @Override + public Set> children() { + return children.values(); + } + + @Override + public Class dataType() { + return dataType; + } + + @Override + public Cluster parent() { + return parent; + } + + @Override + public void open(GuiViewManager viewManager, UUID player) { + // Redirect and open the entry component + entry().open(viewManager, player); + } + + @Override + public Optional> getChild(String id) { + return Optional.ofNullable(children.get(id)); + } + + @Override + public ComponentState getState(GuiHolder holder) { + return states[stateSelector.run(holder, holder.getHandler().getData(), this)]; + } + + @Override + public void init() { + + } + + @Override + public MenuComponent entry() { + return entry; + } + + public static abstract class Builder implements ClusterComponentBuilder { + + private final String subID; + private String entryID; + private final WolfyUtils wolfyUtils; + private final Cluster parent; + private final Class dataType; + private final List>> stateBuilders = new ArrayList<>(); + private final ClusterChildComponentBuilder childComponentBuilder; + private StateSelector stateSelector; + + protected Builder(String subID, Cluster parent, ClusterChildComponentBuilder childComponentBuilder) { + Preconditions.checkNotNull(subID); + this.wolfyUtils = parent.getWolfyUtils(); + this.parent = parent; + this.dataType = parent.dataType(); + this.subID = subID; + this.childComponentBuilder = childComponentBuilder; + } + + @Override + public final ClusterComponentBuilder stateSelector(StateSelector stateSelector) { + this.stateSelector = stateSelector; + return this; + } + + public final ClusterComponentBuilder state(Consumer>> stateBuilderConsumer) { + ComponentState.Builder> stateBuilder = new ComponentStateDefault.Builder<>(subID); + stateBuilderConsumer.accept(stateBuilder); + stateBuilders.add(stateBuilder); + return this; + } + + @Override + public ClusterComponentBuilder children(Consumer> childComponentBuilderConsumer) { + childComponentBuilderConsumer.accept(this.childComponentBuilder); + return this; + } + + @Override + public ClusterComponentBuilder entry(String subID) { + this.entryID = subID; + return this; + } + + @Override + public final Cluster create() { + BiMap> children = childComponentBuilder.create(); + Preconditions.checkState(!children.isEmpty(), "Cannot create Cluster without child Components!"); + // Either use explicitly specified entry, or implicitly select it. + MenuComponent entry; + if (entryID != null) { + entry = children.get(entryID); + Preconditions.checkState(entry != null, "Cannot find entry Component! Please check the explicitly specified entry id!"); + } else { + entry = children.values().stream().findFirst().orElseThrow(); + } + return constructImplementation(subID, dataType, wolfyUtils, parent, + stateSelector == null ? (holder, data, component) -> 0 : stateSelector, + stateBuilders.stream().map(ComponentState.Builder::create).>toArray(ComponentState[]::new), + children, + entry + ); + } + + protected abstract Cluster constructImplementation(String subID, Class dataType, WolfyUtils wolfyUtils, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry); + + } + + public static abstract class ChildBuilder implements ClusterChildComponentBuilder { + + private final Cluster parent; + private final BiMap> children = HashBiMap.create(); + + protected ChildBuilder(Cluster parent) { + this.parent = parent; + } + + @Override + public > ClusterChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { + // TODO + return this; + } + + @Override + public ClusterChildComponentBuilder window(String id, Consumer> windowComponentBuilderConsumer) { + var windowBuilder = constructWindowBuilderImpl(id, parent); + windowComponentBuilderConsumer.accept(windowBuilder); + var window = windowBuilder.create(); + children.put(id, window); + return this; + } + + @Override + public ClusterChildComponentBuilder cluster(String id, Consumer> clusterComponentBuilderConsumer) { + ClusterComponentBuilder clusterBuilder = constructClusterBuilderImpl(id, parent); + clusterComponentBuilderConsumer.accept(clusterBuilder); + var cluster = clusterBuilder.create(); + children.put(id, cluster); + return this; + } + + @Override + public BiMap> create() { + return children; + } + + protected abstract ClusterComponentBuilder constructClusterBuilderImpl(String id, Cluster parent); + + protected abstract WindowComponentBuilder constructWindowBuilderImpl(String id, Cluster parent); + } +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java new file mode 100644 index 000000000..a76d68531 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java @@ -0,0 +1,165 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; + +public abstract class WindowCommonImpl implements Window { + + private final WolfyUtils wolfyUtils; + private final String id; + private final MenuComponent parent; + private final ComponentState[] states; + private final StateSelector stateSelector; + private final BiMap> children; + + protected WindowCommonImpl(String id, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children) { + this.id = id; + this.parent = parent; + this.wolfyUtils = parent.getWolfyUtils(); + this.stateSelector = stateSelector; + this.states = states; + this.children = HashBiMap.create(children); + } + + @Override + public WolfyUtils getWolfyUtils() { + return wolfyUtils; + } + + @Override + public String getID() { + return id; + } + + @Override + public Set> children() { + return children.values(); + } + + @Override + public MenuComponent parent() { + return parent; + } + + @Override + public Optional> getChild(String id) { + return Optional.ofNullable(children.get(id)); + } + + @Override + public ComponentState getState(GuiHolder holder) { + return states[stateSelector.run(holder, holder.getHandler().getData(), this)]; + } + + public net.kyori.adventure.text.Component onUpdateTitle(GuiHolder holder) { + return null; + } + + @Override + public void init() { + + } + + @Override + public void open(GuiViewManager handler, UUID player) { + // This is the final destination and can be opened + // Start rendering here + + + } + + public static abstract class Builder implements WindowComponentBuilder { + + protected final String subID; + protected final Cluster parent; + protected StateSelector stateSelector; + protected final List>> stateBuilders = new ArrayList<>(); + protected final WindowChildComponentBuilder childComponentBuilder; + + Builder(String subID, Cluster parent) { + this.subID = subID; + this.parent = parent; + this.childComponentBuilder = new ChildBuilder<>(parent); + } + + @Override + public Builder stateSelector(StateSelector stateSelector) { + this.stateSelector = stateSelector; + return this; + } + + @Override + public Builder state(Consumer>> stateBuilderConsumer) { + ComponentState.Builder> stateBuilder = new ComponentStateDefault.Builder<>(subID); + stateBuilderConsumer.accept(stateBuilder); + stateBuilders.add(stateBuilder); + return this; + } + + @Override + public Builder children(Consumer> childComponentBuilderConsumer) { + childComponentBuilderConsumer.accept(childComponentBuilder); + return this; + } + + @Override + public Window create() { + return constructImplementation(parent.getID() + "/" + subID, + parent, + stateSelector == null ? (holder, data, component) -> 0 : stateSelector, + stateBuilders.stream().map(ComponentState.Builder::create).>toArray(ComponentState[]::new), + childComponentBuilder.create() + ); + } + + protected abstract Window constructImplementation(String id, Cluster cluster, StateSelector stateSelector, ComponentState[] states, BiMap> children); + + } + + static class ChildBuilder implements WindowChildComponentBuilder { + + private final Cluster parent; + private final BiMap> children = HashBiMap.create(); + + ChildBuilder(Cluster parent) { + this.parent = parent; + } + + @Override + public > WindowChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { + // TODO + return this; + } + + @Override + public BiMap> create() { + return children; + } + } +} From 50358a8a3e8ac2b5a7f3be1b1068a1ba9de306f1 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 20:41:25 +0100 Subject: [PATCH 013/117] Added GuiAPIManager and GuiViewManager common implementation --- .../common/gui/GuiAPIManagerCommonImpl.java | 51 +++++++++ .../common/gui/GuiViewManagerCommonImpl.java | 100 ++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java new file mode 100644 index 000000000..1aa3033b2 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java @@ -0,0 +1,51 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.UUID; +import java.util.function.Consumer; + +public abstract class GuiAPIManagerCommonImpl implements GuiAPIManager { + + protected final WolfyUtils wolfyUtils; + private final BiMap> clustersMap = HashBiMap.create(); + + public GuiAPIManagerCommonImpl(WolfyUtils wolfyUtils) { + this.wolfyUtils = wolfyUtils; + } + + public abstract void registerCluster(String id, Class dataType, Consumer> clusterBuilderConsumer); + + protected void registerCluster(Cluster cluster) { + Preconditions.checkArgument(!clustersMap.containsKey(cluster.getID()), "A cluster with the id '" + cluster.getID() + "' is already registered!"); + clustersMap.put(cluster.getID(), cluster); + } + + public GuiViewManager createViewAndOpen(String clusterID, Class dataType, UUID... players) { + GuiViewManager handler = createView(clusterID, dataType, players); + handler.openNew(); + return handler; + } + + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java new file mode 100644 index 000000000..34da40951 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -0,0 +1,100 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.TypeLiteral; +import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +public abstract class GuiViewManagerCommonImpl implements GuiViewManager { + + private final WolfyUtils wolfyUtils; + private final Cluster root; + private final Deque> history; + private final Set viewers; + private final D data; + + protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Cluster rootCluster, Set viewers) { + this.wolfyUtils = wolfyUtils; + this.root = rootCluster; + this.history = new ArrayDeque<>(); + this.viewers = viewers; + // Construct custom data instance + Injector injector = Guice.createInjector(binder -> { + binder.bind(WolfyUtils.class).toInstance(wolfyUtils); + binder.bind(Cluster.class).toInstance(root); + binder.bind(new TypeLiteral>(){}).toInstance(this); + binder.bind(new TypeLiteral>(){}).toInstance(viewers); + }); + data = injector.getInstance(rootCluster.dataType()); + } + + public D getData() { + return data; + } + + @Override + public void openNew(String... path) { + root.getChild(path).ifPresent(component -> { + if (component instanceof MenuComponent menu) { + for (UUID viewer : viewers) { + menu.open(this, viewer); + } + history.push(menu); // push the new menu to the history + } else { + throw new IllegalArgumentException("Cannot open non-menu Component!"); + } + }); + } + + @Override + public void openPrevious() { + history.poll(); // Remove active current menu + getCurrentMenu().ifPresent(previous -> { + // Do not add menu to history, as it is already available + viewers.forEach(uuid -> previous.open(this, uuid)); + }); + } + + @Override + public Optional> getCurrentMenu() { + return Optional.ofNullable(history.peek()); + } + + @Override + public WolfyUtils getWolfyUtils() { + return wolfyUtils; + } + + @Override + public Cluster getRoot() { + return root; + } + + @Override + public Set getViewers() { + return Set.copyOf(viewers); + } +} From 2a59c7b8a706f2dd30b26502a61198a52e085ebc Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 3 Jan 2023 20:52:19 +0100 Subject: [PATCH 014/117] Removed Items#getItem --- .../java/com/wolfyscript/utilities/common/adapters/Items.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/adapters/Items.java b/src/main/java/com/wolfyscript/utilities/common/adapters/Items.java index 03a2407b7..af31d8d8c 100644 --- a/src/main/java/com/wolfyscript/utilities/common/adapters/Items.java +++ b/src/main/java/com/wolfyscript/utilities/common/adapters/Items.java @@ -20,6 +20,6 @@ public interface Items { - Item getItem(String key); + } From 14fddab38e43955d0331630f6c7664123e2141a0 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:40:26 +0100 Subject: [PATCH 015/117] Added docs to GuiAPIManager --- .../utilities/common/gui/GuiAPIManager.java | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index 7790dd890..7b5097936 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -18,15 +18,70 @@ package com.wolfyscript.utilities.common.gui; +import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; +/** + * Handles the general GUI API and acts as an entry point to the whole creation of {@link Cluster}s and {@link GuiViewManager}s.
+ * It stores all the registered {@link Cluster}s and allows to register new clusters via builders.
+ * Additionally, it stores the {@link GuiViewManager}s that handle the views for players. + */ public interface GuiAPIManager { + /** + * Registers a new cluster under the given id, using the specified custom {@link Data} type ({@link D}).
+ * The builder consumer provides the newly constructed {@link ClusterComponentBuilder}, which can then be used inside that consumer.
+ * It is not required to call the {@link ClusterComponentBuilder#create()} method, because that is done after the consumer function ends. + * + * @param id The unique id of the cluster to register. + * @param dataType The type of the custom {@link Data} implementation. + * @param clusterBuilderConsumer The consumer that provides the new builder. + * @param The type of the specified data implementation. + */ void registerCluster(String id, Class dataType, Consumer> clusterBuilderConsumer); + /** + * Gets the registered cluster with the specified id.
+ * If the cluster is available it checks if it matches the provided type.
+ * When the type does not match an empty Optional is returned instead. + * + * @param id The id of the cluster. + * @param dataType The type of the cluster. + * @return The registered cluster only if the id and data type matches; otherwise empty Optional. + * @param The type of the data implementation. + */ + Optional> getCluster(String id, Class dataType); + + /** + * Gets the registered cluster with the specified id.
+ * + * @param id The id of the cluster. + * @return The registered cluster only if the id matches; otherwise empty Optional. + */ + Optional> getCluster(String id); + + /** + * Creates a new view for the specified viewers, with the specified cluster as its root.
+ * This gets the registered cluster using {@link #getCluster(String, Class)}. + * + * @param clusterId The id of the root cluster. + * @param dataType The type of the cluster data implementation. + * @param viewers The viewers of this view. + * @return The newly created view. + * @param The type of the data implementation. + */ GuiViewManager createView(String clusterId, Class dataType, UUID... viewers); - GuiViewManager createViewAndOpen(String clusterID, Class dataType, UUID... players); + /** + * Same as {@link #createView(String, Class, UUID...)} and opens the entry menu right after the creation of the view. + * + * @param clusterID The id of the root cluster. + * @param dataType The type of the cluster data implementation. + * @param viewers The viewers of this view. + * @return The newly created view. + * @param The type of the data implementation. + */ + GuiViewManager createViewAndOpen(String clusterID, Class dataType, UUID... viewers); } From 808e72da2539c57fadfc734b9ef5a5c2fa86282a Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:40:53 +0100 Subject: [PATCH 016/117] Implement common methods in GuiAPIManagerCommonImpl --- .../common/gui/GuiAPIManagerCommonImpl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java index 1aa3033b2..246836ca2 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java @@ -22,6 +22,7 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.wolfyscript.utilities.common.WolfyUtils; +import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; @@ -47,5 +48,18 @@ public GuiViewManager createViewAndOpen(String clusterID, Cl return handler; } + @Override + @SuppressWarnings("unchecked") + public Optional> getCluster(String id, Class dataType) { + Cluster cluster = clustersMap.get(id); + if (cluster != null && cluster.dataType().equals(dataType)) { + return Optional.of((Cluster) cluster); // We checked the data type, so we can cast it. + } + return Optional.empty(); + } + @Override + public Optional> getCluster(String id) { + return Optional.of(clustersMap.get(id)); + } } From b8573cf6a26bcd0dc3d4e597e4a1a0fbc9d03b9e Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:42:21 +0100 Subject: [PATCH 017/117] Added docs to GuiViewManager --- .../utilities/common/gui/GuiViewManager.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index d73e5af1e..099a8abcf 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -22,23 +22,78 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; +import org.jetbrains.annotations.NotNull; +/** + * The GuiViewManager, as the name suggests, manages a view of the GUI for one or more players.
+ * It contains the custom Data ({@link D}) object that stores all the required data of this view.
+ * + * The view is immutable, so you need to create a new view each time you need to add a viewer or change the root. + * + * @param The custom data object type. + */ public interface GuiViewManager { + /** + * Opens a new menu under the specific path. + * When the component at the specified path cannot be rendered (is not a window) it'll use the entry of that component. + * + * @param path The path to the menu to open. + */ void openNew(String... path); + /** + * Opens the entry menu of this cluster. + */ void openNew(); + /** + * Opens the currently active menu without updating the history. + */ + void open(); + + /** + * Goes back to the previously opened menu and opens it. + */ void openPrevious(); + /** + * Gets the data object of this view manager. + * + * @return The data of this view manager. + */ + @NotNull D getData(); + /** + * The root cluster of this view manager. + * This is used for methods like {@link #openNew()} to open the entry menu. + * + * @return The root cluster of this view manager. + */ Cluster getRoot(); + /** + * Gets the currently active menu. + * This may be a {@link Window}, {@link Cluster}, or any other {@link MenuComponent}. + * + * @return The currently active menu. + */ Optional> getCurrentMenu(); + /** + * Gets the viewers that are handled by this view manager. + * When using these UUIDS, make sure the associated player is actually online! + * + * @return A Set of the viewers, that are handled by this manager. + */ Set getViewers(); + /** + * The API instance this manager belongs to. + * + * @return The API instance of this manager. + */ WolfyUtils getWolfyUtils(); } From 44ab9105a4237039f0fc89aa8c385c9becd65682 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:43:07 +0100 Subject: [PATCH 018/117] Implement GuiViewManager common methods --- .../common/gui/GuiViewManagerCommonImpl.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java index 34da40951..6ac0ffdcb 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -27,6 +27,7 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; +import org.jetbrains.annotations.NotNull; public abstract class GuiViewManagerCommonImpl implements GuiViewManager { @@ -51,6 +52,7 @@ protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Cluster rootCluster data = injector.getInstance(rootCluster.dataType()); } + @NotNull public D getData() { return data; } @@ -69,6 +71,21 @@ public void openNew(String... path) { }); } + @Override + public void openNew() { + openNew(new String[0]); + } + + @Override + public void open() { + if (history.isEmpty()) { + openNew(); + } else { + MenuComponent component = history.peek(); + viewers.forEach(uuid -> component.open(this, uuid)); + } + } + @Override public void openPrevious() { history.poll(); // Remove active current menu From f07a1fcf27ed80c09d1d2c52259093a5a802b8e5 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:45:30 +0100 Subject: [PATCH 019/117] Added WindowType enum that contains all the possible GUI types. * Note this is more limited than v4, because other types of inventories may contain slots that do not act like normal container slots. --- .../utilities/common/gui/WindowType.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowType.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowType.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowType.java new file mode 100644 index 000000000..83c621c56 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowType.java @@ -0,0 +1,28 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public enum WindowType { + + CUSTOM, + DISPENSER, + DROPPER, + HOPPER + +} From a6d72faae12a5cc8388e6ef0aa11dfecb57c243f Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:46:26 +0100 Subject: [PATCH 020/117] Added type, size and title methods to Window --- .../com/wolfyscript/utilities/common/gui/Window.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index c83c8c90d..141ef55be 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -18,7 +18,9 @@ package com.wolfyscript.utilities.common.gui; +import java.util.Optional; import java.util.Set; +import net.kyori.adventure.text.Component; public interface Window extends MenuComponent { @@ -27,4 +29,11 @@ public interface Window extends MenuComponent { @Override Set> children(); + + Optional getType(); + + Optional getSize(); + + Component createTitle(GuiHolder holder); + } From 70fd0f4db58c2a0c7662e7a60ff5055ce1729c96 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:46:58 +0100 Subject: [PATCH 021/117] Added type and size builder methods to WindowComponentBuilder --- .../utilities/common/gui/WindowComponentBuilder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java index 23c60a852..635caae02 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java @@ -20,4 +20,8 @@ public interface WindowComponentBuilder extends Component.Builder, WindowChildComponentBuilder> { + WindowComponentBuilder size(int size); + + WindowComponentBuilder type(WindowType type); + } From 8cbe6218bc3c64fb246d359326c739855a7a4ac6 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:47:32 +0100 Subject: [PATCH 022/117] Implemented type and size in WindowCommonImpl --- .../common/gui/WindowCommonImpl.java | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java index a76d68531..bd1652113 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import com.google.common.base.Preconditions; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.wolfyscript.utilities.NamespacedKey; @@ -37,14 +38,19 @@ public abstract class WindowCommonImpl implements Window { private final ComponentState[] states; private final StateSelector stateSelector; private final BiMap> children; + private final Integer size; + private final WindowType type; - protected WindowCommonImpl(String id, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children) { + protected WindowCommonImpl(String id, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, Integer size, WindowType type) { this.id = id; this.parent = parent; this.wolfyUtils = parent.getWolfyUtils(); this.stateSelector = stateSelector; this.states = states; this.children = HashBiMap.create(children); + Preconditions.checkArgument(size != null || type != null, "Either type or size must be specified!"); + this.size = size; + this.type = type; } @Override @@ -74,7 +80,17 @@ public Optional> getChild(String id) { @Override public ComponentState getState(GuiHolder holder) { - return states[stateSelector.run(holder, holder.getHandler().getData(), this)]; + return states[stateSelector.run(holder, holder.getViewManager().getData(), this)]; + } + + @Override + public Optional getSize() { + return Optional.ofNullable(size); + } + + @Override + public Optional getType() { + return Optional.ofNullable(type); } public net.kyori.adventure.text.Component onUpdateTitle(GuiHolder holder) { @@ -101,11 +117,25 @@ public static abstract class Builder implements WindowComponentB protected StateSelector stateSelector; protected final List>> stateBuilders = new ArrayList<>(); protected final WindowChildComponentBuilder childComponentBuilder; + protected Integer size; + protected WindowType type; - Builder(String subID, Cluster parent) { + protected Builder(String subID, Cluster parent, WindowChildComponentBuilder childComponentBuilder) { this.subID = subID; this.parent = parent; - this.childComponentBuilder = new ChildBuilder<>(parent); + this.childComponentBuilder = childComponentBuilder; + } + + @Override + public Builder size(int size) { + this.size = size; + return this; + } + + @Override + public Builder type(WindowType type) { + this.type = type; + return this; } @Override @@ -134,20 +164,21 @@ public Window create() { parent, stateSelector == null ? (holder, data, component) -> 0 : stateSelector, stateBuilders.stream().map(ComponentState.Builder::create).>toArray(ComponentState[]::new), - childComponentBuilder.create() + childComponentBuilder.create(), + size, type ); } - protected abstract Window constructImplementation(String id, Cluster cluster, StateSelector stateSelector, ComponentState[] states, BiMap> children); + protected abstract Window constructImplementation(String id, Cluster cluster, StateSelector stateSelector, ComponentState[] states, BiMap> children, Integer size, WindowType type); } - static class ChildBuilder implements WindowChildComponentBuilder { + public static class ChildBuilder implements WindowChildComponentBuilder { private final Cluster parent; private final BiMap> children = HashBiMap.create(); - ChildBuilder(Cluster parent) { + protected ChildBuilder(Cluster parent) { this.parent = parent; } From c1c52872b573ed76895b556fca68cfbd423a8bf0 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:48:21 +0100 Subject: [PATCH 023/117] Renamed GuiHolder#getHandler to GuiHolder#getViewManager --- .../com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java | 2 +- .../java/com/wolfyscript/utilities/common/gui/GuiHolder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java index f534c04b1..2a131ad3e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java @@ -104,7 +104,7 @@ public Optional> getChild(String id) { @Override public ComponentState getState(GuiHolder holder) { - return states[stateSelector.run(holder, holder.getHandler().getData(), this)]; + return states[stateSelector.run(holder, holder.getViewManager().getData(), this)]; } @Override diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java index 09a420f58..f2b62b416 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java @@ -20,7 +20,7 @@ public interface GuiHolder { - GuiViewManager getHandler(); + GuiViewManager getViewManager(); Window getCurrentWindow(); From 4479aa0e28f14198c3483e4e542e2e653db26d07 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 12 Jan 2023 22:48:49 +0100 Subject: [PATCH 024/117] Implemented common methods in GuiHolderCommonImpl --- .../common/gui/GuiHolderCommonImpl.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java new file mode 100644 index 000000000..25a6da6a3 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java @@ -0,0 +1,40 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public abstract class GuiHolderCommonImpl implements GuiHolder { + + protected final Window currentWindow; + protected final GuiViewManager viewManager; + + public GuiHolderCommonImpl(Window currentWindow, GuiViewManager viewManager) { + this.currentWindow = currentWindow; + this.viewManager = viewManager; + } + + @Override + public Window getCurrentWindow() { + return currentWindow; + } + + @Override + public GuiViewManager getViewManager() { + return viewManager; + } +} From af04737d2981ecf099c2b23e0350ae7a8f486874 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 18 Jan 2023 22:11:04 +0100 Subject: [PATCH 025/117] Added more javadoc to Component, Window and various other interfaces. --- .../common/gui/ChildComponentBuilder.java | 10 +++++ .../utilities/common/gui/Cluster.java | 19 ++++++++ .../utilities/common/gui/Component.java | 12 +++++- .../utilities/common/gui/GuiViewManager.java | 5 ++- .../utilities/common/gui/MenuComponent.java | 8 +++- .../utilities/common/gui/Window.java | 20 +++++++++ .../common/gui/WindowComponentBuilder.java | 43 ++++++++++++++++++- 7 files changed, 110 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java index 1920c1703..970fa1d29 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java @@ -22,10 +22,20 @@ import com.wolfyscript.utilities.NamespacedKey; import java.util.function.Consumer; +/** + * Used to create child Components for parent Components. + * + * @param The type of the data implementation. + */ public interface ChildComponentBuilder { // TODO: This needs proper testing > ChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer); + /** + * Creates the children map that has the id of the child and Component as the value. + * + * @return The child Component map. + */ BiMap> create(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java b/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java index 0c6d60ee5..b1c7a873f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java @@ -20,8 +20,22 @@ import java.util.Set; +/** + *

+ * The Cluster acts as a structure and root Component for Menus. + * It can have both other Clusters and Windows as children. + *

+ * The entry is used to define the default menu that is opened. + * + * @param The type of the data implementation. + */ public interface Cluster extends MenuComponent { + /** + * Gets the entry menu Component that is opened by default. + * + * @return The entry Component. + */ MenuComponent entry(); @Override @@ -30,6 +44,11 @@ public interface Cluster extends MenuComponent { @Override Set> children(); + /** + * The type is specified for root Clusters and propagated to the children. + * + * @return The type of the data implementation. + */ Class dataType(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index ca00cb667..cfbf880ba 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -57,15 +57,23 @@ public interface Component { Component parent(); /** + * Gets the child at the relative path from this Component.
+ * When the path is null or empty then it returns this Component instead. * - * @param path - * @return + * @param path The path to the child Component. + * @return The child at the specified path; or this Component when the path is null or empty. */ default Optional> getChild(String... path) { if (path == null || path.length == 0) return Optional.of(this); return getChild(path[0]).flatMap(component -> component.getChild(Arrays.copyOfRange(path, 1, path.length))); } + /** + * Gets the direct child Component, or an empty Optional when it wasn't found. + * + * @param id The id of the child Component. + * @return The child Component; or empty Component. + */ Optional> getChild(String id); /** diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index 099a8abcf..35aa5e5c2 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -43,12 +43,13 @@ public interface GuiViewManager { void openNew(String... path); /** - * Opens the entry menu of this cluster. + * Opens the entry menu of this root cluster. */ void openNew(); /** - * Opens the currently active menu without updating the history. + * Opens the currently active menu without updating the history.
+ * In case there is no active menu it opens the entry of the root cluster. */ void open(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java index 8cbbe0703..04c563e3b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java @@ -25,5 +25,11 @@ public interface MenuComponent extends Component { @Override MenuComponent parent(); - void open(GuiViewManager guiHandler, UUID uuid); + /** + * Opens this component for the specified view and player.
+ * + * @param viewManager The view manager to open. + * @param uuid The uuid to open the Window for. + */ + void open(GuiViewManager viewManager, UUID uuid); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index 141ef55be..02c6a6a69 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -30,10 +30,30 @@ public interface Window extends MenuComponent { @Override Set> children(); + /** + * Gets the type that is configured for this Window.
+ * When this is empty, then {@link #getSize()} will return the specified size. + * + * @return The specified type; or empty Optional when no type is configured. + * @see #getSize() + */ Optional getType(); + /** + * Gets the size that is configured for this Window.
+ * + * When this is empty, then {@link #getType()} will return the specified type. + * + * @return The specified size: or empty Optional when no size is configured. + */ Optional getSize(); + /** + * Creates the title of this window for the specified holder. + * + * @param holder The holder to create the title for. + * @return The title component. + */ Component createTitle(GuiHolder holder); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java index 635caae02..6bef6a6ed 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java @@ -18,10 +18,49 @@ package com.wolfyscript.utilities.common.gui; -public interface WindowComponentBuilder extends Component.Builder, WindowChildComponentBuilder> { +import org.jetbrains.annotations.Nullable; +/** + * Builder used to create Window Menus.
+ * + * + * @param The type of the data implementation. + */ +public interface WindowComponentBuilder extends Component.Builder, WindowChildComponentBuilder, WindowStateBuilder> { + + /** + * The size of the inventory.
+ * This only applies when the type is not specified.
+ * Either the type or size must be specified! + * + * @param size The size of the inventory. + * @return This builder to allow chaining the methods. + */ WindowComponentBuilder size(int size); - WindowComponentBuilder type(WindowType type); + /** + * The type of the inventory.
+ * When the type is specified the size is ignored.
+ * Either the type or size must be specified! + * + * @param type + * @return This builder to allow chaining the methods. + */ + WindowComponentBuilder type(@Nullable WindowType type); + + /** + *

+ * The callback used to create the title of the inventory. + *

+ *

+ * The implementation may work different across platforms.
+ * On plain Spigot servers, the titles do not support all components inside inventory titles, like fonts.
+ * Paper fully supports all Components inside inventory titles. + *

+ * + * @param titleUpdateCallback + * @return + */ + WindowComponentBuilder title(WindowTitleUpdateCallback titleUpdateCallback); } From 8d151a62f68187f0c46428d36cb262c0aef7bff5 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 18 Jan 2023 22:12:00 +0100 Subject: [PATCH 026/117] Removed Component postInteract and preRender methods. --- .../utilities/common/gui/Component.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index cfbf880ba..389235c81 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -119,22 +119,6 @@ default InteractionResult interact(GuiHolder holder, D data, InteractionDetai return getState(holder).interactCallback().interact(holder, data, this, interactionDetails); } - /** - * Called after the interaction was completed.
- * - * @param holder The holder that caused the interaction. - * @param data The data of the handler (for convenience) - * @param interactionDetails The details about the interaction. - */ - default void postInteract(GuiHolder holder, D data, InteractionDetails interactionDetails) { - if (parent() != null) parent().postInteract(holder, data, interactionDetails); - getState(holder).interactPostCallback().run(holder, data, this, interactionDetails); - } - - default void preRender(GuiHolder holder, D data) { - if (parent() != null) parent().preRender(holder, data); - } - /** * Called whenever a Component is rendered. * From 5606435fb570f76175a7a3bc217f9ba26fbee20d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 18 Jan 2023 22:13:07 +0100 Subject: [PATCH 027/117] Added StateBuilder type to Component.Builder --- .../com/wolfyscript/utilities/common/gui/Component.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 389235c81..0f03b5fde 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -138,7 +138,7 @@ default void render(GuiHolder holder, D data, RenderContext context) { * @param * @param */ - interface Builder, CB extends ChildComponentBuilder> { + interface Builder, CB extends ChildComponentBuilder, SB extends ComponentState.Builder> { /** * Specifies the StateSelector to use to select the Components state based on @@ -147,7 +147,7 @@ interface Builder, CB extends ChildCompon * @param stateSelector The state selector to use. * @return This builder for chaining. */ - Builder stateSelector(StateSelector stateSelector); + Builder stateSelector(StateSelector stateSelector); /** * Specifies the state of the Component.
@@ -160,7 +160,7 @@ interface Builder, CB extends ChildCompon * @param builderConsumer The consumer that provides an instance of a new {@link ComponentState.Builder} * @return This builder for chaining. */ - Builder state(Consumer>> builderConsumer); + Builder state(Consumer builderConsumer); /** * The ChildComponentBuilder is used to create and register @@ -168,7 +168,7 @@ interface Builder, CB extends ChildCompon * * @return The ChildComponentBuilder of this Component. */ - Component.Builder children(Consumer childComponentBuilder); + Component.Builder children(Consumer childComponentBuilder); /** * Creates the Component this builder belongs to. From 12c7b1cab31daba8d871455fc3ef7acf47160524 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 18 Jan 2023 22:16:03 +0100 Subject: [PATCH 028/117] Update components to custom StateBuilder types --- .../common/gui/ChildComponentBuilder.java | 2 +- .../common/gui/ClusterCommonImpl.java | 9 +--- .../common/gui/ClusterComponentBuilder.java | 2 +- ...ionPostCallback.java => ClusterState.java} | 6 +-- .../common/gui/ClusterStateBuilder.java | 31 +++++++++++ .../common/gui/WindowCommonImpl.java | 51 ++++++++++--------- .../utilities/common/gui/WindowState.java | 27 ++++++++++ .../common/gui/WindowStateBuilder.java | 27 ++++++++++ 8 files changed, 120 insertions(+), 35 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{InteractionPostCallback.java => ClusterState.java} (83%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java index 970fa1d29..26f906723 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java @@ -30,7 +30,7 @@ public interface ChildComponentBuilder { // TODO: This needs proper testing - > ChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer); + > ChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer); /** * Creates the children map that has the id of the child and Component as the value. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java index 2a131ad3e..c487cf658 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java @@ -143,12 +143,7 @@ public final ClusterComponentBuilder stateSelector(StateSelector stateSele return this; } - public final ClusterComponentBuilder state(Consumer>> stateBuilderConsumer) { - ComponentState.Builder> stateBuilder = new ComponentStateDefault.Builder<>(subID); - stateBuilderConsumer.accept(stateBuilder); - stateBuilders.add(stateBuilder); - return this; - } + public abstract ClusterComponentBuilder state(Consumer> stateBuilderConsumer); @Override public ClusterComponentBuilder children(Consumer> childComponentBuilderConsumer) { @@ -196,7 +191,7 @@ protected ChildBuilder(Cluster parent) { } @Override - public > ClusterChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { + public > ClusterChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { // TODO return this; } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java index d8ce619f9..3bb29c58a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java @@ -18,7 +18,7 @@ package com.wolfyscript.utilities.common.gui; -public interface ClusterComponentBuilder extends Component.Builder, ClusterChildComponentBuilder> { +public interface ClusterComponentBuilder extends Component.Builder, ClusterChildComponentBuilder, ClusterStateBuilder> { ClusterComponentBuilder entry(String subID); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterState.java similarity index 83% rename from src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ClusterState.java index fed609ded..05913b0da 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionPostCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterState.java @@ -18,8 +18,8 @@ package com.wolfyscript.utilities.common.gui; -@FunctionalInterface -public interface InteractionPostCallback { +public interface ClusterState extends ComponentState { + + MenuComponent getComponentToRender(); - void run(GuiHolder holder, D data, Component component, InteractionDetails details); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java new file mode 100644 index 000000000..54e225cb2 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java @@ -0,0 +1,31 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface ClusterStateBuilder extends ComponentState.Builder> { + + /** + * Clusters can only render child menus, that were configured using the ClusterComponentBuilder. + * + * @param childID The id of the child MenuComponent. + * @return This builder to allow for chaining. + */ + ClusterStateBuilder childComponentToRender(String childID); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java index bd1652113..28db95ea3 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java @@ -32,18 +32,20 @@ public abstract class WindowCommonImpl implements Window { - private final WolfyUtils wolfyUtils; - private final String id; - private final MenuComponent parent; - private final ComponentState[] states; - private final StateSelector stateSelector; - private final BiMap> children; - private final Integer size; - private final WindowType type; - - protected WindowCommonImpl(String id, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, Integer size, WindowType type) { + protected final WolfyUtils wolfyUtils; + protected final String id; + protected final MenuComponent parent; + protected final WindowState[] states; + protected final StateSelector stateSelector; + protected final BiMap> children; + protected final Integer size; + protected final WindowType type; + protected final WindowTitleUpdateCallback titleUpdateCallback; + + protected WindowCommonImpl(String id, Cluster parent, WindowTitleUpdateCallback titleUpdateCallback, StateSelector stateSelector, WindowState[] states, BiMap> children, Integer size, WindowType type) { this.id = id; this.parent = parent; + this.titleUpdateCallback = titleUpdateCallback; this.wolfyUtils = parent.getWolfyUtils(); this.stateSelector = stateSelector; this.states = states; @@ -79,7 +81,7 @@ public Optional> getChild(String id) { } @Override - public ComponentState getState(GuiHolder holder) { + public WindowState getState(GuiHolder holder) { return states[stateSelector.run(holder, holder.getViewManager().getData(), this)]; } @@ -93,8 +95,9 @@ public Optional getType() { return Optional.ofNullable(type); } - public net.kyori.adventure.text.Component onUpdateTitle(GuiHolder holder) { - return null; + @Override + public net.kyori.adventure.text.Component createTitle(GuiHolder holder) { + return titleUpdateCallback.run(holder, holder.getViewManager().getData(), this); } @Override @@ -115,10 +118,11 @@ public static abstract class Builder implements WindowComponentB protected final String subID; protected final Cluster parent; protected StateSelector stateSelector; - protected final List>> stateBuilders = new ArrayList<>(); + protected final List> stateBuilders = new ArrayList<>(); protected final WindowChildComponentBuilder childComponentBuilder; protected Integer size; protected WindowType type; + protected WindowTitleUpdateCallback titleUpdateCallback; protected Builder(String subID, Cluster parent, WindowChildComponentBuilder childComponentBuilder) { this.subID = subID; @@ -139,19 +143,20 @@ public Builder type(WindowType type) { } @Override - public Builder stateSelector(StateSelector stateSelector) { - this.stateSelector = stateSelector; + public Builder title(WindowTitleUpdateCallback titleUpdateCallback) { + this.titleUpdateCallback = titleUpdateCallback; return this; } @Override - public Builder state(Consumer>> stateBuilderConsumer) { - ComponentState.Builder> stateBuilder = new ComponentStateDefault.Builder<>(subID); - stateBuilderConsumer.accept(stateBuilder); - stateBuilders.add(stateBuilder); + public Builder stateSelector(StateSelector stateSelector) { + this.stateSelector = stateSelector; return this; } + @Override + public abstract Builder state(Consumer> stateBuilderConsumer); + @Override public Builder children(Consumer> childComponentBuilderConsumer) { childComponentBuilderConsumer.accept(childComponentBuilder); @@ -163,13 +168,13 @@ public Window create() { return constructImplementation(parent.getID() + "/" + subID, parent, stateSelector == null ? (holder, data, component) -> 0 : stateSelector, - stateBuilders.stream().map(ComponentState.Builder::create).>toArray(ComponentState[]::new), + stateBuilders.stream().map(WindowStateBuilder::create).>toArray(WindowState[]::new), childComponentBuilder.create(), size, type ); } - protected abstract Window constructImplementation(String id, Cluster cluster, StateSelector stateSelector, ComponentState[] states, BiMap> children, Integer size, WindowType type); + protected abstract Window constructImplementation(String id, Cluster cluster, StateSelector stateSelector, WindowState[] states, BiMap> children, Integer size, WindowType type); } @@ -183,7 +188,7 @@ protected ChildBuilder(Cluster parent) { } @Override - public > WindowChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { + public > WindowChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { // TODO return this; } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java new file mode 100644 index 000000000..129168e88 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.Map; + +public interface WindowState extends ComponentState { + + Map> getComponentPositions(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java new file mode 100644 index 000000000..ab1959391 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface WindowStateBuilder extends ComponentState.Builder> { + + WindowStateBuilder childSlot(int slot, String childID); + + WindowStateBuilder componentSlot(int slot, String... pathFromRoot); + +} From 97aa8ad25a4d315130867212b9fe014dd37bbb77 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 18 Jan 2023 22:16:14 +0100 Subject: [PATCH 029/117] Added WindowTitleUpdateCallback --- .../common/gui/WindowTitleUpdateCallback.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java new file mode 100644 index 000000000..bbceb0ba0 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import net.kyori.adventure.text.Component; + +public interface WindowTitleUpdateCallback { + + Component run(GuiHolder holder, D data, Window window); + +} From 90f41ee43b8dbaf1223e645e5eb29b78ae2ed82c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 18 Jan 2023 22:16:51 +0100 Subject: [PATCH 030/117] Removed InteractionPostCallback --- .../utilities/common/gui/ComponentState.java | 11 ----------- .../common/gui/ComponentStateDefault.java | 19 ++----------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java index 228e48e7e..b691ccf87 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java @@ -54,15 +54,6 @@ public interface ComponentState { */ InteractionCallback interactCallback(); - /** - * Called after each interaction. - * This propagates from the root Component to the Component that caused the interaction. - * This is called before the interaction of the child Component. - * - * @return The post interact callback - */ - InteractionPostCallback interactPostCallback(); - /** * Called before each render. * @@ -101,8 +92,6 @@ interface Builder> { Builder interact(InteractionCallback interactionCallback); - Builder interactPost(InteractionPostCallback interactPostCallback); - Builder renderPre(RenderPreCallback renderPreCallback); Builder render(RenderCallback renderCallback); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java index 4797ecc03..6a470d3e0 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java @@ -25,14 +25,12 @@ public class ComponentStateDefault implements ComponentState private final String key; private final InteractionCallback interactionCallback; - private final InteractionPostCallback interactPostCallback; private final RenderPreCallback renderPreCallback; private final RenderCallback renderCallback; - protected ComponentStateDefault(String key, InteractionCallback interactionCallback, InteractionPostCallback interactPostCallback, RenderPreCallback renderPreCallback, RenderCallback renderCallback) { + protected ComponentStateDefault(String key, InteractionCallback interactionCallback, RenderPreCallback renderPreCallback, RenderCallback renderCallback) { this.key = key; this.interactionCallback = interactionCallback; - this.interactPostCallback = interactPostCallback; this.renderPreCallback = renderPreCallback; this.renderCallback = renderCallback; } @@ -42,11 +40,6 @@ public InteractionCallback interactCallback() { return interactionCallback; } - @Override - public InteractionPostCallback interactPostCallback() { - return interactPostCallback; - } - @Override public RenderCallback renderCallback() { return renderCallback; @@ -66,7 +59,6 @@ public static class Builder implements ComponentState.Builder interactionCallback; - private InteractionPostCallback interactPostCallback; private RenderPreCallback renderPreCallback; private RenderCallback renderCallback; @@ -92,12 +84,6 @@ public Builder interact(InteractionCallback interactionCallback) { return this; } - @Override - public Builder interactPost(InteractionPostCallback interactPostCallback) { - this.interactPostCallback = interactPostCallback; - return this; - } - @Override public Builder renderPre(RenderPreCallback renderPreCallback) { this.renderPreCallback = renderPreCallback; @@ -114,11 +100,10 @@ public Builder render(RenderCallback renderCallback) { public ComponentStateDefault create() { Preconditions.checkNotNull(renderCallback, "Cannot create Component without a RenderCallback!"); final var interactCallback = Objects.requireNonNullElseGet(this.interactionCallback, () -> (holder, data, component, details) -> InteractionResult.def()); - final var interactPostCallback = Objects.requireNonNullElseGet(this.interactPostCallback, () -> (holder, data, component, details) -> {}); final var renderPreCallback = Objects.requireNonNullElseGet(this.renderPreCallback, () -> (holder, data, component, context) -> {}); final var renderCallback = Objects.requireNonNullElseGet(this.renderCallback, () -> (holder, data, component, context) -> {}); - return new ComponentStateDefault<>(key, interactCallback, interactPostCallback, renderPreCallback, renderCallback); + return new ComponentStateDefault<>(key, interactCallback, renderPreCallback, renderCallback); } } } From 9bbb46448563f3a1ac57c32d64dca400e82a3760 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 6 Mar 2023 19:34:45 +0100 Subject: [PATCH 031/117] Various API additions and changes * Changed ComponentState to ButtonState * Separated Component functionalities into interfaces --- .../utilities/common/gui/AreaComponent.java | 2 +- .../utilities/common/gui/BranchComponent.java | 59 +++++ .../gui/{SlotComponent.java => Button.java} | 18 +- .../utilities/common/gui/ButtonState.java | 87 +++++++ ...teDefault.java => ButtonStateDefault.java} | 49 ++-- .../common/gui/ChildComponentBuilder.java | 9 +- .../common/gui/ClickInteractionDetails.java | 2 +- .../common/gui/ClusterCommonImpl.java | 226 ------------------ .../utilities/common/gui/Component.java | 120 +--------- .../gui/{Data.java => ComponentConfig.java} | 9 +- .../utilities/common/gui/ComponentState.java | 82 +------ ...erState.java => ComponentStateWindow.java} | 4 +- ...rComponentBuilder.java => Compositor.java} | 6 +- .../utilities/common/gui/Context.java | 23 ++ .../common/gui/DragInteractionDetails.java | 2 +- .../utilities/common/gui/GuiAPIManager.java | 49 ++-- .../common/gui/GuiAPIManagerCommonImpl.java | 26 +- .../utilities/common/gui/GuiHolder.java | 6 +- .../common/gui/GuiHolderCommonImpl.java | 12 +- .../utilities/common/gui/GuiViewManager.java | 20 +- .../common/gui/GuiViewManagerCommonImpl.java | 42 ++-- .../utilities/common/gui/Interactable.java | 44 ++++ .../common/gui/InteractionCallback.java | 4 +- .../common/gui/InteractionDetails.java | 2 +- .../utilities/common/gui/MenuComponent.java | 7 +- ...nderPreCallback.java => Positionable.java} | 5 +- .../utilities/common/gui/RenderCallback.java | 4 +- .../utilities/common/gui/RenderContext.java | 10 +- ...usterStateBuilder.java => Renderable.java} | 18 +- .../common/gui/{Cluster.java => Router.java} | 24 +- .../utilities/common/gui/RouterBuilder.java | 33 +++ .../common/gui/RouterChildBuilder.java | 30 +++ .../utilities/common/gui/RouterEntry.java | 34 +++ .../common/gui/RouterEntryBuilder.java | 27 +++ ...ponentBuilder.java => SizedComponent.java} | 25 +- .../utilities/common/gui/StateHook.java | 58 +++++ .../utilities/common/gui/StateSelector.java | 4 +- .../utilities/common/gui/Stateful.java | 25 ++ .../utilities/common/gui/Window.java | 12 +- .../gui/WindowChildComponentBuilder.java | 7 +- .../common/gui/WindowCommonImpl.java | 201 ---------------- .../common/gui/WindowComponentBuilder.java | 14 +- .../utilities/common/gui/WindowState.java | 4 +- .../common/gui/WindowStateBuilder.java | 6 +- .../common/gui/WindowTitleUpdateCallback.java | 4 +- 45 files changed, 614 insertions(+), 841 deletions(-) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java rename src/main/java/com/wolfyscript/utilities/common/gui/{SlotComponent.java => Button.java} (81%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java rename src/main/java/com/wolfyscript/utilities/common/gui/{ComponentStateDefault.java => ButtonStateDefault.java} (52%) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java rename src/main/java/com/wolfyscript/utilities/common/gui/{Data.java => ComponentConfig.java} (88%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ClusterState.java => ComponentStateWindow.java} (88%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ClusterComponentBuilder.java => Compositor.java} (80%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Context.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java rename src/main/java/com/wolfyscript/utilities/common/gui/{RenderPreCallback.java => Positionable.java} (84%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ClusterStateBuilder.java => Renderable.java} (70%) rename src/main/java/com/wolfyscript/utilities/common/gui/{Cluster.java => Router.java} (78%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java rename src/main/java/com/wolfyscript/utilities/common/gui/{ClusterChildComponentBuilder.java => SizedComponent.java} (63%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java index 64cdcde4e..a19547e4c 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java @@ -18,6 +18,6 @@ package com.wolfyscript.utilities.common.gui; -public interface AreaComponent extends SlotComponent { +public interface AreaComponent extends Component { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java new file mode 100644 index 000000000..a384ff35d --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java @@ -0,0 +1,59 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.Arrays; +import java.util.Optional; +import java.util.Set; + +public interface BranchComponent { + + /** + * The children of this Component; or an empty Set if there are no children. + * + * @return The child Components of this Component. + */ + Set childComponents(); + + /** + * Gets the child at the relative path from this Component.
+ * When the path is null or empty then it returns this Component instead. + * + * @param path The path to the child Component. + * @return The child at the specified path; or this Component when the path is null or empty. + */ + default Optional getChild(String... path) { + if (path == null || path.length == 0) return Optional.empty(); + return getChild(path[0]).flatMap(component -> { + if (component instanceof BranchComponent branchComponent) { + return branchComponent.getChild(Arrays.copyOfRange(path, 1, path.length)); + } + return Optional.empty(); + }); + } + + /** + * Gets the direct child Component, or an empty Optional when it wasn't found. + * + * @param id The id of the child Component. + * @return The child Component; or empty Component. + */ + Optional getChild(String id); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/Button.java similarity index 81% rename from src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Button.java index c43c2594f..31b81a830 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/SlotComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Button.java @@ -18,17 +18,15 @@ package com.wolfyscript.utilities.common.gui; -import java.util.Set; - -public interface SlotComponent extends Component { +public interface Button extends Component, Interactable, Renderable, SizedComponent { @Override - Set> children(); - - int position(); - - int width(); - - int height(); + default int width() { + return 1; + } + @Override + default int height() { + return 1; + } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java new file mode 100644 index 000000000..ca7a8bb8e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java @@ -0,0 +1,87 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +/** + *

+ * The State represents a State of a Button, that handles the functionality of the Button.
+ * It provides several runtime callbacks that are called whenever an interaction or render request occurs. + *

+ *

+ * These States are used to draw the proper icons and textures of the GUI and handle the interactions and data manipulation. + *
+ * Buttons like ToggleButtons use two states, and can sync it to the provided state using the {@link StateSelector}. + *

+ */ +public interface ButtonState { + + /** + * The key of the state. This is mostly used for translations.
+ * By default, it is the same as the owner Component. + * But it can be different or a sub key from the owner key. + * + * @return The key of the state. + */ + String key(); + + /** + * Called whenever an interaction occurs.
+ * This propagates from the root Component to the Component that caused the interaction. + * + * @return The interaction callback + */ + InteractionCallback interactCallback(); + + /** + * Called each time the Component or a child Component is rendered in the GUI. + * + * + * @return + */ + RenderCallback renderCallback(); + + interface Builder { + + /** + * Specifies the sub key of the state relative to the owner key or previously specified key or subKey, separated by a dot ('.'). + * These keys are used as language keys to lookup translations in the lang files. + * + * @param subKey The sub key of this state. + * @return This Builder for chaining. + */ + Builder subKey(String subKey); + + /** + * Specifies the key of the state. + * These keys are used as language keys to lookup translations in the lang files. + * + * @param key The key of this state. + * @return This Builder for chaining. + */ + Builder key(String key); + + Builder interact(InteractionCallback interactionCallback); + + Builder render(RenderCallback renderCallback); + + S create(); + + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java similarity index 52% rename from src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java index 6a470d3e0..01feb2034 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateDefault.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java @@ -21,89 +21,74 @@ import com.google.common.base.Preconditions; import java.util.Objects; -public class ComponentStateDefault implements ComponentState { +public class ButtonStateDefault implements ButtonState { private final String key; - private final InteractionCallback interactionCallback; - private final RenderPreCallback renderPreCallback; - private final RenderCallback renderCallback; + private final InteractionCallback interactionCallback; + private final RenderCallback renderCallback; - protected ComponentStateDefault(String key, InteractionCallback interactionCallback, RenderPreCallback renderPreCallback, RenderCallback renderCallback) { + protected ButtonStateDefault(String key, InteractionCallback interactionCallback, RenderCallback renderCallback) { this.key = key; this.interactionCallback = interactionCallback; - this.renderPreCallback = renderPreCallback; this.renderCallback = renderCallback; } @Override - public InteractionCallback interactCallback() { + public InteractionCallback interactCallback() { return interactionCallback; } @Override - public RenderCallback renderCallback() { + public RenderCallback renderCallback() { return renderCallback; } - @Override - public RenderPreCallback renderPreCallback() { - return renderPreCallback; - } - @Override public String key() { return key; } - public static class Builder implements ComponentState.Builder> { + public static class Builder implements ButtonState.Builder { private String key; - private InteractionCallback interactionCallback; - private RenderPreCallback renderPreCallback; - private RenderCallback renderCallback; + private InteractionCallback interactionCallback; + private RenderCallback renderCallback; protected Builder(String ownerID) { this.key = ownerID; } @Override - public Builder subKey(String subKey) { + public Builder subKey(String subKey) { this.key += "." + subKey; return this; } @Override - public Builder key(String key) { + public Builder key(String key) { this.key = key; return this; } @Override - public Builder interact(InteractionCallback interactionCallback) { + public Builder interact(InteractionCallback interactionCallback) { this.interactionCallback = interactionCallback; return this; } @Override - public Builder renderPre(RenderPreCallback renderPreCallback) { - this.renderPreCallback = renderPreCallback; - return null; - } - - @Override - public Builder render(RenderCallback renderCallback) { + public Builder render(RenderCallback renderCallback) { this.renderCallback = renderCallback; return null; } @Override - public ComponentStateDefault create() { + public ButtonStateDefault create() { Preconditions.checkNotNull(renderCallback, "Cannot create Component without a RenderCallback!"); - final var interactCallback = Objects.requireNonNullElseGet(this.interactionCallback, () -> (holder, data, component, details) -> InteractionResult.def()); - final var renderPreCallback = Objects.requireNonNullElseGet(this.renderPreCallback, () -> (holder, data, component, context) -> {}); - final var renderCallback = Objects.requireNonNullElseGet(this.renderCallback, () -> (holder, data, component, context) -> {}); + final var interactCallback = Objects.requireNonNullElseGet(this.interactionCallback, () -> (holder, state, details) -> InteractionResult.def()); + final var renderCallback = Objects.requireNonNullElseGet(this.renderCallback, () -> (holder, state) -> {}); - return new ComponentStateDefault<>(key, interactCallback, renderPreCallback, renderCallback); + return new ButtonStateDefault(key, interactCallback, renderCallback); } } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java index 26f906723..375393a1d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java @@ -19,23 +19,18 @@ package com.wolfyscript.utilities.common.gui; import com.google.common.collect.BiMap; -import com.wolfyscript.utilities.NamespacedKey; -import java.util.function.Consumer; /** * Used to create child Components for parent Components. * * @param The type of the data implementation. */ -public interface ChildComponentBuilder { - - // TODO: This needs proper testing - > ChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer); +public interface ChildComponentBuilder { /** * Creates the children map that has the id of the child and Component as the value. * * @return The child Component map. */ - BiMap> create(); + BiMap create(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java index b38a536aa..b00ebd050 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ClickInteractionDetails.java @@ -1,6 +1,6 @@ package com.wolfyscript.utilities.common.gui; -public interface ClickInteractionDetails extends InteractionDetails { +public interface ClickInteractionDetails extends InteractionDetails { boolean isShift(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java deleted file mode 100644 index c487cf658..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterCommonImpl.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import com.google.common.base.Preconditions; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.wolfyscript.utilities.NamespacedKey; -import com.wolfyscript.utilities.common.WolfyUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.function.Consumer; - -public abstract class ClusterCommonImpl implements Cluster { - - private final WolfyUtils wolfyUtils; - private final Cluster parent; - private final ComponentState[] states; - private final StateSelector stateSelector; - private final String id; - private final MenuComponent entry; - private final Class dataType; - private final BiMap> children; - - protected ClusterCommonImpl(String id, Class dataType, WolfyUtils wolfyUtils, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry) { - Preconditions.checkNotNull(id); - Preconditions.checkNotNull(stateSelector); - Preconditions.checkNotNull(dataType); - Preconditions.checkNotNull(wolfyUtils); - Preconditions.checkNotNull(entry, "Cluster must have an entry Component!"); - Preconditions.checkArgument(states != null && states.length > 0, "ComponentStates cannot be null or empty!"); - this.parent = parent; - this.dataType = dataType; - this.wolfyUtils = wolfyUtils; - this.id = id; - this.stateSelector = stateSelector; - this.states = states; - this.children = HashBiMap.create(children); - this.entry = entry; - } - - protected ClusterCommonImpl(String id, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry) { - this(id, parent.dataType(), parent.getWolfyUtils(), parent, stateSelector, states, children, entry); - } - - protected ClusterCommonImpl(String id, WolfyUtils wolfyUtils, Class dataType, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry) { - this(id, dataType, wolfyUtils, null, stateSelector, states, children, entry); - } - - @Override - public String getID() { - return id; - } - - @Override - public WolfyUtils getWolfyUtils() { - return wolfyUtils; - } - - @Override - public Set> children() { - return children.values(); - } - - @Override - public Class dataType() { - return dataType; - } - - @Override - public Cluster parent() { - return parent; - } - - @Override - public void open(GuiViewManager viewManager, UUID player) { - // Redirect and open the entry component - entry().open(viewManager, player); - } - - @Override - public Optional> getChild(String id) { - return Optional.ofNullable(children.get(id)); - } - - @Override - public ComponentState getState(GuiHolder holder) { - return states[stateSelector.run(holder, holder.getViewManager().getData(), this)]; - } - - @Override - public void init() { - - } - - @Override - public MenuComponent entry() { - return entry; - } - - public static abstract class Builder implements ClusterComponentBuilder { - - private final String subID; - private String entryID; - private final WolfyUtils wolfyUtils; - private final Cluster parent; - private final Class dataType; - private final List>> stateBuilders = new ArrayList<>(); - private final ClusterChildComponentBuilder childComponentBuilder; - private StateSelector stateSelector; - - protected Builder(String subID, Cluster parent, ClusterChildComponentBuilder childComponentBuilder) { - Preconditions.checkNotNull(subID); - this.wolfyUtils = parent.getWolfyUtils(); - this.parent = parent; - this.dataType = parent.dataType(); - this.subID = subID; - this.childComponentBuilder = childComponentBuilder; - } - - @Override - public final ClusterComponentBuilder stateSelector(StateSelector stateSelector) { - this.stateSelector = stateSelector; - return this; - } - - public abstract ClusterComponentBuilder state(Consumer> stateBuilderConsumer); - - @Override - public ClusterComponentBuilder children(Consumer> childComponentBuilderConsumer) { - childComponentBuilderConsumer.accept(this.childComponentBuilder); - return this; - } - - @Override - public ClusterComponentBuilder entry(String subID) { - this.entryID = subID; - return this; - } - - @Override - public final Cluster create() { - BiMap> children = childComponentBuilder.create(); - Preconditions.checkState(!children.isEmpty(), "Cannot create Cluster without child Components!"); - // Either use explicitly specified entry, or implicitly select it. - MenuComponent entry; - if (entryID != null) { - entry = children.get(entryID); - Preconditions.checkState(entry != null, "Cannot find entry Component! Please check the explicitly specified entry id!"); - } else { - entry = children.values().stream().findFirst().orElseThrow(); - } - return constructImplementation(subID, dataType, wolfyUtils, parent, - stateSelector == null ? (holder, data, component) -> 0 : stateSelector, - stateBuilders.stream().map(ComponentState.Builder::create).>toArray(ComponentState[]::new), - children, - entry - ); - } - - protected abstract Cluster constructImplementation(String subID, Class dataType, WolfyUtils wolfyUtils, Cluster parent, StateSelector stateSelector, ComponentState[] states, BiMap> children, MenuComponent entry); - - } - - public static abstract class ChildBuilder implements ClusterChildComponentBuilder { - - private final Cluster parent; - private final BiMap> children = HashBiMap.create(); - - protected ChildBuilder(Cluster parent) { - this.parent = parent; - } - - @Override - public > ClusterChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { - // TODO - return this; - } - - @Override - public ClusterChildComponentBuilder window(String id, Consumer> windowComponentBuilderConsumer) { - var windowBuilder = constructWindowBuilderImpl(id, parent); - windowComponentBuilderConsumer.accept(windowBuilder); - var window = windowBuilder.create(); - children.put(id, window); - return this; - } - - @Override - public ClusterChildComponentBuilder cluster(String id, Consumer> clusterComponentBuilderConsumer) { - ClusterComponentBuilder clusterBuilder = constructClusterBuilderImpl(id, parent); - clusterComponentBuilderConsumer.accept(clusterBuilder); - var cluster = clusterBuilder.create(); - children.put(id, cluster); - return this; - } - - @Override - public BiMap> create() { - return children; - } - - protected abstract ClusterComponentBuilder constructClusterBuilderImpl(String id, Cluster parent); - - protected abstract WindowComponentBuilder constructWindowBuilderImpl(String id, Cluster parent); - } -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 0f03b5fde..61bbf747c 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -20,13 +20,10 @@ import com.wolfyscript.utilities.common.WolfyUtils; import java.util.ArrayDeque; -import java.util.Arrays; import java.util.Deque; -import java.util.Optional; -import java.util.Set; import java.util.function.Consumer; -public interface Component { +public interface Component { /** * Gets the unique id (in context of the parent) of this component. @@ -42,48 +39,12 @@ public interface Component { */ WolfyUtils getWolfyUtils(); - /** - * The children of this Component; or an empty Set if there are no children. - * - * @return The child Components of this Component. - */ - Set> children(); - /** * The parent of this Component, or null if it is a root Component. * * @return The parent; or null if root Component. */ - Component parent(); - - /** - * Gets the child at the relative path from this Component.
- * When the path is null or empty then it returns this Component instead. - * - * @param path The path to the child Component. - * @return The child at the specified path; or this Component when the path is null or empty. - */ - default Optional> getChild(String... path) { - if (path == null || path.length == 0) return Optional.of(this); - return getChild(path[0]).flatMap(component -> component.getChild(Arrays.copyOfRange(path, 1, path.length))); - } - - /** - * Gets the direct child Component, or an empty Optional when it wasn't found. - * - * @param id The id of the child Component. - * @return The child Component; or empty Component. - */ - Optional> getChild(String id); - - /** - * The state of this Component for the specified - * {@link GuiHolder } (e.g. Data, Permission, etc.) - * - * @param holder The holder to select the state for. - * @return The selected state for the holder. - */ - ComponentState getState(GuiHolder holder); + Component parent(); /** * Called when the Component is initialised. @@ -91,91 +52,22 @@ default Optional> getChild(String... path) { */ void init(); - default Deque> getPathToRoot() { + default Deque getPathToRoot() { if (parent() == null) return new ArrayDeque<>(); - Deque> path = parent().getPathToRoot(); + Deque path = parent().getPathToRoot(); path.add(parent()); return path; } - /** - * Called when an interaction occurs inside the Component.
- * This may be called if a child Component is interacted with, for example a Button will cause this interaction to
- * propagate from the root Cluster, down the Windows to the Button that caused the interaction to be called.
- *
- * For this behaviour any implementation must first call the parent interaction, before continuing.
- * Only if there is no parent available (root Component) it continues, going back to the interaction cause.
- * - * @param holder The holder that caused the interaction. - * @param data The data of the handler (for convenience) - * @param interactionDetails The details about the interaction. - * @return The interaction result. - */ - default InteractionResult interact(GuiHolder holder, D data, InteractionDetails interactionDetails) { - if (parent() != null) { - InteractionResult result = parent().interact(holder, data, interactionDetails); - if (result.isCancelled()) return result; - } - return getState(holder).interactCallback().interact(holder, data, this, interactionDetails); - } - - /** - * Called whenever a Component is rendered. - * - * @param holder - * @param data - * @param context - */ - default void render(GuiHolder holder, D data, RenderContext context) { - if (parent() != null) parent().render(holder, data, context); - getState(holder).renderCallback().render(holder, data, this, context); - } + Class getComponentStateType(); /** * Builder used to create Components.
* A Builder should always be preferred over creating Components via constructor. * - * @param * @param */ - interface Builder, CB extends ChildComponentBuilder, SB extends ComponentState.Builder> { - - /** - * Specifies the StateSelector to use to select the Components state based on - * current data and holder. - * - * @param stateSelector The state selector to use. - * @return This builder for chaining. - */ - Builder stateSelector(StateSelector stateSelector); - - /** - * Specifies the state of the Component.
- * Depending on the owning Component this may set or add the state.
- * For example, some Components can have multiple states that are selected using the state selector specified using {@link #stateSelector(StateSelector)}.
- * In these cases the states are added in the order of invocations of this method.
- *
- * The consumer must not call {@link ComponentState.Builder#create()} as that is handled by the implementation of this builder! - * - * @param builderConsumer The consumer that provides an instance of a new {@link ComponentState.Builder} - * @return This builder for chaining. - */ - Builder state(Consumer builderConsumer); - - /** - * The ChildComponentBuilder is used to create and register - * child Components for this Component. - * - * @return The ChildComponentBuilder of this Component. - */ - Component.Builder children(Consumer childComponentBuilder); - - /** - * Creates the Component this builder belongs to. - * - * @return The new instance of the Component. - */ - C create(); + interface Builder { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Data.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentConfig.java similarity index 88% rename from src/main/java/com/wolfyscript/utilities/common/gui/Data.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ComponentConfig.java index eaa7fa558..9c33a7ce7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Data.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentConfig.java @@ -18,7 +18,8 @@ package com.wolfyscript.utilities.common.gui; -/** - * Data object that can be extended to store custom data for GUI Views.
- */ -public abstract class Data { } +public interface ComponentConfig { + + + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java index b691ccf87..06b27b3b7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java @@ -18,86 +18,20 @@ package com.wolfyscript.utilities.common.gui; -/** - *

- * The State represents a State of a Component, that handles the functionality of the Component.
- * It provides several runtime callbacks that are called whenever an interaction or render request occurs. - *

- *

- * For example inside Windows and Buttons these States are used to draw the proper icons and textures of the GUI and handle the interactions and data manipulation. - *
- * Buttons like ToggleButtons use two states, and can sync it to the provided data ({@link D}) using the {@link StateSelector}. - *

- *

- * The State of a Component is independent of its children and won't change if a children changes its state.
- * Instead, the state is selected based on the data of the {@link GuiViewManager} each time an update occurs. - *

- * - * @param The type of data. - */ -public interface ComponentState { - - /** - * The key of the state. This is mostly used for translations.
- * By default, it is the same as the owner Component. - * But it can be different or a sub key from the owner key. - * - * @return The key of the state. - */ - String key(); - - /** - * Called whenever an interaction occurs.
- * This propagates from the root Component to the Component that caused the interaction. - * - * @return The interaction callback - */ - InteractionCallback interactCallback(); - - /** - * Called before each render. - * - * - * @return - */ - RenderPreCallback renderPreCallback(); - - /** - * Called each time the Component or a child Component is rendered in the GUI. - * - * - * @return - */ - RenderCallback renderCallback(); - - interface Builder> { +import java.util.function.Supplier; - /** - * Specifies the sub key of the state relative to the owner key or previously specified key or subKey, separated by a dot ('.'). - * These keys are used as language keys to lookup translations in the lang files. - * - * @param subKey The sub key of this state. - * @return This Builder for chaining. - */ - Builder subKey(String subKey); +public interface ComponentState { - /** - * Specifies the key of the state. - * These keys are used as language keys to lookup translations in the lang files. - * - * @param key The key of this state. - * @return This Builder for chaining. - */ - Builder key(String key); + Component getOwner(); - Builder interact(InteractionCallback interactionCallback); + StateHook getOrCreateHook(String id, Supplier defaultValue); - Builder renderPre(RenderPreCallback renderPreCallback); + boolean shouldUpdate(); - Builder render(RenderCallback renderCallback); + InteractionResult interact(GuiHolder holder, InteractionDetails interactionDetails); + + void render(GuiHolder holder, RenderContext context); - S create(); - } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateWindow.java similarity index 88% rename from src/main/java/com/wolfyscript/utilities/common/gui/ClusterState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateWindow.java index 05913b0da..4ef556f68 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateWindow.java @@ -18,8 +18,8 @@ package com.wolfyscript.utilities.common.gui; -public interface ClusterState extends ComponentState { +public interface ComponentStateWindow extends ComponentState { - MenuComponent getComponentToRender(); + void setComponent(int slot, String componentID); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/Compositor.java similarity index 80% rename from src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Compositor.java index 3bb29c58a..db056b517 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Compositor.java @@ -18,8 +18,10 @@ package com.wolfyscript.utilities.common.gui; -public interface ClusterComponentBuilder extends Component.Builder, ClusterChildComponentBuilder, ClusterStateBuilder> { +import com.wolfyscript.utilities.common.items.ItemStackConfig; - ClusterComponentBuilder entry(String subID); +public interface Compositor> { + + void setStack(int slot, T stackConfig); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Context.java b/src/main/java/com/wolfyscript/utilities/common/gui/Context.java new file mode 100644 index 000000000..bd62d926f --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Context.java @@ -0,0 +1,23 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface Context { + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java index 46663bf1d..7000a5185 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/DragInteractionDetails.java @@ -2,7 +2,7 @@ import java.util.Set; -public interface DragInteractionDetails extends InteractionDetails { +public interface DragInteractionDetails extends InteractionDetails { Set getInventorySlots(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index 7b5097936..3b2b7d33d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -23,65 +23,46 @@ import java.util.function.Consumer; /** - * Handles the general GUI API and acts as an entry point to the whole creation of {@link Cluster}s and {@link GuiViewManager}s.
- * It stores all the registered {@link Cluster}s and allows to register new clusters via builders.
+ * Handles the general GUI API and acts as an entry point to the whole creation of {@link Router}s and {@link GuiViewManager}s.
+ * It stores all the registered {@link Router}s and allows to register new clusters via builders.
* Additionally, it stores the {@link GuiViewManager}s that handle the views for players. */ public interface GuiAPIManager { /** - * Registers a new cluster under the given id, using the specified custom {@link Data} type ({@link D}).
- * The builder consumer provides the newly constructed {@link ClusterComponentBuilder}, which can then be used inside that consumer.
- * It is not required to call the {@link ClusterComponentBuilder#create()} method, because that is done after the consumer function ends. + * Registers a new router under the given id.
+ * The builder consumer provides the newly constructed {@link RouterBuilder}, which can then be used inside that consumer.
* - * @param id The unique id of the cluster to register. - * @param dataType The type of the custom {@link Data} implementation. - * @param clusterBuilderConsumer The consumer that provides the new builder. - * @param The type of the specified data implementation. + * @param id The unique id of the router to register. + * @param routerBuilderConsumer The consumer that provides the new builder. */ - void registerCluster(String id, Class dataType, Consumer> clusterBuilderConsumer); + void registerRouter(String id, Consumer routerBuilderConsumer); /** - * Gets the registered cluster with the specified id.
- * If the cluster is available it checks if it matches the provided type.
- * When the type does not match an empty Optional is returned instead. + * Gets the registered router with the specified id.
* - * @param id The id of the cluster. - * @param dataType The type of the cluster. - * @return The registered cluster only if the id and data type matches; otherwise empty Optional. - * @param The type of the data implementation. + * @param id The id of the router. + * @return The registered router only if the id matches; otherwise empty Optional. */ - Optional> getCluster(String id, Class dataType); - - /** - * Gets the registered cluster with the specified id.
- * - * @param id The id of the cluster. - * @return The registered cluster only if the id matches; otherwise empty Optional. - */ - Optional> getCluster(String id); + Optional getRouter(String id); /** * Creates a new view for the specified viewers, with the specified cluster as its root.
- * This gets the registered cluster using {@link #getCluster(String, Class)}. + * This gets the registered cluster using {@link #getRouter(String)}. * * @param clusterId The id of the root cluster. - * @param dataType The type of the cluster data implementation. * @param viewers The viewers of this view. * @return The newly created view. - * @param The type of the data implementation. */ - GuiViewManager createView(String clusterId, Class dataType, UUID... viewers); + GuiViewManager createView(String clusterId, UUID... viewers); /** - * Same as {@link #createView(String, Class, UUID...)} and opens the entry menu right after the creation of the view. + * Same as {@link #createView(String, UUID...)} and opens the entry menu right after the creation of the view. * * @param clusterID The id of the root cluster. - * @param dataType The type of the cluster data implementation. * @param viewers The viewers of this view. * @return The newly created view. - * @param The type of the data implementation. */ - GuiViewManager createViewAndOpen(String clusterID, Class dataType, UUID... viewers); + GuiViewManager createViewAndOpen(String clusterID, UUID... viewers); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java index 246836ca2..85a7e3d5b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java @@ -29,37 +29,25 @@ public abstract class GuiAPIManagerCommonImpl implements GuiAPIManager { protected final WolfyUtils wolfyUtils; - private final BiMap> clustersMap = HashBiMap.create(); + private final BiMap clustersMap = HashBiMap.create(); public GuiAPIManagerCommonImpl(WolfyUtils wolfyUtils) { this.wolfyUtils = wolfyUtils; } - public abstract void registerCluster(String id, Class dataType, Consumer> clusterBuilderConsumer); - - protected void registerCluster(Cluster cluster) { - Preconditions.checkArgument(!clustersMap.containsKey(cluster.getID()), "A cluster with the id '" + cluster.getID() + "' is already registered!"); - clustersMap.put(cluster.getID(), cluster); + protected void registerCluster(Router router) { + Preconditions.checkArgument(!clustersMap.containsKey(router.getID()), "A cluster with the id '" + router.getID() + "' is already registered!"); + clustersMap.put(router.getID(), router); } - public GuiViewManager createViewAndOpen(String clusterID, Class dataType, UUID... players) { - GuiViewManager handler = createView(clusterID, dataType, players); + public GuiViewManager createViewAndOpen(String clusterID, UUID... players) { + GuiViewManager handler = createView(clusterID, players); handler.openNew(); return handler; } @Override - @SuppressWarnings("unchecked") - public Optional> getCluster(String id, Class dataType) { - Cluster cluster = clustersMap.get(id); - if (cluster != null && cluster.dataType().equals(dataType)) { - return Optional.of((Cluster) cluster); // We checked the data type, so we can cast it. - } - return Optional.empty(); - } - - @Override - public Optional> getCluster(String id) { + public Optional getRouter(String id) { return Optional.of(clustersMap.get(id)); } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java index f2b62b416..d9208e279 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java @@ -18,10 +18,10 @@ package com.wolfyscript.utilities.common.gui; -public interface GuiHolder { +public interface GuiHolder { - GuiViewManager getViewManager(); + GuiViewManager getViewManager(); - Window getCurrentWindow(); + Window getCurrentWindow(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java index 25a6da6a3..1718520f4 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java @@ -18,23 +18,23 @@ package com.wolfyscript.utilities.common.gui; -public abstract class GuiHolderCommonImpl implements GuiHolder { +public abstract class GuiHolderCommonImpl implements GuiHolder { - protected final Window currentWindow; - protected final GuiViewManager viewManager; + protected final Window currentWindow; + protected final GuiViewManager viewManager; - public GuiHolderCommonImpl(Window currentWindow, GuiViewManager viewManager) { + public GuiHolderCommonImpl(Window currentWindow, GuiViewManager viewManager) { this.currentWindow = currentWindow; this.viewManager = viewManager; } @Override - public Window getCurrentWindow() { + public Window getCurrentWindow() { return currentWindow; } @Override - public GuiViewManager getViewManager() { + public GuiViewManager getViewManager() { return viewManager; } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index 35aa5e5c2..31b75fcb3 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -22,17 +22,15 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; -import org.jetbrains.annotations.NotNull; /** * The GuiViewManager, as the name suggests, manages a view of the GUI for one or more players.
- * It contains the custom Data ({@link D}) object that stores all the required data of this view.
+ * It contains the custom Data object that stores all the required data of this view.
* * The view is immutable, so you need to create a new view each time you need to add a viewer or change the root. * - * @param The custom data object type. */ -public interface GuiViewManager { +public interface GuiViewManager { /** * Opens a new menu under the specific path. @@ -58,29 +56,21 @@ public interface GuiViewManager { */ void openPrevious(); - /** - * Gets the data object of this view manager. - * - * @return The data of this view manager. - */ - @NotNull - D getData(); - /** * The root cluster of this view manager. * This is used for methods like {@link #openNew()} to open the entry menu. * * @return The root cluster of this view manager. */ - Cluster getRoot(); + Router getRoot(); /** * Gets the currently active menu. - * This may be a {@link Window}, {@link Cluster}, or any other {@link MenuComponent}. + * This may be a {@link Window}, {@link Router }, or any other {@link MenuComponent}. * * @return The currently active menu. */ - Optional> getCurrentMenu(); + Optional getCurrentMenu(); /** * Gets the viewers that are handled by this view manager. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java index 6ac0ffdcb..621ff1efd 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -27,47 +27,37 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; -import org.jetbrains.annotations.NotNull; -public abstract class GuiViewManagerCommonImpl implements GuiViewManager { +public abstract class GuiViewManagerCommonImpl implements GuiViewManager { private final WolfyUtils wolfyUtils; - private final Cluster root; - private final Deque> history; + private final Router root; + private final Deque history; private final Set viewers; - private final D data; - protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Cluster rootCluster, Set viewers) { + protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Router rootRouter, Set viewers) { this.wolfyUtils = wolfyUtils; - this.root = rootCluster; + this.root = rootRouter; this.history = new ArrayDeque<>(); this.viewers = viewers; // Construct custom data instance Injector injector = Guice.createInjector(binder -> { binder.bind(WolfyUtils.class).toInstance(wolfyUtils); - binder.bind(Cluster.class).toInstance(root); - binder.bind(new TypeLiteral>(){}).toInstance(this); - binder.bind(new TypeLiteral>(){}).toInstance(viewers); + binder.bind(Router.class).toInstance(root); + binder.bind(new TypeLiteral() { + }).toInstance(this); + binder.bind(new TypeLiteral>() { + }).toInstance(viewers); }); - data = injector.getInstance(rootCluster.dataType()); - } - - @NotNull - public D getData() { - return data; } @Override public void openNew(String... path) { root.getChild(path).ifPresent(component -> { - if (component instanceof MenuComponent menu) { - for (UUID viewer : viewers) { - menu.open(this, viewer); - } - history.push(menu); // push the new menu to the history - } else { - throw new IllegalArgumentException("Cannot open non-menu Component!"); + for (UUID viewer : viewers) { + component.open(this, viewer); } + history.push(component); // push the new menu to the history }); } @@ -81,7 +71,7 @@ public void open() { if (history.isEmpty()) { openNew(); } else { - MenuComponent component = history.peek(); + MenuComponent component = history.peek(); viewers.forEach(uuid -> component.open(this, uuid)); } } @@ -96,7 +86,7 @@ public void openPrevious() { } @Override - public Optional> getCurrentMenu() { + public Optional getCurrentMenu() { return Optional.ofNullable(history.peek()); } @@ -106,7 +96,7 @@ public WolfyUtils getWolfyUtils() { } @Override - public Cluster getRoot() { + public Router getRoot() { return root; } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java new file mode 100644 index 000000000..531665287 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java @@ -0,0 +1,44 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface Interactable { + + /** + * Called when an interaction occurs inside the Component.
+ * This may be called if a child Component is interacted with, for example a Button will cause this interaction to
+ * propagate from the root Cluster, down the Windows to the Button that caused the interaction to be called.
+ *
+ * For this behaviour any implementation must first call the parent interaction, before continuing.
+ * Only if there is no parent available (root Component) it continues, going back to the interaction cause.
+ * + * @param holder The holder that caused the interaction. + * @param interactionDetails The details about the interaction. + * @return The interaction result. + */ + InteractionResult interact(GuiHolder holder, ComponentState state, InteractionDetails interactionDetails); + + /** + * Called whenever an interaction occurs.
+ * This propagates from the root Component to the Component that caused the interaction. + * + * @return The interaction callback + */ + InteractionCallback interactCallback(); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java index f02f71692..e372af016 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java @@ -19,8 +19,8 @@ package com.wolfyscript.utilities.common.gui; @FunctionalInterface -public interface InteractionCallback { +public interface InteractionCallback { - InteractionResult interact(GuiHolder holder, D data, Component component, InteractionDetails details); + InteractionResult interact(GuiHolder holder, ComponentState state, InteractionDetails details); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java index 553572349..79218c734 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionDetails.java @@ -1,6 +1,6 @@ package com.wolfyscript.utilities.common.gui; -public interface InteractionDetails { +public interface InteractionDetails { boolean isCancelled(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java index 04c563e3b..824e4f46e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java @@ -20,10 +20,7 @@ import java.util.UUID; -public interface MenuComponent extends Component { - - @Override - MenuComponent parent(); +public interface MenuComponent { /** * Opens this component for the specified view and player.
@@ -31,5 +28,5 @@ public interface MenuComponent extends Component { * @param viewManager The view manager to open. * @param uuid The uuid to open the Window for. */ - void open(GuiViewManager viewManager, UUID uuid); + void open(GuiViewManager viewManager, UUID uuid); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java similarity index 84% rename from src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java index 3ff5cdf33..ddd6e9c67 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderPreCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java @@ -18,9 +18,8 @@ package com.wolfyscript.utilities.common.gui; -@FunctionalInterface -public interface RenderPreCallback { +public interface Positionable { - void run(GuiHolder holder, D data, Component component, RenderContext context); + int getPosition(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java index 31aff56d4..1e128ed2d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java @@ -19,8 +19,8 @@ package com.wolfyscript.utilities.common.gui; @FunctionalInterface -public interface RenderCallback { +public interface RenderCallback { - void render(GuiHolder holder, D data, Component component, RenderContext context); + void render(GuiHolder holder, ComponentState state); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index cd11bc512..9e46b9d86 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -18,11 +18,15 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.items.ItemStackConfig; + /** * The data that contains all the information needed to render the Menu. * - * @param */ -public interface RenderContext { - //TODO +public interface RenderContext { + + ComponentState getCurrentState(); + + void setStack(int slot, ItemStackConfig stackConfig); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java similarity index 70% rename from src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java index 54e225cb2..9039ae4b2 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterStateBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java @@ -18,14 +18,22 @@ package com.wolfyscript.utilities.common.gui; -public interface ClusterStateBuilder extends ComponentState.Builder> { +public interface Renderable { /** - * Clusters can only render child menus, that were configured using the ClusterComponentBuilder. + * Called whenever a Component is rendered. * - * @param childID The id of the child MenuComponent. - * @return This builder to allow for chaining. + * @param holder + * @param context */ - ClusterStateBuilder childComponentToRender(String childID); + void render(GuiHolder holder, ComponentState state, RenderContext context); + + /** + * Called each time the Component or a child Component is rendered in the GUI. + * + * + * @return + */ + RenderCallback renderCallback(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java b/src/main/java/com/wolfyscript/utilities/common/gui/Router.java similarity index 78% rename from src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Router.java index b1c7a873f..8357c6321 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Cluster.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Router.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import java.util.Optional; import java.util.Set; /** @@ -29,26 +30,25 @@ * * @param The type of the data implementation. */ -public interface Cluster extends MenuComponent { +public interface Router extends MenuComponent, Component, BranchComponent, Interactable { + + @Override + Router parent(); /** * Gets the entry menu Component that is opened by default. * * @return The entry Component. */ - MenuComponent entry(); + RouterEntry entry(); - @Override - Cluster parent(); + Optional getRoute(String routeID); - @Override - Set> children(); + Set childRoutes(); - /** - * The type is specified for root Clusters and propagated to the children. - * - * @return The type of the data implementation. - */ - Class dataType(); + @Override + Set childComponents(); + @Override + Optional getChild(String... path); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java new file mode 100644 index 000000000..37abf108b --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java @@ -0,0 +1,33 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.function.Consumer; + +public interface RouterBuilder { + + RouterBuilder entry(Consumer entryBuilder); + + RouterBuilder children(Consumer childComponentBuilderConsumer); + + RouterBuilder interact(InteractionCallback interactionCallback); + + Router create(Router parent); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java new file mode 100644 index 000000000..8d69e1dd4 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java @@ -0,0 +1,30 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.function.Consumer; + +public interface RouterChildBuilder { + + RouterChildBuilder window(String id, Consumer builderConsumer); + + RouterChildBuilder router(String id, Consumer builderConsumer); + + void applyTo(Router parent); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java new file mode 100644 index 000000000..0622723f5 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java @@ -0,0 +1,34 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface RouterEntry { + + String id(); + + Type type(); + + MenuComponent component(); + + enum Type { + WINDOW, + ROUTER + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java new file mode 100644 index 000000000..703a871db --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java @@ -0,0 +1,27 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface RouterEntryBuilder { + + RouterEntryBuilder window(String id); + + RouterEntryBuilder route(String id); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java similarity index 63% rename from src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java index 09f8cf3c3..3505e80cb 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ClusterChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java @@ -18,15 +18,24 @@ package com.wolfyscript.utilities.common.gui; -import com.google.common.collect.BiMap; -import java.util.function.Consumer; - -public interface ClusterChildComponentBuilder extends ChildComponentBuilder { +/** + * This Component represents components that have a specific width and height.
+ * They can only be placed into non-sized Components or Components of the same or bigger dimension. + */ +public interface SizedComponent extends Component { - ClusterChildComponentBuilder window(String id, Consumer> builderConsumer); + /** + * Gets the width of this Component in slot count. + * + * @return The width in slots. + */ + int width(); - ClusterChildComponentBuilder cluster(String id, Consumer> builderConsumer); + /** + * Gets the width of this Component in slot count. + * + * @return The height in slots. + */ + int height(); - @Override - BiMap> create(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java b/src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java new file mode 100644 index 000000000..6ffbd8afa --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java @@ -0,0 +1,58 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.function.Function; + +/** + * StateHooks are used to keep track of the component data and update the component when that data changes. + * + * @param The type of the value this hook holds. + */ +public interface StateHook { + + /** + * Gets the currently active data for this hook. + * + * @return The current data of this hook. + */ + V get(); + + /** + * Sets a new value for this hook.
+ * Whenever that new value is unequal to the current value it causes the component to update.
+ * In case a non-primitive value is used, then {@link Object#equals(Object)} should be implemented. + * + * @param newValue The new value for this hook. + * @see #set(Function) + */ + void set(V newValue); + + /** + * Updates the current value of this hook.
+ * This method will always cause the component to update.
+ * It should be preferred over {@link #set(V)} whenever it is a more complex object, + * where mutation is faster, then reallocating it. + * + * @param update The function used to update the value. + * @see #set(V) + */ + void set(Function update); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java b/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java index fd202aeca..e9a0c68af 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/StateSelector.java @@ -18,8 +18,8 @@ package com.wolfyscript.utilities.common.gui; -public interface StateSelector { +public interface StateSelector { - int run(GuiHolder holder, D data, Component component); + int run(GuiHolder holder, Object data, Component component); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java new file mode 100644 index 000000000..f93a33b67 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java @@ -0,0 +1,25 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface Stateful { + + + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index 02c6a6a69..fe0c6bac1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -20,15 +20,13 @@ import java.util.Optional; import java.util.Set; -import net.kyori.adventure.text.Component; -public interface Window extends MenuComponent { +public interface Window extends MenuComponent, SizedComponent, BranchComponent, Component, Interactable, Renderable { @Override - MenuComponent parent(); + Router parent(); - @Override - Set> children(); + Set childComponents(); /** * Gets the type that is configured for this Window.
@@ -54,6 +52,8 @@ public interface Window extends MenuComponent { * @param holder The holder to create the title for. * @return The title component. */ - Component createTitle(GuiHolder holder); + net.kyori.adventure.text.Component createTitle(GuiHolder holder); + @Override + Class getComponentStateType(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java index 2286e0901..96f0b3dac 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java @@ -20,8 +20,9 @@ import com.google.common.collect.BiMap; -public interface WindowChildComponentBuilder extends ChildComponentBuilder { +public interface WindowChildComponentBuilder extends ChildComponentBuilder { - @Override - BiMap> create(); + BiMap create(); + + void applyTo(Window window); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java deleted file mode 100644 index 28db95ea3..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowCommonImpl.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import com.google.common.base.Preconditions; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.wolfyscript.utilities.NamespacedKey; -import com.wolfyscript.utilities.common.WolfyUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.function.Consumer; - -public abstract class WindowCommonImpl implements Window { - - protected final WolfyUtils wolfyUtils; - protected final String id; - protected final MenuComponent parent; - protected final WindowState[] states; - protected final StateSelector stateSelector; - protected final BiMap> children; - protected final Integer size; - protected final WindowType type; - protected final WindowTitleUpdateCallback titleUpdateCallback; - - protected WindowCommonImpl(String id, Cluster parent, WindowTitleUpdateCallback titleUpdateCallback, StateSelector stateSelector, WindowState[] states, BiMap> children, Integer size, WindowType type) { - this.id = id; - this.parent = parent; - this.titleUpdateCallback = titleUpdateCallback; - this.wolfyUtils = parent.getWolfyUtils(); - this.stateSelector = stateSelector; - this.states = states; - this.children = HashBiMap.create(children); - Preconditions.checkArgument(size != null || type != null, "Either type or size must be specified!"); - this.size = size; - this.type = type; - } - - @Override - public WolfyUtils getWolfyUtils() { - return wolfyUtils; - } - - @Override - public String getID() { - return id; - } - - @Override - public Set> children() { - return children.values(); - } - - @Override - public MenuComponent parent() { - return parent; - } - - @Override - public Optional> getChild(String id) { - return Optional.ofNullable(children.get(id)); - } - - @Override - public WindowState getState(GuiHolder holder) { - return states[stateSelector.run(holder, holder.getViewManager().getData(), this)]; - } - - @Override - public Optional getSize() { - return Optional.ofNullable(size); - } - - @Override - public Optional getType() { - return Optional.ofNullable(type); - } - - @Override - public net.kyori.adventure.text.Component createTitle(GuiHolder holder) { - return titleUpdateCallback.run(holder, holder.getViewManager().getData(), this); - } - - @Override - public void init() { - - } - - @Override - public void open(GuiViewManager handler, UUID player) { - // This is the final destination and can be opened - // Start rendering here - - - } - - public static abstract class Builder implements WindowComponentBuilder { - - protected final String subID; - protected final Cluster parent; - protected StateSelector stateSelector; - protected final List> stateBuilders = new ArrayList<>(); - protected final WindowChildComponentBuilder childComponentBuilder; - protected Integer size; - protected WindowType type; - protected WindowTitleUpdateCallback titleUpdateCallback; - - protected Builder(String subID, Cluster parent, WindowChildComponentBuilder childComponentBuilder) { - this.subID = subID; - this.parent = parent; - this.childComponentBuilder = childComponentBuilder; - } - - @Override - public Builder size(int size) { - this.size = size; - return this; - } - - @Override - public Builder type(WindowType type) { - this.type = type; - return this; - } - - @Override - public Builder title(WindowTitleUpdateCallback titleUpdateCallback) { - this.titleUpdateCallback = titleUpdateCallback; - return this; - } - - @Override - public Builder stateSelector(StateSelector stateSelector) { - this.stateSelector = stateSelector; - return this; - } - - @Override - public abstract Builder state(Consumer> stateBuilderConsumer); - - @Override - public Builder children(Consumer> childComponentBuilderConsumer) { - childComponentBuilderConsumer.accept(childComponentBuilder); - return this; - } - - @Override - public Window create() { - return constructImplementation(parent.getID() + "/" + subID, - parent, - stateSelector == null ? (holder, data, component) -> 0 : stateSelector, - stateBuilders.stream().map(WindowStateBuilder::create).>toArray(WindowState[]::new), - childComponentBuilder.create(), - size, type - ); - } - - protected abstract Window constructImplementation(String id, Cluster cluster, StateSelector stateSelector, WindowState[] states, BiMap> children, Integer size, WindowType type); - - } - - public static class ChildBuilder implements WindowChildComponentBuilder { - - private final Cluster parent; - private final BiMap> children = HashBiMap.create(); - - protected ChildBuilder(Cluster parent) { - this.parent = parent; - } - - @Override - public > WindowChildComponentBuilder custom(String subID, NamespacedKey builderId, Class builderType, Consumer builderConsumer) { - // TODO - return this; - } - - @Override - public BiMap> create() { - return children; - } - } -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java index 6bef6a6ed..6b6bf1ee5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java @@ -26,7 +26,7 @@ * * @param The type of the data implementation. */ -public interface WindowComponentBuilder extends Component.Builder, WindowChildComponentBuilder, WindowStateBuilder> { +public interface WindowComponentBuilder { /** * The size of the inventory.
@@ -36,7 +36,7 @@ public interface WindowComponentBuilder extends Component.Builde * @param size The size of the inventory. * @return This builder to allow chaining the methods. */ - WindowComponentBuilder size(int size); + WindowComponentBuilder size(int size); /** * The type of the inventory.
@@ -46,7 +46,7 @@ public interface WindowComponentBuilder extends Component.Builde * @param type * @return This builder to allow chaining the methods. */ - WindowComponentBuilder type(@Nullable WindowType type); + WindowComponentBuilder type(@Nullable WindowType type); /** *

@@ -61,6 +61,12 @@ public interface WindowComponentBuilder extends Component.Builde * @param titleUpdateCallback * @return */ - WindowComponentBuilder title(WindowTitleUpdateCallback titleUpdateCallback); + WindowComponentBuilder title(WindowTitleUpdateCallback titleUpdateCallback); + + WindowComponentBuilder interact(InteractionCallback interactionCallback); + + WindowComponentBuilder render(RenderCallback renderCallback); + + Window create(Router parent); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java index 129168e88..bb0e979e3 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java @@ -20,8 +20,8 @@ import java.util.Map; -public interface WindowState extends ComponentState { +public interface WindowState extends ButtonState { - Map> getComponentPositions(); + Map getComponentPositions(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java index ab1959391..cac208072 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java @@ -18,10 +18,10 @@ package com.wolfyscript.utilities.common.gui; -public interface WindowStateBuilder extends ComponentState.Builder> { +public interface WindowStateBuilder extends ButtonState.Builder { - WindowStateBuilder childSlot(int slot, String childID); + WindowStateBuilder childSlot(int slot, String childID); - WindowStateBuilder componentSlot(int slot, String... pathFromRoot); + WindowStateBuilder componentSlot(int slot, String... pathFromRoot); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java index bbceb0ba0..585100ebe 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java @@ -20,8 +20,8 @@ import net.kyori.adventure.text.Component; -public interface WindowTitleUpdateCallback { +public interface WindowTitleUpdateCallback { - Component run(GuiHolder holder, D data, Window window); + Component run(GuiHolder holder, Window window); } From 57d0b753ba90bb09e2bfe5bfc933122ccfbfb4ae Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:14:00 +0200 Subject: [PATCH 032/117] Add separate RouterState interface --- .../utilities/common/gui/RouterState.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java new file mode 100644 index 000000000..298d0faa6 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java @@ -0,0 +1,24 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +public interface RouterState extends ComponentState { + + +} From e10a950c8908b9cbacf4f7c28e21871086ef6038 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:14:25 +0200 Subject: [PATCH 033/117] Add ButtonIcon interface --- .../utilities/common/gui/ButtonIcon.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java new file mode 100644 index 000000000..af7d2429e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java @@ -0,0 +1,29 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.items.ItemStackConfig; + +public interface ButtonIcon { + + ItemStackConfig getStack(); + + boolean isDynamic(); + +} From 41460e4ffcb5c2618d284518cf75d62e03b0e9d4 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:15:07 +0200 Subject: [PATCH 034/117] Add ButtonIcon getter to Button interface --- .../com/wolfyscript/utilities/common/gui/Button.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Button.java b/src/main/java/com/wolfyscript/utilities/common/gui/Button.java index 31b81a830..02a64397f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Button.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Button.java @@ -18,7 +18,12 @@ package com.wolfyscript.utilities.common.gui; -public interface Button extends Component, Interactable, Renderable, SizedComponent { +/** + * A simple button that has an icon (ItemStack) and an interaction callback. + * It always has a 1x1 size, because it occupies a single slot. + * + */ +public interface Button extends Component, Stateful, Interactable, SizedComponent { @Override default int width() { @@ -29,4 +34,6 @@ default int width() { default int height() { return 1; } + + ButtonIcon icon(); } From 0d111eac602e7749e461fa2ad68ccc042a7c2523 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:15:41 +0200 Subject: [PATCH 035/117] Add ButtonBuilder interface to create Buttons --- .../utilities/common/gui/ButtonBuilder.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java new file mode 100644 index 000000000..1f46fd14b --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java @@ -0,0 +1,48 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.items.ItemStackConfig; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public interface ButtonBuilder { + + ButtonBuilder icon(Consumer icon); + + ButtonBuilder interact(InteractionCallback interactionCallback); + + ButtonBuilder useSignal(String key, Class type, Consumer> signalBuilder); + + Button create(SizedComponent parent); + + interface IconBuilder { + + IconBuilder stack(ItemStackConfig stackConfig); + + IconBuilder stack(Supplier> stackConfigSupplier); + + IconBuilder dynamic(); + + IconBuilder dynamic(boolean isDynamic); + + ButtonIcon create(); + } + +} From 13434ae27e37d56ad0346531fe2a9fe66856e597 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:16:06 +0200 Subject: [PATCH 036/117] Add ButtonComponentState --- .../{ComponentStateWindow.java => ButtonComponentState.java} | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{ComponentStateWindow.java => ButtonComponentState.java} (88%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateWindow.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonComponentState.java similarity index 88% rename from src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateWindow.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ButtonComponentState.java index 4ef556f68..d4d7b62e9 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentStateWindow.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonComponentState.java @@ -18,8 +18,5 @@ package com.wolfyscript.utilities.common.gui; -public interface ComponentStateWindow extends ComponentState { - - void setComponent(int slot, String componentID); - +public interface ButtonComponentState extends ComponentState { } From 8c75839087993907987793c7a8f10bfe9f8fdacb Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:16:46 +0200 Subject: [PATCH 037/117] Remove Component#getComponentStateType --- .../wolfyscript/utilities/common/gui/Component.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 61bbf747c..d24b823c3 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -21,7 +21,6 @@ import com.wolfyscript.utilities.common.WolfyUtils; import java.util.ArrayDeque; import java.util.Deque; -import java.util.function.Consumer; public interface Component { @@ -59,16 +58,4 @@ default Deque getPathToRoot() { return path; } - Class getComponentStateType(); - - /** - * Builder used to create Components.
- * A Builder should always be preferred over creating Components via constructor. - * - * @param - */ - interface Builder { - - } - } From 347c57319e6b368991389c59ec8a0813700a53ef Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:18:32 +0200 Subject: [PATCH 038/117] Add Signal that handles updates and state values --- .../gui/{Compositor.java => Signal.java} | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{Compositor.java => Signal.java} (63%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Compositor.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java similarity index 63% rename from src/main/java/com/wolfyscript/utilities/common/gui/Compositor.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Signal.java index db056b517..8d3932573 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Compositor.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java @@ -18,10 +18,36 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.items.ItemStackConfig; +import java.util.function.Function; -public interface Compositor> { +public interface Signal { - void setStack(int slot, T stackConfig); + String key(); + + Class messageType(); + + Value createMessage(ComponentState state); + + interface Value { + + Signal signal(); + + ComponentState state(); + + void update(T newValue); + + void update(Function updateFunction); + + T get(); + + } + + interface Builder { + + Builder defaultValue(Function defaultValueFunction); + + Signal create(); + + } } From 2701397dc922dc383bdb11c9f24d5357f1b7604b Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:19:15 +0200 Subject: [PATCH 039/117] Add Stateful#createState, #signals, and #getSignal --- .../wolfyscript/utilities/common/gui/Stateful.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java index f93a33b67..733dc450b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java @@ -18,8 +18,19 @@ package com.wolfyscript.utilities.common.gui; -public interface Stateful { +import java.util.Map; +import java.util.Optional; +public interface Stateful { + S createState(ComponentState parentState); + + Map> signals(); + + default Optional> getSignal(String key, Class type) { + Signal signal = signals().get(key); + if (signal != null && signal.messageType() == type) return Optional.of((Signal) signal); + return Optional.empty(); + } } From 25e93553f1cb54e563753031d34415008e127b15 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:19:43 +0200 Subject: [PATCH 040/117] Replace hooks with signals in ComponentState --- .../utilities/common/gui/ComponentState.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java index 06b27b3b7..262e77f3d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java @@ -18,13 +18,15 @@ package com.wolfyscript.utilities.common.gui; -import java.util.function.Supplier; - public interface ComponentState { + ComponentState getParent(); + Component getOwner(); - StateHook getOrCreateHook(String id, Supplier defaultValue); + Signal.Value captureSignal(String signalKey, Class msgType); + + Signal.Value captureSignal(String signalKey); boolean shouldUpdate(); @@ -32,6 +34,4 @@ public interface ComponentState { void render(GuiHolder holder, RenderContext context); - - } From 7a1236956c7d49e6a3eb55e1b353762681f283a6 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:21:20 +0200 Subject: [PATCH 041/117] Remove common implementation of GuiViewManagerCommonImpl#openNew --- .../common/gui/GuiViewManagerCommonImpl.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java index 621ff1efd..0aba7233e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -51,16 +51,6 @@ protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Router rootRouter, Set }); } - @Override - public void openNew(String... path) { - root.getChild(path).ifPresent(component -> { - for (UUID viewer : viewers) { - component.open(this, viewer); - } - history.push(component); // push the new menu to the history - }); - } - @Override public void openNew() { openNew(new String[0]); @@ -72,7 +62,7 @@ public void open() { openNew(); } else { MenuComponent component = history.peek(); - viewers.forEach(uuid -> component.open(this, uuid)); + //viewers.forEach(uuid -> component.open(this, uuid)); } } @@ -81,7 +71,7 @@ public void openPrevious() { history.poll(); // Remove active current menu getCurrentMenu().ifPresent(previous -> { // Do not add menu to history, as it is already available - viewers.forEach(uuid -> previous.open(this, uuid)); + //viewers.forEach(uuid -> previous.open(this, uuid)); }); } From 94e392b964faad79f1e1f594bad343e00e8fa398 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:23:26 +0200 Subject: [PATCH 042/117] Add context creation and more open parameters to MenuComponent --- .../wolfyscript/utilities/common/gui/MenuComponent.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java index 824e4f46e..d81c518ae 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java @@ -18,9 +18,10 @@ package com.wolfyscript.utilities.common.gui; +import java.util.Deque; import java.util.UUID; -public interface MenuComponent { +public interface MenuComponent { /** * Opens this component for the specified view and player.
@@ -28,5 +29,7 @@ public interface MenuComponent { * @param viewManager The view manager to open. * @param uuid The uuid to open the Window for. */ - void open(GuiViewManager viewManager, UUID uuid); + RenderContext createContext(GuiViewManager viewManager, Deque path, UUID uuid); + + void open(GuiViewManager viewManager, PARENT_STATE parentState, Deque path, UUID player); } From 4c234704226e9cca4d418ccd4e2c478d1fc7f156 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:23:53 +0200 Subject: [PATCH 043/117] Make Renderable state generic --- .../com/wolfyscript/utilities/common/gui/Renderable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java index 9039ae4b2..0df591ea0 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java @@ -18,7 +18,7 @@ package com.wolfyscript.utilities.common.gui; -public interface Renderable { +public interface Renderable { /** * Called whenever a Component is rendered. @@ -26,7 +26,7 @@ public interface Renderable { * @param holder * @param context */ - void render(GuiHolder holder, ComponentState state, RenderContext context); + void render(GuiHolder holder, S state, RenderContext context); /** * Called each time the Component or a child Component is rendered in the GUI. @@ -34,6 +34,6 @@ public interface Renderable { * * @return */ - RenderCallback renderCallback(); + RenderCallback renderCallback(); } From 8840f510ffe7a75b28c2bf1fff087e5f045baf22 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:24:10 +0200 Subject: [PATCH 044/117] Make RenderCallback state generic --- .../com/wolfyscript/utilities/common/gui/RenderCallback.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java index 1e128ed2d..ea46ff459 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java @@ -19,8 +19,8 @@ package com.wolfyscript.utilities.common.gui; @FunctionalInterface -public interface RenderCallback { +public interface RenderCallback { - void render(GuiHolder holder, ComponentState state); + void render(GuiHolder holder, S state); } From 2cc19bb5e5044cc1485dfc902595a19e29b4d99d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:24:41 +0200 Subject: [PATCH 045/117] Add next component and util bound check to RenderContext --- .../utilities/common/gui/RenderContext.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index 9e46b9d86..70e71f1c1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -29,4 +29,15 @@ public interface RenderContext { ComponentState getCurrentState(); void setStack(int slot, ItemStackConfig stackConfig); + + Component next(); + + default boolean checkIfSlotInBounds(int slot) { + if (!(getCurrentState().getOwner().parent() instanceof SizedComponent sizedParent) || slot >= 0 && slot < sizedParent.width() * sizedParent.height()) { + return true; + } else { + throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (sizedParent.width() * sizedParent.height() - 1) + "] !"); + } + } + } From d4e2c90f7d21686e4f35dc95a4104e93877c994d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:25:34 +0200 Subject: [PATCH 046/117] Rename WindowComponentBuilder to WindowBuilder --- ...ComponentBuilder.java => WindowBuilder.java} | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{WindowComponentBuilder.java => WindowBuilder.java} (79%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java similarity index 79% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index 6b6bf1ee5..5e5a2778e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; /** @@ -26,7 +27,7 @@ * * @param The type of the data implementation. */ -public interface WindowComponentBuilder { +public interface WindowBuilder { /** * The size of the inventory.
@@ -36,7 +37,7 @@ public interface WindowComponentBuilder { * @param size The size of the inventory. * @return This builder to allow chaining the methods. */ - WindowComponentBuilder size(int size); + WindowBuilder size(int size); /** * The type of the inventory.
@@ -46,7 +47,7 @@ public interface WindowComponentBuilder { * @param type * @return This builder to allow chaining the methods. */ - WindowComponentBuilder type(@Nullable WindowType type); + WindowBuilder type(@Nullable WindowType type); /** *

@@ -61,11 +62,15 @@ public interface WindowComponentBuilder { * @param titleUpdateCallback * @return */ - WindowComponentBuilder title(WindowTitleUpdateCallback titleUpdateCallback); + WindowBuilder title(WindowTitleUpdateCallback titleUpdateCallback); - WindowComponentBuilder interact(InteractionCallback interactionCallback); + WindowBuilder useSignal(String key, Class type, Consumer> signalBuilder); - WindowComponentBuilder render(RenderCallback renderCallback); + WindowBuilder interact(InteractionCallback interactionCallback); + + WindowBuilder render(RenderCallback renderCallback); + + WindowBuilder children(Consumer children); Window create(Router parent); From 934ac02ef4a2550dda981a68ef089b414efd158b Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:26:16 +0200 Subject: [PATCH 047/117] Make WindowChildComponentBuilder standalone --- .../utilities/common/gui/WindowChildComponentBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java index 96f0b3dac..5b4f24db5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java @@ -18,11 +18,11 @@ package com.wolfyscript.utilities.common.gui; -import com.google.common.collect.BiMap; +import java.util.function.Consumer; -public interface WindowChildComponentBuilder extends ChildComponentBuilder { +public interface WindowChildComponentBuilder { - BiMap create(); + WindowChildComponentBuilder button(String id, Consumer button); void applyTo(Window window); } From e083c607d19cf76f2586dcece44d6cdf54166e2c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:27:00 +0200 Subject: [PATCH 048/117] Add WindowState#setComponent --- .../com/wolfyscript/utilities/common/gui/WindowState.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java index bb0e979e3..5f90c251b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java @@ -18,10 +18,8 @@ package com.wolfyscript.utilities.common.gui; -import java.util.Map; +public interface WindowState extends ComponentState { -public interface WindowState extends ButtonState { - - Map getComponentPositions(); + void setComponent(int slot, String componentID); } From 2dacca9d7c5093e8b208d3e2cb75519a39dcca23 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:27:17 +0200 Subject: [PATCH 049/117] Make WindowStateBuilder standalone --- .../wolfyscript/utilities/common/gui/WindowStateBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java index cac208072..eb3c77258 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java @@ -18,7 +18,7 @@ package com.wolfyscript.utilities.common.gui; -public interface WindowStateBuilder extends ButtonState.Builder { +public interface WindowStateBuilder { WindowStateBuilder childSlot(int slot, String childID); From 8ec1177d69a52295a895c258cf02d51ce7da3aca Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:27:40 +0200 Subject: [PATCH 050/117] Remove state type getter from Window --- .../java/com/wolfyscript/utilities/common/gui/Window.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index fe0c6bac1..2f2533bc7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -21,7 +21,7 @@ import java.util.Optional; import java.util.Set; -public interface Window extends MenuComponent, SizedComponent, BranchComponent, Component, Interactable, Renderable { +public interface Window extends MenuComponent, Stateful, SizedComponent, BranchComponent, Component, Interactable, Renderable { @Override Router parent(); @@ -54,6 +54,4 @@ public interface Window extends MenuComponent, SizedComponent, BranchComponent, */ net.kyori.adventure.text.Component createTitle(GuiHolder holder); - @Override - Class getComponentStateType(); } From c7f7a2f6f45ddc16b442693bf562ae98e05406a4 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:28:29 +0200 Subject: [PATCH 051/117] Update Router to generic MenuComponent --- src/main/java/com/wolfyscript/utilities/common/gui/Router.java | 3 ++- .../java/com/wolfyscript/utilities/common/gui/RouterEntry.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Router.java b/src/main/java/com/wolfyscript/utilities/common/gui/Router.java index 8357c6321..c9b2c1d4a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Router.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Router.java @@ -30,7 +30,7 @@ * * @param The type of the data implementation. */ -public interface Router extends MenuComponent, Component, BranchComponent, Interactable { +public interface Router extends MenuComponent, Stateful, Component, BranchComponent, Interactable { @Override Router parent(); @@ -51,4 +51,5 @@ public interface Router extends MenuComponent, Component, BranchComponent, Inter @Override Optional getChild(String... path); + } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java index 0622723f5..2a46c4193 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java @@ -24,7 +24,7 @@ public interface RouterEntry { Type type(); - MenuComponent component(); + MenuComponent component(); enum Type { WINDOW, From 79e71e1d04cd200a32f3d32a2bf418721d253343 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:28:47 +0200 Subject: [PATCH 052/117] Add useSignal to RouterBuilder --- .../com/wolfyscript/utilities/common/gui/RouterBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java index 37abf108b..cc5688984 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java @@ -28,6 +28,8 @@ public interface RouterBuilder { RouterBuilder interact(InteractionCallback interactionCallback); + RouterBuilder useSignal(String key, Class type, Consumer> signalBuilder); + Router create(Router parent); } From 18d43218899c1f30c8da7f9f0b9ff4e9713f76fa Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 10 Apr 2023 22:29:05 +0200 Subject: [PATCH 053/117] Rename WindowBuilder in RouterChildBuilder --- .../wolfyscript/utilities/common/gui/RouterChildBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java index 8d69e1dd4..a80d3d731 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java @@ -22,7 +22,7 @@ public interface RouterChildBuilder { - RouterChildBuilder window(String id, Consumer builderConsumer); + RouterChildBuilder window(String id, Consumer builderConsumer); RouterChildBuilder router(String id, Consumer builderConsumer); From dfaa6d05dc0349d7e8ed71be404ea31841705c81 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:05:08 +0200 Subject: [PATCH 054/117] Add ComponentBuilderSettings for Builder implementations --- .../common/gui/ComponentBuilderSettings.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilderSettings.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilderSettings.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilderSettings.java new file mode 100644 index 000000000..115a19d7e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilderSettings.java @@ -0,0 +1,34 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ComponentBuilderSettings { + + Class component(); + + Class> base(); + +} From 50ea5d420d50a95e7890ef708b8928e29013db68 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:05:37 +0200 Subject: [PATCH 055/117] Add ComponentBuilder --- .../common/gui/ComponentBuilder.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java new file mode 100644 index 000000000..4cf3cf22b --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -0,0 +1,39 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.wolfyscript.utilities.Keyed; +import com.wolfyscript.utilities.NamespacedKey; + +public interface ComponentBuilder extends Keyed { + + @JsonIgnore + @Override + NamespacedKey getNamespacedKey(); + + default NamespacedKey getType() { + return getNamespacedKey(); + } + + String getID(); + + COMPONENT create(PARENT parent); + +} From 30710b2772658e19625a8cb1414edde32b4daaa8 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:05:54 +0200 Subject: [PATCH 056/117] Add interface for RegistryGUIComponentBuilders --- .../RegistryGUIComponentBuilders.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/registry/RegistryGUIComponentBuilders.java diff --git a/src/main/java/com/wolfyscript/utilities/common/registry/RegistryGUIComponentBuilders.java b/src/main/java/com/wolfyscript/utilities/common/registry/RegistryGUIComponentBuilders.java new file mode 100644 index 000000000..c84f44f7c --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/registry/RegistryGUIComponentBuilders.java @@ -0,0 +1,28 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.registry; + +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; + +public interface RegistryGUIComponentBuilders extends TypeRegistry> { + + Class> getFor(Class componentType); + +} From 58be08251a92653f42f43b2be27d5d89a902176b Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:06:21 +0200 Subject: [PATCH 057/117] Add getters to Signal.Builder to get key and type --- .../java/com/wolfyscript/utilities/common/gui/Signal.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java index 8d3932573..3be159995 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java @@ -44,6 +44,10 @@ interface Value { interface Builder { + String getKey(); + + Class getValueType(); + Builder defaultValue(Function defaultValueFunction); Signal create(); From 76b9632a6d8bd2f6f7723ae3507377b0e2af3a16 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:07:25 +0200 Subject: [PATCH 058/117] Add util method to SizedComponent This util method allows to execute a task on each slot that this component covers in reference to the origin slot. --- .../utilities/common/gui/SizedComponent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java index 3505e80cb..073e6f809 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import java.util.function.Consumer; + /** * This Component represents components that have a specific width and height.
* They can only be placed into non-sized Components or Components of the same or bigger dimension. @@ -38,4 +40,12 @@ public interface SizedComponent extends Component { */ int height(); + default void executeForAllSlots(int positionSlot, Consumer slotFunction) { + for (int i = 0; i < height(); i++) { + for (int j = 0; j < width(); j++) { + slotFunction.accept(positionSlot + j + i * (9 - width())); + } + } + } + } From b1edcb04f88c48228cb28785d525a3bd29117089 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:07:54 +0200 Subject: [PATCH 059/117] Use ComponentBuilder interface for Builders --- .../com/wolfyscript/utilities/common/gui/ButtonBuilder.java | 2 +- .../com/wolfyscript/utilities/common/gui/WindowBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java index 1f46fd14b..efd1522b1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java @@ -22,7 +22,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -public interface ButtonBuilder { +public interface ButtonBuilder extends ComponentBuilder { ButtonBuilder icon(Consumer icon); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index 5e5a2778e..ba2206ff4 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -27,7 +27,7 @@ * * @param The type of the data implementation. */ -public interface WindowBuilder { +public interface WindowBuilder extends ComponentBuilder { /** * The size of the inventory.
From 983305292ef5009b4a4030526dec321c4aa00669 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:08:39 +0200 Subject: [PATCH 060/117] Make Component Keyed to ues it in registries --- .../utilities/common/gui/Component.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index d24b823c3..dd8952df1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -18,11 +18,24 @@ package com.wolfyscript.utilities.common.gui; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.wolfyscript.utilities.Keyed; +import com.wolfyscript.utilities.NamespacedKey; import com.wolfyscript.utilities.common.WolfyUtils; import java.util.ArrayDeque; import java.util.Deque; -public interface Component { +public interface Component extends Keyed { + + @JsonIgnore + @Override + NamespacedKey getNamespacedKey(); + + @JsonGetter("type") + default NamespacedKey type() { + return getNamespacedKey(); + } /** * Gets the unique id (in context of the parent) of this component. From 29344f6562f37d44a558b734c00d423bb40b1b1c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:09:00 +0200 Subject: [PATCH 061/117] Add getters for component and builder registries --- .../wolfyscript/utilities/common/registry/Registries.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/registry/Registries.java b/src/main/java/com/wolfyscript/utilities/common/registry/Registries.java index bb8063427..540d9c868 100644 --- a/src/main/java/com/wolfyscript/utilities/common/registry/Registries.java +++ b/src/main/java/com/wolfyscript/utilities/common/registry/Registries.java @@ -23,6 +23,7 @@ import com.wolfyscript.utilities.NamespacedKey; import com.wolfyscript.utilities.common.WolfyCore; import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.nbt.NBTTagConfig; import com.wolfyscript.utilities.eval.operator.Operator; import com.wolfyscript.utilities.eval.value_provider.ValueProvider; @@ -111,4 +112,8 @@ public TypeRegistry getOperators() { public TypeRegistry getNbtTagConfigs() { return nbtTagConfigs; } + + public abstract TypeRegistry getGuiComponents(); + + public abstract RegistryGUIComponentBuilders getGuiComponentBuilders(); } From 91d3b810d2379a325d2768f661e2bef6fc536634 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:09:43 +0200 Subject: [PATCH 062/117] Use ComponentBuilder interface for RouterBuilder --- .../com/wolfyscript/utilities/common/gui/RouterBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java index cc5688984..f54a185fd 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java @@ -20,7 +20,7 @@ import java.util.function.Consumer; -public interface RouterBuilder { +public interface RouterBuilder extends ComponentBuilder { RouterBuilder entry(Consumer entryBuilder); From 1272bffff76eaae2fe328e6a9cfdb4a27dcc5278 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 12 Apr 2023 23:10:44 +0200 Subject: [PATCH 063/117] Add WindowChildComponentBuilder.custom --- .../utilities/common/gui/WindowChildComponentBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java index 5b4f24db5..0850e574a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java @@ -22,6 +22,8 @@ public interface WindowChildComponentBuilder { + > WindowChildComponentBuilder custom(String componentId, Class builderType, Consumer builderConsumer); + WindowChildComponentBuilder button(String id, Consumer button); void applyTo(Window window); From 42752abf9db8dc87b08ed1b49cc4f61ae66c3fe6 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 13 Apr 2023 20:44:43 +0200 Subject: [PATCH 064/117] Add docs to Signal interface & renamed occurrences of 'message' to 'value' --- .../utilities/common/gui/Signal.java | 84 +++++++++++++++++-- .../utilities/common/gui/Stateful.java | 2 +- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java index 3be159995..552d0af84 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java @@ -20,36 +20,108 @@ import java.util.function.Function; +/** + * Keeps track of value changes and updates Components listening to a Signal accordingly. + * Signals are shared across all children of the Component that creates the Signal, + * meaning that children can listen to that of the parent, but not the other way around! + * + * @param The value type this Signal holds. Can be any Object. + */ public interface Signal { + /** + * The key of this Signal. + * Must be unique in the path of the component, meaning no parent nor child can create a Signal with the same key! + * + * @return The key of this Signal. + */ String key(); - Class messageType(); - - Value createMessage(ComponentState state); - + /** + * The type of the value that this signal tracks. + * + * @return The value type of this signal. + */ + Class valueType(); + + Value createValue(ComponentState state); + + /** + * Bound to a specific ComponentState and View, this is the actual holder of the value and provides methods to update and get the tracked value. + * Each invocation of the update/set methods changes the value and schedules a rerender. + * + * @param The type of value that is tracked. + */ interface Value { + /** + * The Signal that this value belongs to. + * + * @return The signal of this value. + */ Signal signal(); + /** + * The ComponentState that this value belongs to. + * + * @return The ComponentState that tracks this value. + */ ComponentState state(); - void update(T newValue); - + /** + * Sets the tracked value to a new value and causes a re-render. + * + * @param newValue The new value to apply. + */ + void set(T newValue); + + /** + * Gets the tracked value, then updates it, and causes a re-render. + * + * @param updateFunction The function to update the value. + */ void update(Function updateFunction); + /** + * Gets the current value. + * + * @return The current value. + */ T get(); } + /** + * The Builder is used to construct signals for Components (See ComponentBuilder). + * The type is defined by whatever parent Builder constructs this Builder. Usually a ComponentBuilder. + * + * @param The type of the value tracked. + */ interface Builder { + /** + * The key of the Signal. + * Must be unique in the path of the component, meaning no parent nor child can create a Signal with the same key! + * + * @return The key of the Signal. + */ String getKey(); Class getValueType(); + /** + * Defines a function that is used by the signal to provide a default value, whenever requested by a for example ComponentState. + * + * @param defaultValueFunction The function to create a default value. + * @return This Builder instance for chaining. + */ Builder defaultValue(Function defaultValueFunction); + /** + * Creates an instance of the Signal with the predefined settings of this builder. + * + * @return A new instance of a Signal. + */ Signal create(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java index 733dc450b..bdf823c35 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java @@ -29,7 +29,7 @@ public interface Stateful { default Optional> getSignal(String key, Class type) { Signal signal = signals().get(key); - if (signal != null && signal.messageType() == type) return Optional.of((Signal) signal); + if (signal != null && signal.valueType() == type) return Optional.of((Signal) signal); return Optional.empty(); } From 8b024cf9a266125d2f7cfc7ea77438ed4d8c6772 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 13 Apr 2023 20:46:59 +0200 Subject: [PATCH 065/117] Rename & Add methods in WindowState * setComponent(int, String) to renderComponent(int, String) * Add second renderComponent(String) without slot parameter --- .../com/wolfyscript/utilities/common/gui/WindowState.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java index 5f90c251b..b3874f7db 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java @@ -20,6 +20,8 @@ public interface WindowState extends ComponentState { - void setComponent(int slot, String componentID); + void renderComponent(int slot, String componentID); + + void renderComponent(String componentID); } From 288a943216f5bed34fe7939b1a8f1d750586f5c1 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 13 Apr 2023 20:47:23 +0200 Subject: [PATCH 066/117] Added first few docs to ButtonBuilder --- .../utilities/common/gui/ButtonBuilder.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java index efd1522b1..139739c26 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java @@ -22,8 +22,18 @@ import java.util.function.Consumer; import java.util.function.Supplier; +/** + * Builder to create a {@link Button} instance. + * + */ public interface ButtonBuilder extends ComponentBuilder { + /** + * Creates a new {@link IconBuilder} to create the icon of the button. + * + * @param icon The consumer that provides the {@link IconBuilder} + * @return This builder instance for chaining. + */ ButtonBuilder icon(Consumer icon); ButtonBuilder interact(InteractionCallback interactionCallback); @@ -32,6 +42,11 @@ public interface ButtonBuilder extends ComponentBuilder Button create(SizedComponent parent); + /** + * Provides methods to create an icon for Buttons. + * Dynamic icons are recreated each time the component is re-rendered, while static icons are just created once and then reused. + * By default, all icons are static to improve performance. + */ interface IconBuilder { IconBuilder stack(ItemStackConfig stackConfig); From 8a3a837f008258572c64d7ad42314e7a939148bd Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 13 Apr 2023 22:50:13 +0200 Subject: [PATCH 067/117] Add RenderOptions to Window --- .../wolfyscript/utilities/common/gui/Window.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index 2f2533bc7..66b9f1cb2 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import java.util.Map; import java.util.Optional; import java.util.Set; @@ -54,4 +55,16 @@ public interface Window extends MenuComponent, Stateful> renderCallback(); + + Map placement(); + + int[] getSlotsFor(Component component); + + } + } From b915f4698930753ca8775caf3621efd280f986eb Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 13 Apr 2023 22:50:28 +0200 Subject: [PATCH 068/117] Add RenderOptionsBuilder to WindowBuilder --- .../utilities/common/gui/WindowBuilder.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index ba2206ff4..a6edaddc6 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -64,14 +64,24 @@ public interface WindowBuilder extends ComponentBuilder { */ WindowBuilder title(WindowTitleUpdateCallback titleUpdateCallback); - WindowBuilder useSignal(String key, Class type, Consumer> signalBuilder); + WindowBuilder createSignal(String key, Class type, Consumer> signalBuilder); WindowBuilder interact(InteractionCallback interactionCallback); - WindowBuilder render(RenderCallback renderCallback); - WindowBuilder children(Consumer children); + WindowBuilder render(Consumer renderOptionsBuilder); + Window create(Router parent); + interface RenderOptionsBuilder { + + RenderOptionsBuilder position(int slot, String componentID); + + RenderOptionsBuilder custom(RenderCallback renderCallback); + + Window.RenderOptions create(Window window); + + } + } From 6efd115b536639fbcb4796a7a1875edf6ed9dfe8 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 17 Apr 2023 19:40:25 +0200 Subject: [PATCH 069/117] Add Json options to ComponentBuilder --- .../utilities/common/gui/ComponentBuilder.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java index 4cf3cf22b..f1bee3c02 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -19,9 +19,22 @@ package com.wolfyscript.utilities.common.gui; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver; +import com.fasterxml.jackson.databind.annotation.JsonTypeResolver; import com.wolfyscript.utilities.Keyed; import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.json.KeyedTypeIdResolver; +import com.wolfyscript.utilities.json.KeyedTypeResolver; + +@JsonTypeResolver(KeyedTypeResolver.class) +@JsonTypeIdResolver(KeyedTypeIdResolver.class) +@JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type") +@JsonPropertyOrder(value = { "type" }) +@JsonIgnoreProperties(ignoreUnknown = true) public interface ComponentBuilder extends Keyed { @JsonIgnore From e2bc64f676a1d2db42162714688f26e49b0beadc Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 17 Apr 2023 19:41:34 +0200 Subject: [PATCH 070/117] Fix GuiAPIManagerCommonImpl#getRouter breaking on null router --- .../utilities/common/gui/GuiAPIManagerCommonImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java index 85a7e3d5b..e803dcc76 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java @@ -48,6 +48,6 @@ public GuiViewManager createViewAndOpen(String clusterID, UUID... players) { @Override public Optional getRouter(String id) { - return Optional.of(clustersMap.get(id)); + return Optional.ofNullable(clustersMap.get(id)); } } From fcc58aecf39c65917e07ab2e7ce1b824734704db Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 17 Apr 2023 19:42:41 +0200 Subject: [PATCH 071/117] Add KeyedBaseType to WindowBuilder and RouterBuilder --- .../com/wolfyscript/utilities/common/gui/RouterBuilder.java | 2 ++ .../com/wolfyscript/utilities/common/gui/WindowBuilder.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java index f54a185fd..3e04c60df 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java @@ -18,8 +18,10 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; +@KeyedBaseType(baseType = ComponentBuilder.class) public interface RouterBuilder extends ComponentBuilder { RouterBuilder entry(Consumer entryBuilder); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index a6edaddc6..3ec83fa13 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -18,15 +18,15 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; /** * Builder used to create Window Menus.
* - * - * @param The type of the data implementation. */ +@KeyedBaseType(baseType = ComponentBuilder.class) public interface WindowBuilder extends ComponentBuilder { /** From afae2820ae1ce8e2f4d64c5c960de24459d213cd Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Mon, 17 Apr 2023 19:43:05 +0200 Subject: [PATCH 072/117] Add GuiAPIManager#registerRouterFromFile --- .../utilities/common/gui/GuiAPIManager.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index 3b2b7d33d..cdd81a13d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import java.io.File; import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; @@ -38,6 +39,15 @@ public interface GuiAPIManager { */ void registerRouter(String id, Consumer routerBuilderConsumer); + /** + * Registers a new router that it loads from the given file. + * The consumer function provides that newly constructed {@link RouterBuilder}, which can be used to manipulate the builder. + * + * @param file The file to load the router from. + * @param routerBuilderConsumer The function to manipulate the new builder. + */ + void registerRouterFromFile(File file, Consumer routerBuilderConsumer); + /** * Gets the registered router with the specified id.
* From 2a6eee18f44ebc843395b66a37a552b664f5b4c8 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 11 May 2023 00:30:54 +0200 Subject: [PATCH 073/117] Start migrating from render callbacks to constructor callbacks. This is different from the usual way (like in web frameworks like ReactJS), however this allows us to use signals more easily and makes the system less complex, and it's easier to make reactive. (It is of course inspired by other web frameworks) For example, it allows for finer control what part of the rendering logic should update on a signal change, while the previous system just ran everything again. --- .../common/gui/ButtonStateDefault.java | 1 + .../utilities/common/gui/RenderContext.java | 7 +-- .../utilities/common/gui/Renderable.java | 8 --- .../utilities/common/gui/Window.java | 5 +- .../utilities/common/gui/WindowBuilder.java | 3 +- .../gui/WindowChildComponentBuilder.java | 1 + .../common/gui/WindowTitleUpdateCallback.java | 2 +- .../common/gui/{ => components}/Button.java | 7 ++- .../gui/{ => components}/ButtonBuilder.java | 6 ++- .../ButtonComponentState.java | 4 +- .../gui/{ => components}/ButtonIcon.java | 2 +- .../gui/{ => components}/ButtonState.java | 6 ++- .../CallbackInitComponent.java} | 7 ++- .../utilities/common/gui/components/Icon.java | 30 +++++++++++ .../common/gui/components/RenderFunction.java | 50 +++++++++++++++++++ 15 files changed, 118 insertions(+), 21 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/Button.java (81%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/ButtonBuilder.java (87%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/ButtonComponentState.java (88%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/ButtonIcon.java (94%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/ButtonState.java (92%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ComponentConfig.java => components/CallbackInitComponent.java} (78%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java index 01feb2034..cef7294ee 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java @@ -19,6 +19,7 @@ package com.wolfyscript.utilities.common.gui; import com.google.common.base.Preconditions; +import com.wolfyscript.utilities.common.gui.components.ButtonState; import java.util.Objects; public class ButtonStateDefault implements ButtonState { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index 70e71f1c1..c2f3ace0b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -28,16 +28,17 @@ public interface RenderContext { ComponentState getCurrentState(); + int getCurrentOffset(); + void setStack(int slot, ItemStackConfig stackConfig); - Component next(); + void setNativeStack(int slot, Object nativeStack); default boolean checkIfSlotInBounds(int slot) { if (!(getCurrentState().getOwner().parent() instanceof SizedComponent sizedParent) || slot >= 0 && slot < sizedParent.width() * sizedParent.height()) { return true; - } else { - throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (sizedParent.width() * sizedParent.height() - 1) + "] !"); } + throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (sizedParent.width() * sizedParent.height() - 1) + "] !"); } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java index 0df591ea0..3abc242f5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java @@ -20,14 +20,6 @@ public interface Renderable { - /** - * Called whenever a Component is rendered. - * - * @param holder - * @param context - */ - void render(GuiHolder holder, S state, RenderContext context); - /** * Called each time the Component or a child Component is rendered in the GUI. * diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index 66b9f1cb2..6231f2e35 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.components.CallbackInitComponent; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -53,10 +54,12 @@ public interface Window extends MenuComponent, Stateful> renderCallback(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index 3ec83fa13..31125cff5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.components.CallbackInitComponent; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; @@ -70,7 +71,7 @@ public interface WindowBuilder extends ComponentBuilder { WindowBuilder children(Consumer children); - WindowBuilder render(Consumer renderOptionsBuilder); + WindowBuilder render(CallbackInitComponent render); Window create(Router parent); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java index 0850e574a..bb9a64738 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.components.ButtonBuilder; import java.util.function.Consumer; public interface WindowChildComponentBuilder { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java index 585100ebe..c368d11da 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java @@ -22,6 +22,6 @@ public interface WindowTitleUpdateCallback { - Component run(GuiHolder holder, Window window); + Component run(GuiHolder holder, Window window, WindowState state); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Button.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java similarity index 81% rename from src/main/java/com/wolfyscript/utilities/common/gui/Button.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java index 02a64397f..8ab4fffe3 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Button.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java @@ -16,7 +16,12 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.Interactable; +import com.wolfyscript.utilities.common.gui.SizedComponent; +import com.wolfyscript.utilities.common.gui.Stateful; /** * A simple button that has an icon (ItemStack) and an interaction callback. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java similarity index 87% rename from src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index 139739c26..eea01222d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -16,8 +16,12 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; +import com.wolfyscript.utilities.common.gui.InteractionCallback; +import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.SizedComponent; import com.wolfyscript.utilities.common.items.ItemStackConfig; import java.util.function.Consumer; import java.util.function.Supplier; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java similarity index 88% rename from src/main/java/com/wolfyscript/utilities/common/gui/ButtonComponentState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java index d4d7b62e9..773280d7e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonComponentState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java @@ -16,7 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.ComponentState; public interface ButtonComponentState extends ComponentState { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java similarity index 94% rename from src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java index af7d2429e..f6751725b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonIcon.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.items.ItemStackConfig; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java similarity index 92% rename from src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java index ca7a8bb8e..4701d1dca 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java @@ -16,7 +16,11 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.InteractionCallback; +import com.wolfyscript.utilities.common.gui.RenderCallback; +import com.wolfyscript.utilities.common.gui.StateSelector; /** *

diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentConfig.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java similarity index 78% rename from src/main/java/com/wolfyscript/utilities/common/gui/ComponentConfig.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java index 9c33a7ce7..a8f382d90 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentConfig.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java @@ -16,10 +16,13 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; -public interface ComponentConfig { +import com.wolfyscript.utilities.common.gui.GuiHolder; +@FunctionalInterface +public interface CallbackInitComponent { + void run(GuiHolder holder, RenderFunction render); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java new file mode 100644 index 000000000..4f4af38b4 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java @@ -0,0 +1,30 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentState; +import com.wolfyscript.utilities.common.gui.Stateful; +import com.wolfyscript.utilities.common.items.ItemStackConfig; + +public interface Icon extends Component, Stateful { + + ItemStackConfig getItemStackConfig(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java new file mode 100644 index 000000000..3e2d5c24a --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java @@ -0,0 +1,50 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.WindowBuilder; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +public interface RenderFunction { + + Signal.Value createSignal(String key, Class type, Supplier defaultValue); + + RenderFunction component(int i, String id); + + RenderFunction component(String id); + + R reactive(Signal.Value signal, Consumer> provideRenderFunction); + + RenderFunction then(); + + interface Conditional { + + Conditional then(Supplier render); + + RenderFunction orElse(Supplier render); + + RenderFunction orIgnore(); + + } + + +} From a7ec3792539f803fb10c0a10871abed60e67868d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 18 May 2023 22:32:28 +0200 Subject: [PATCH 074/117] Update progress This is bound to the changes in WolfyUtils-Spigot. * Router, Window are no longer Components * So the builders are no longer ComponentBuilders * Add WindowRenderer for the title method --- .../utilities/common/gui/BranchComponent.java | 59 ------- .../utilities/common/gui/Component.java | 29 +++- .../common/gui/ComponentBuilder.java | 2 +- ...terState.java => ComponentCollection.java} | 7 +- .../utilities/common/gui/GuiAPIManager.java | 2 + .../common/gui/GuiAPIManagerCommonImpl.java | 2 +- .../utilities/common/gui/GuiHolder.java | 2 + .../common/gui/GuiHolderCommonImpl.java | 2 + .../utilities/common/gui/GuiViewManager.java | 6 +- .../common/gui/GuiViewManagerCommonImpl.java | 30 ++-- .../common/gui/NativeRendererModule.java | 29 ++++ .../utilities/common/gui/RenderContext.java | 5 +- .../utilities/common/gui/Renderable.java | 10 +- .../utilities/common/gui/Renderer.java | 72 ++++++++ .../{MenuComponent.java => Signalable.java} | 17 +- .../utilities/common/gui/SizedComponent.java | 51 ------ .../gui/{AreaComponent.java => State.java} | 3 +- .../utilities/common/gui/Stateful.java | 2 +- .../utilities/common/gui/Window.java | 73 -------- .../utilities/common/gui/WindowRenderer.java | 35 ++++ .../common/gui/components/Button.java | 3 +- .../common/gui/components/ButtonBuilder.java | 6 +- .../gui/components/CallbackInitComponent.java | 3 +- .../common/gui/components/RenderFunction.java | 50 ------ .../common/gui/{ => components}/Router.java | 38 +++-- .../gui/{ => components}/RouterBuilder.java | 15 +- .../{ => components}/RouterChildBuilder.java | 2 +- .../gui/{ => components}/RouterEntry.java | 8 +- .../{ => components}/RouterEntryBuilder.java | 2 +- .../common/gui/components/Window.java | 161 ++++++++++++++++++ .../gui/{ => components}/WindowBuilder.java | 27 ++- .../WindowChildComponentBuilder.java | 7 +- .../gui/{ => components}/WindowState.java | 9 +- .../{ => components}/WindowStateBuilder.java | 2 +- .../WindowTitleUpdateCallback.java | 3 +- 35 files changed, 436 insertions(+), 338 deletions(-) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java rename src/main/java/com/wolfyscript/utilities/common/gui/{RouterState.java => ComponentCollection.java} (83%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/NativeRendererModule.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java rename src/main/java/com/wolfyscript/utilities/common/gui/{MenuComponent.java => Signalable.java} (65%) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java rename src/main/java/com/wolfyscript/utilities/common/gui/{AreaComponent.java => State.java} (94%) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Window.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/Router.java (58%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/RouterBuilder.java (66%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/RouterChildBuilder.java (95%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/RouterEntry.java (86%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/RouterEntryBuilder.java (94%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/WindowBuilder.java (80%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/WindowChildComponentBuilder.java (74%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/WindowState.java (75%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/WindowStateBuilder.java (94%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => components}/WindowTitleUpdateCallback.java (89%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java deleted file mode 100644 index a384ff35d..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/BranchComponent.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import java.util.Arrays; -import java.util.Optional; -import java.util.Set; - -public interface BranchComponent { - - /** - * The children of this Component; or an empty Set if there are no children. - * - * @return The child Components of this Component. - */ - Set childComponents(); - - /** - * Gets the child at the relative path from this Component.
- * When the path is null or empty then it returns this Component instead. - * - * @param path The path to the child Component. - * @return The child at the specified path; or this Component when the path is null or empty. - */ - default Optional getChild(String... path) { - if (path == null || path.length == 0) return Optional.empty(); - return getChild(path[0]).flatMap(component -> { - if (component instanceof BranchComponent branchComponent) { - return branchComponent.getChild(Arrays.copyOfRange(path, 1, path.length)); - } - return Optional.empty(); - }); - } - - /** - * Gets the direct child Component, or an empty Optional when it wasn't found. - * - * @param id The id of the child Component. - * @return The child Component; or empty Component. - */ - Optional getChild(String id); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index dd8952df1..3f9c37906 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -25,6 +25,7 @@ import com.wolfyscript.utilities.common.WolfyUtils; import java.util.ArrayDeque; import java.util.Deque; +import java.util.function.Consumer; public interface Component extends Keyed { @@ -58,11 +59,7 @@ default NamespacedKey type() { */ Component parent(); - /** - * Called when the Component is initialised. - * - */ - void init(); + Renderer getRenderer(); default Deque getPathToRoot() { if (parent() == null) return new ArrayDeque<>(); @@ -71,4 +68,26 @@ default Deque getPathToRoot() { return path; } + /** + * Gets the width of this Component in slot count. + * + * @return The width in slots. + */ + int width(); + + /** + * Gets the width of this Component in slot count. + * + * @return The height in slots. + */ + int height(); + + default void executeForAllSlots(int positionSlot, Consumer slotFunction) { + for (int i = 0; i < height(); i++) { + for (int j = 0; j < width(); j++) { + slotFunction.accept(positionSlot + j + i * (9 - width())); + } + } + } + } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java index f1bee3c02..cf8fe5831 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -35,7 +35,7 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type") @JsonPropertyOrder(value = { "type" }) @JsonIgnoreProperties(ignoreUnknown = true) -public interface ComponentBuilder extends Keyed { +public interface ComponentBuilder extends Keyed { @JsonIgnore @Override diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentCollection.java similarity index 83% rename from src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/ComponentCollection.java index 298d0faa6..887d5de94 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentCollection.java @@ -18,7 +18,12 @@ package com.wolfyscript.utilities.common.gui; -public interface RouterState extends ComponentState { +import java.util.Optional; +public interface ComponentCollection { + + Optional get(int slot); + + void updateComponent(int slot, ComponentState componentState); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index cdd81a13d..00eb57263 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.components.Router; +import com.wolfyscript.utilities.common.gui.components.RouterBuilder; import java.io.File; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java index e803dcc76..c9d4f4737 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java @@ -22,9 +22,9 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.components.Router; import java.util.Optional; import java.util.UUID; -import java.util.function.Consumer; public abstract class GuiAPIManagerCommonImpl implements GuiAPIManager { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java index d9208e279..a7ec6081f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.components.Window; + public interface GuiHolder { GuiViewManager getViewManager(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java index 1718520f4..3d2903918 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.components.Window; + public abstract class GuiHolderCommonImpl implements GuiHolder { protected final Window currentWindow; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index 31b75fcb3..2ffc6a21f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -19,6 +19,8 @@ package com.wolfyscript.utilities.common.gui; import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.components.Router; +import com.wolfyscript.utilities.common.gui.components.Window; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -66,11 +68,11 @@ public interface GuiViewManager { /** * Gets the currently active menu. - * This may be a {@link Window}, {@link Router }, or any other {@link MenuComponent}. + * This may be a {@link Window }, {@link Router } * * @return The currently active menu. */ - Optional getCurrentMenu(); + Optional getCurrentMenu(); /** * Gets the viewers that are handled by this view manager. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java index 0aba7233e..209fc4b84 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -22,6 +22,8 @@ import com.google.inject.Injector; import com.google.inject.TypeLiteral; import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.components.Router; +import com.wolfyscript.utilities.common.gui.components.Window; import java.util.ArrayDeque; import java.util.Deque; import java.util.Optional; @@ -31,19 +33,21 @@ public abstract class GuiViewManagerCommonImpl implements GuiViewManager { private final WolfyUtils wolfyUtils; - private final Router root; - private final Deque history; + private final Router router; + private Window currentRoot; + private final Deque history; private final Set viewers; - protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Router rootRouter, Set viewers) { + protected GuiViewManagerCommonImpl(WolfyUtils wolfyUtils, Router router, Set viewers) { this.wolfyUtils = wolfyUtils; - this.root = rootRouter; + this.router = router; + this.history = new ArrayDeque<>(); this.viewers = viewers; // Construct custom data instance Injector injector = Guice.createInjector(binder -> { binder.bind(WolfyUtils.class).toInstance(wolfyUtils); - binder.bind(Router.class).toInstance(root); + binder.bind(Router.class).toInstance(router); binder.bind(new TypeLiteral() { }).toInstance(this); binder.bind(new TypeLiteral>() { @@ -61,23 +65,27 @@ public void open() { if (history.isEmpty()) { openNew(); } else { - MenuComponent component = history.peek(); - //viewers.forEach(uuid -> component.open(this, uuid)); + getCurrentMenu().ifPresent(window -> window.open(this)); } } @Override public void openPrevious() { history.poll(); // Remove active current menu + setCurrentRoot(history.peek()); getCurrentMenu().ifPresent(previous -> { // Do not add menu to history, as it is already available - //viewers.forEach(uuid -> previous.open(this, uuid)); + previous.open(this); }); } + public void setCurrentRoot(Window currentRoot) { + this.currentRoot = currentRoot; + } + @Override - public Optional getCurrentMenu() { - return Optional.ofNullable(history.peek()); + public Optional getCurrentMenu() { + return Optional.ofNullable(currentRoot); } @Override @@ -87,7 +95,7 @@ public WolfyUtils getWolfyUtils() { @Override public Router getRoot() { - return root; + return router; } @Override diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/NativeRendererModule.java b/src/main/java/com/wolfyscript/utilities/common/gui/NativeRendererModule.java new file mode 100644 index 000000000..5d750623e --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/NativeRendererModule.java @@ -0,0 +1,29 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.items.ItemStackConfig; + +public interface NativeRendererModule { + + void renderStack(T_STACK stack); + + void renderStack(ItemStackConfig stackConfig); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index c2f3ace0b..dd3a0d298 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -35,10 +35,11 @@ public interface RenderContext { void setNativeStack(int slot, Object nativeStack); default boolean checkIfSlotInBounds(int slot) { - if (!(getCurrentState().getOwner().parent() instanceof SizedComponent sizedParent) || slot >= 0 && slot < sizedParent.width() * sizedParent.height()) { + Component parent = getCurrentState().getOwner().parent(); + if (slot >= 0 && slot < parent.width() * parent.height()) { return true; } - throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (sizedParent.width() * sizedParent.height() - 1) + "] !"); + throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (parent.width() * parent.height() - 1) + "] !"); } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java index 3abc242f5..5d0fe5740 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderable.java @@ -18,14 +18,6 @@ package com.wolfyscript.utilities.common.gui; -public interface Renderable { - - /** - * Called each time the Component or a child Component is rendered in the GUI. - * - * - * @return - */ - RenderCallback renderCallback(); +public interface Renderable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java new file mode 100644 index 000000000..36c093690 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java @@ -0,0 +1,72 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.items.ItemStackConfig; +import com.wolfyscript.utilities.tuple.Pair; +import java.util.function.BiConsumer; +import java.util.function.Function; + +public interface Renderer { + + int getWidth(); + + int getHeight(); + + void render(T_STATE state, GuiHolder holder, RenderContext context); + + void renderComponent(T_STATE state, int slot, Component component); + + NativeRendererModule getNativeModule(); + + default boolean checkBoundsAtPos(int slot, Component component) throws IllegalStateException { + int parentWidth = getWidth(); + int parentHeight = getHeight(); + return slot > 0 && slot < parentWidth * parentHeight && (slot / parentHeight) + component.width() <= parentWidth && (slot / parentWidth) + component.height() <= parentHeight; + } + + interface ReactiveFunction > { + + Pair run(T_RENDERER builder, Signal.Value value); + + Signal getSignal(); + + } + + interface Builder> { + + Signal useSignal(String key, Class type, Function defaultValueFunction); + + Builder position(int slot, String component); + + Builder renderAt(int slot, ItemStackConfig stackConfig); + + Builder renderAt(int slot, String component); + + Builder render(String component); + + Builder position(Signal signal, Function, Integer> slot, Function, String> selector); + + Builder render(Signal signal, Function, String> selector); + + Builder renderAt(Signal signal, Function, Integer> slot, Function, String> selector); + + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java similarity index 65% rename from src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java index d81c518ae..2e7711757 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/MenuComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java @@ -19,17 +19,14 @@ package com.wolfyscript.utilities.common.gui; import java.util.Deque; -import java.util.UUID; +import java.util.Map; -public interface MenuComponent { +public interface Signalable { - /** - * Opens this component for the specified view and player.
- * - * @param viewManager The view manager to open. - * @param uuid The uuid to open the Window for. - */ - RenderContext createContext(GuiViewManager viewManager, Deque path, UUID uuid); + Map> getSignalValues(); + + Deque> updatedSignals(); + + void receiveUpdate(Signal.Value signal); - void open(GuiViewManager viewManager, PARENT_STATE parentState, Deque path, UUID player); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java deleted file mode 100644 index 073e6f809..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/SizedComponent.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import java.util.function.Consumer; - -/** - * This Component represents components that have a specific width and height.
- * They can only be placed into non-sized Components or Components of the same or bigger dimension. - */ -public interface SizedComponent extends Component { - - /** - * Gets the width of this Component in slot count. - * - * @return The width in slots. - */ - int width(); - - /** - * Gets the width of this Component in slot count. - * - * @return The height in slots. - */ - int height(); - - default void executeForAllSlots(int positionSlot, Consumer slotFunction) { - for (int i = 0; i < height(); i++) { - for (int j = 0; j < width(); j++) { - slotFunction.accept(positionSlot + j + i * (9 - width())); - } - } - } - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/State.java similarity index 94% rename from src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java rename to src/main/java/com/wolfyscript/utilities/common/gui/State.java index a19547e4c..bcf7d8247 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/AreaComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/State.java @@ -18,6 +18,5 @@ package com.wolfyscript.utilities.common.gui; -public interface AreaComponent extends Component { - +public interface State { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java index bdf823c35..ed5ad7e5f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java @@ -23,7 +23,7 @@ public interface Stateful { - S createState(ComponentState parentState); + S createState(ComponentState parentState, GuiViewManager viewManager); Map> signals(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java deleted file mode 100644 index 6231f2e35..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import com.wolfyscript.utilities.common.gui.components.CallbackInitComponent; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -public interface Window extends MenuComponent, Stateful, SizedComponent, BranchComponent, Component, Interactable, Renderable { - - @Override - Router parent(); - - Set childComponents(); - - /** - * Gets the type that is configured for this Window.
- * When this is empty, then {@link #getSize()} will return the specified size. - * - * @return The specified type; or empty Optional when no type is configured. - * @see #getSize() - */ - Optional getType(); - - /** - * Gets the size that is configured for this Window.
- * - * When this is empty, then {@link #getType()} will return the specified type. - * - * @return The specified size: or empty Optional when no size is configured. - */ - Optional getSize(); - - /** - * Creates the title of this window for the specified holder. - * - * @param holder The holder to create the title for. - * @return The title component. - */ - net.kyori.adventure.text.Component createTitle(GuiHolder holder, WindowState window); - - RenderOptions getRenderOptions(); - - CallbackInitComponent getInitCallback(); - - interface RenderOptions { - - Optional> renderCallback(); - - Map placement(); - - int[] getSlotsFor(Component component); - - } - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java new file mode 100644 index 000000000..afdfeea64 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java @@ -0,0 +1,35 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.gui.components.WindowState; +import java.util.function.Function; +import net.kyori.adventure.text.Component; + +public interface WindowRenderer extends Renderer { + + interface Builder extends Renderer.Builder { + + Builder title(Component textComponent); + + Builder title(Signal signal, Function, Component> updateTextComponent); + + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java index 8ab4fffe3..053eb83b7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java @@ -20,7 +20,6 @@ import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.Interactable; -import com.wolfyscript.utilities.common.gui.SizedComponent; import com.wolfyscript.utilities.common.gui.Stateful; /** @@ -28,7 +27,7 @@ * It always has a 1x1 size, because it occupies a single slot. * */ -public interface Button extends Component, Stateful, Interactable, SizedComponent { +public interface Button extends Component, Stateful, Interactable { @Override default int width() { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index eea01222d..feecc5cac 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -18,10 +18,10 @@ package com.wolfyscript.utilities.common.gui.components; +import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.ComponentBuilder; import com.wolfyscript.utilities.common.gui.InteractionCallback; import com.wolfyscript.utilities.common.gui.Signal; -import com.wolfyscript.utilities.common.gui.SizedComponent; import com.wolfyscript.utilities.common.items.ItemStackConfig; import java.util.function.Consumer; import java.util.function.Supplier; @@ -30,7 +30,7 @@ * Builder to create a {@link Button} instance. * */ -public interface ButtonBuilder extends ComponentBuilder { +public interface ButtonBuilder extends ComponentBuilder { /** * Creates a new {@link IconBuilder} to create the icon of the button. @@ -44,7 +44,7 @@ public interface ButtonBuilder extends ComponentBuilder ButtonBuilder useSignal(String key, Class type, Consumer> signalBuilder); - Button create(SizedComponent parent); + Button create(Component parent); /** * Provides methods to create an icon for Buttons. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java index a8f382d90..c732bf994 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java @@ -19,10 +19,11 @@ package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.gui.GuiHolder; +import com.wolfyscript.utilities.common.gui.Renderer; @FunctionalInterface public interface CallbackInitComponent { - void run(GuiHolder holder, RenderFunction render); + void run(Renderer.Builder render); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java deleted file mode 100644 index 3e2d5c24a..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/RenderFunction.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui.components; - -import com.wolfyscript.utilities.common.gui.Signal; -import com.wolfyscript.utilities.common.gui.WindowBuilder; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -public interface RenderFunction { - - Signal.Value createSignal(String key, Class type, Supplier defaultValue); - - RenderFunction component(int i, String id); - - RenderFunction component(String id); - - R reactive(Signal.Value signal, Consumer> provideRenderFunction); - - RenderFunction then(); - - interface Conditional { - - Conditional then(Supplier render); - - RenderFunction orElse(Supplier render); - - RenderFunction orIgnore(); - - } - - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Router.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Router.java similarity index 58% rename from src/main/java/com/wolfyscript/utilities/common/gui/Router.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/Router.java index c9b2c1d4a..36b2e45af 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Router.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Router.java @@ -16,10 +16,15 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; +import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.GuiViewManager; +import com.wolfyscript.utilities.common.gui.Interactable; +import com.wolfyscript.utilities.common.gui.RenderContext; +import java.util.Deque; import java.util.Optional; -import java.util.Set; +import java.util.UUID; /** *

@@ -30,26 +35,25 @@ * * @param The type of the data implementation. */ -public interface Router extends MenuComponent, Stateful, Component, BranchComponent, Interactable { +public interface Router extends Interactable { - @Override - Router parent(); + String getID(); - /** - * Gets the entry menu Component that is opened by default. - * - * @return The entry Component. - */ - RouterEntry entry(); + WolfyUtils getWolfyUtils(); - Optional getRoute(String routeID); + Router parent(); - Set childRoutes(); + Optional getSubRoute(String routeID); - @Override - Set childComponents(); + Optional getWindow(); - @Override - Optional getChild(String... path); + Window open(GuiViewManager viewManager, String... path); + /** + * Opens this component for the specified view and player.
+ * + * @param viewManager The view manager to open. + * @param uuid The uuid to open the Window for. + */ + RenderContext createContext(GuiViewManager viewManager, Deque path, UUID uuid); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterBuilder.java similarity index 66% rename from src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/RouterBuilder.java index 3e04c60df..5b075660c 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterBuilder.java @@ -16,21 +16,18 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; -import com.wolfyscript.utilities.json.annotations.KeyedBaseType; +import com.wolfyscript.utilities.common.gui.InteractionCallback; import java.util.function.Consumer; -@KeyedBaseType(baseType = ComponentBuilder.class) -public interface RouterBuilder extends ComponentBuilder { - - RouterBuilder entry(Consumer entryBuilder); - - RouterBuilder children(Consumer childComponentBuilderConsumer); +public interface RouterBuilder { RouterBuilder interact(InteractionCallback interactionCallback); - RouterBuilder useSignal(String key, Class type, Consumer> signalBuilder); + RouterBuilder route(String path, Consumer subRouteBuilder); + + RouterBuilder window(Consumer windowBuilder); Router create(Router parent); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java similarity index 95% rename from src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java index a80d3d731..090f3b649 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterChildBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; import java.util.function.Consumer; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntry.java similarity index 86% rename from src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntry.java index 2a46c4193..2c02d7b23 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntry.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntry.java @@ -16,7 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; + +import java.util.Optional; public interface RouterEntry { @@ -24,7 +26,9 @@ public interface RouterEntry { Type type(); - MenuComponent component(); + Optional getRoute(); + + Optional getWindow(); enum Type { WINDOW, diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntryBuilder.java similarity index 94% rename from src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntryBuilder.java index 703a871db..8e2403d9a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterEntryBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntryBuilder.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; public interface RouterEntryBuilder { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java new file mode 100644 index 000000000..794a82f92 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java @@ -0,0 +1,161 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.GuiHolder; +import com.wolfyscript.utilities.common.gui.GuiViewManager; +import com.wolfyscript.utilities.common.gui.Interactable; +import com.wolfyscript.utilities.common.gui.RenderContext; +import com.wolfyscript.utilities.common.gui.Renderable; +import com.wolfyscript.utilities.common.gui.Renderer; +import com.wolfyscript.utilities.common.gui.WindowType; +import java.util.Arrays; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; + +public interface Window extends Interactable, Renderable { + + /** + * Creates the context of this window. The context keeps track of the inventory + * and view for the rendering. + * + * @param viewManager The view manager to open. + * @param uuid The uuid to open the Window for. + */ + RenderContext createContext(GuiViewManager viewManager, UUID uuid); + + /** + * Creates the state of this window for the specified view manager. + * The state keeps track of the signal values and child component(state)s. + * + * @param viewManager The view manager to create the state for. + * @return The new state for the view manager. + */ + WindowState createState(GuiViewManager viewManager); + + void open(GuiViewManager viewManager); + + /** + * Gets the type that is configured for this Window.
+ * When this is empty, then {@link #getSize()} will return the specified size. + * + * @return The specified type; or empty Optional when no type is configured. + * @see #getSize() + */ + Optional getType(); + + /** + * Gets the size that is configured for this Window.
+ * + * When this is empty, then {@link #getType()} will return the specified type. + * + * @return The specified size: or empty Optional when no size is configured. + */ + Optional getSize(); + + /** + * Creates the title of this window for the specified holder. + * + * @param holder The holder to create the title for. + * @return The title component. + */ + net.kyori.adventure.text.Component createTitle(GuiHolder holder, WindowState window); + + /** + * The children of this Component; or an empty Set if there are no children. + * + * @return The child Components of this Component. + */ + Set childComponents(); + + /** + * Gets the child at the relative path from this Component.
+ * When the path is null or empty then it returns this Component instead. + * + * @param path The path to the child Component. + * @return The child at the specified path; or this Component when the path is null or empty. + */ + default Optional getChild(String... path) { + if (path == null || path.length == 0) return Optional.empty(); + return getChild(path[0]).flatMap(component -> { + if (component instanceof Window window) { + return window.getChild(Arrays.copyOfRange(path, 1, path.length)); + } + return Optional.empty(); + }); + } + + /** + * Gets the direct child Component, or an empty Optional when it wasn't found. + * + * @param id The id of the child Component. + * @return The child Component; or empty Component. + */ + Optional getChild(String id); + + /** + * Gets the unique id (in context of the parent) of this component. + * + * @return The id of this component. + */ + String getID(); + + /** + * Gets the global WolfyUtils instance, this component belongs to. + * + * @return The WolfyUtils API instance. + */ + WolfyUtils getWolfyUtils(); + + /** + * The parent of this Component, or null if it is a root Component. + * + * @return The parent; or null if root Component. + */ + Router router(); + + /** + * Gets the width of this Component in slot count. + * + * @return The width in slots. + */ + int width(); + + /** + * Gets the width of this Component in slot count. + * + * @return The height in slots. + */ + int height(); + + Renderer getRenderer(); + + default void executeForAllSlots(int positionSlot, Consumer slotFunction) { + for (int i = 0; i < height(); i++) { + for (int j = 0; j < width(); j++) { + slotFunction.accept(positionSlot + j + i * (9 - width())); + } + } + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowBuilder.java similarity index 80% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/WindowBuilder.java index 31125cff5..348eb36e0 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowBuilder.java @@ -16,9 +16,16 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; - -import com.wolfyscript.utilities.common.gui.components.CallbackInitComponent; +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; +import com.wolfyscript.utilities.common.gui.InteractionCallback; +import com.wolfyscript.utilities.common.gui.RenderCallback; +import com.wolfyscript.utilities.common.gui.Renderer; +import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.WindowRenderer; +import com.wolfyscript.utilities.common.gui.WindowType; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; @@ -28,7 +35,7 @@ * */ @KeyedBaseType(baseType = ComponentBuilder.class) -public interface WindowBuilder extends ComponentBuilder { +public interface WindowBuilder { /** * The size of the inventory.
@@ -71,18 +78,8 @@ public interface WindowBuilder extends ComponentBuilder { WindowBuilder children(Consumer children); - WindowBuilder render(CallbackInitComponent render); + WindowBuilder render(Consumer render); Window create(Router parent); - interface RenderOptionsBuilder { - - RenderOptionsBuilder position(int slot, String componentID); - - RenderOptionsBuilder custom(RenderCallback renderCallback); - - Window.RenderOptions create(Window window); - - } - } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java similarity index 74% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java index bb9a64738..c5338efc7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowChildComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java @@ -16,14 +16,15 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; -import com.wolfyscript.utilities.common.gui.components.ButtonBuilder; +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; import java.util.function.Consumer; public interface WindowChildComponentBuilder { - > WindowChildComponentBuilder custom(String componentId, Class builderType, Consumer builderConsumer); + > WindowChildComponentBuilder custom(String componentId, Class builderType, Consumer builderConsumer); WindowChildComponentBuilder button(String id, Consumer button); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowState.java similarity index 75% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/WindowState.java index b3874f7db..88a801033 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowState.java @@ -16,12 +16,13 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; -public interface WindowState extends ComponentState { +import com.wolfyscript.utilities.common.gui.ComponentCollection; +import com.wolfyscript.utilities.common.gui.Signalable; - void renderComponent(int slot, String componentID); +public interface WindowState extends Signalable, ComponentCollection { - void renderComponent(String componentID); + Window getOwner(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowStateBuilder.java similarity index 94% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/WindowStateBuilder.java index eb3c77258..92009f26c 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowStateBuilder.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; public interface WindowStateBuilder { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowTitleUpdateCallback.java similarity index 89% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java rename to src/main/java/com/wolfyscript/utilities/common/gui/components/WindowTitleUpdateCallback.java index c368d11da..ca534a10e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowTitleUpdateCallback.java @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.components; +import com.wolfyscript.utilities.common.gui.GuiHolder; import net.kyori.adventure.text.Component; public interface WindowTitleUpdateCallback { From ec0b63122f5707139600d164fdf4576b542284da Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 18:18:17 +0200 Subject: [PATCH 075/117] Remove unused StateHook, WindowChildComponentBuilder --- .../utilities/common/gui/StateHook.java | 58 ------------------- .../WindowChildComponentBuilder.java | 32 ---------- 2 files changed, 90 deletions(-) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java b/src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java deleted file mode 100644 index 6ffbd8afa..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/StateHook.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import java.util.function.Function; - -/** - * StateHooks are used to keep track of the component data and update the component when that data changes. - * - * @param The type of the value this hook holds. - */ -public interface StateHook { - - /** - * Gets the currently active data for this hook. - * - * @return The current data of this hook. - */ - V get(); - - /** - * Sets a new value for this hook.
- * Whenever that new value is unequal to the current value it causes the component to update.
- * In case a non-primitive value is used, then {@link Object#equals(Object)} should be implemented. - * - * @param newValue The new value for this hook. - * @see #set(Function) - */ - void set(V newValue); - - /** - * Updates the current value of this hook.
- * This method will always cause the component to update.
- * It should be preferred over {@link #set(V)} whenever it is a more complex object, - * where mutation is faster, then reallocating it. - * - * @param update The function used to update the value. - * @see #set(V) - */ - void set(Function update); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java deleted file mode 100644 index c5338efc7..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowChildComponentBuilder.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui.components; - -import com.wolfyscript.utilities.common.gui.Component; -import com.wolfyscript.utilities.common.gui.ComponentBuilder; -import java.util.function.Consumer; - -public interface WindowChildComponentBuilder { - - > WindowChildComponentBuilder custom(String componentId, Class builderType, Consumer builderConsumer); - - WindowChildComponentBuilder button(String id, Consumer button); - - void applyTo(Window window); -} From 576086103015b57c2899f806734ca8b71b068a5c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:41:20 +0200 Subject: [PATCH 076/117] Remove ButtonBuilder#useSignal * Signals are part of the renderer now! --- .../utilities/common/gui/components/ButtonBuilder.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index feecc5cac..234392a55 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -42,8 +42,6 @@ public interface ButtonBuilder extends ComponentBuilder { ButtonBuilder interact(InteractionCallback interactionCallback); - ButtonBuilder useSignal(String key, Class type, Consumer> signalBuilder); - Button create(Component parent); /** @@ -57,9 +55,7 @@ interface IconBuilder { IconBuilder stack(Supplier> stackConfigSupplier); - IconBuilder dynamic(); - - IconBuilder dynamic(boolean isDynamic); + IconBuilder updateOnSignals(Signal... signals); ButtonIcon create(); } From ac98f235b9cbd81561315c6439706be61fe0452f Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:41:53 +0200 Subject: [PATCH 077/117] ButtonIcon can now have custom TagResolvers --- .../utilities/common/gui/components/ButtonIcon.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java index f6751725b..6f538dfe8 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonIcon.java @@ -19,11 +19,13 @@ package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.items.ItemStackConfig; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; public interface ButtonIcon { ItemStackConfig getStack(); - boolean isDynamic(); + TagResolver getResolvers(); + } From 468a752debc583bb7b334f65ef6edae8e8548172 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:42:55 +0200 Subject: [PATCH 078/117] No longer need Component#getPathToRoot --- .../com/wolfyscript/utilities/common/gui/Component.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 3f9c37906..fc55b2fb7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -61,13 +61,6 @@ default NamespacedKey type() { Renderer getRenderer(); - default Deque getPathToRoot() { - if (parent() == null) return new ArrayDeque<>(); - Deque path = parent().getPathToRoot(); - path.add(parent()); - return path; - } - /** * Gets the width of this Component in slot count. * From 9187b49a8c7b329d67ad4ee99cc2132bd750d40c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:44:21 +0200 Subject: [PATCH 079/117] Remove Signal.Value subclass * Value is now stored inside the Signal directly! --- .../utilities/common/gui/Signal.java | 68 ++++++++----------- .../utilities/common/gui/Signalable.java | 6 +- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java index 552d0af84..6763a3541 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import java.util.Collection; import java.util.function.Function; /** @@ -44,52 +45,41 @@ public interface Signal { */ Class valueType(); - Value createValue(ComponentState state); - /** - * Bound to a specific ComponentState and View, this is the actual holder of the value and provides methods to update and get the tracked value. - * Each invocation of the update/set methods changes the value and schedules a rerender. + * Sets the tracked value to a new value and causes a re-render. * - * @param The type of value that is tracked. + * @param newValue The new value to apply. */ - interface Value { - - /** - * The Signal that this value belongs to. - * - * @return The signal of this value. - */ - Signal signal(); - - /** - * The ComponentState that this value belongs to. - * - * @return The ComponentState that tracks this value. - */ - ComponentState state(); + void set(MT newValue); - /** - * Sets the tracked value to a new value and causes a re-render. - * - * @param newValue The new value to apply. - */ - void set(T newValue); + /** + * Gets the tracked value, then updates it, and causes a re-render. + * + * @param updateFunction The function to update the value. + */ + void update(Function updateFunction); - /** - * Gets the tracked value, then updates it, and causes a re-render. - * - * @param updateFunction The function to update the value. - */ - void update(Function updateFunction); + /** + * Gets the current value. + * + * @return The current value. + */ + MT get(); - /** - * Gets the current value. - * - * @return The current value. - */ - T get(); + /** + * Enters the context of the specified the {@link GuiViewManager}. + * From this point onward the {@link #get()}, {@link #set(MT)}, {@link #set(MT)} return/manipulate the value of the specified view manager. + * + * @param viewManager The view manager to use. + */ + void enter(GuiViewManager viewManager); - } + /** + * Exits the context of the current view manager or does nothing if no view manager is active. + * + * @return A boolean telling if the signal was updated since the last {@link #enter(GuiViewManager)}. + */ + boolean exit(); /** * The Builder is used to construct signals for Components (See ComponentBuilder). diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java index 2e7711757..6d670e698 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java @@ -23,10 +23,10 @@ public interface Signalable { - Map> getSignalValues(); + Map> getSignalValues(); - Deque> updatedSignals(); + Deque> updatedSignals(); - void receiveUpdate(Signal.Value signal); + void receiveUpdate(Signal signal); } From 24dd3dfb9b5706f2418ca34014700ed7fdc4e37f Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:47:04 +0200 Subject: [PATCH 080/117] Move Router & Window out of components package Those are no longer Components, but standalone classes. --- .../common/gui/{components => }/Router.java | 5 +---- .../common/gui/{components => }/RouterBuilder.java | 3 +-- .../common/gui/{components => }/Window.java | 12 ++---------- .../common/gui/{components => }/WindowBuilder.java | 14 +------------- .../common/gui/{components => }/WindowState.java | 5 +---- .../gui/{components => }/WindowStateBuilder.java | 2 +- .../WindowTitleUpdateCallback.java | 3 +-- 7 files changed, 8 insertions(+), 36 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/Router.java (88%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/RouterBuilder.java (90%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/Window.java (89%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/WindowBuilder.java (77%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/WindowState.java (83%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/WindowStateBuilder.java (94%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components => }/WindowTitleUpdateCallback.java (89%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Router.java b/src/main/java/com/wolfyscript/utilities/common/gui/Router.java similarity index 88% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/Router.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Router.java index 36b2e45af..2dec49d3f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Router.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Router.java @@ -16,12 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui; import com.wolfyscript.utilities.common.WolfyUtils; -import com.wolfyscript.utilities.common.gui.GuiViewManager; -import com.wolfyscript.utilities.common.gui.Interactable; -import com.wolfyscript.utilities.common.gui.RenderContext; import java.util.Deque; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java similarity index 90% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/RouterBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java index 5b075660c..eba934d71 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java @@ -16,9 +16,8 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.InteractionCallback; import java.util.function.Consumer; public interface RouterBuilder { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java similarity index 89% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java rename to src/main/java/com/wolfyscript/utilities/common/gui/Window.java index 794a82f92..9b52b6db5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -16,17 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui; import com.wolfyscript.utilities.common.WolfyUtils; -import com.wolfyscript.utilities.common.gui.Component; -import com.wolfyscript.utilities.common.gui.GuiHolder; -import com.wolfyscript.utilities.common.gui.GuiViewManager; -import com.wolfyscript.utilities.common.gui.Interactable; -import com.wolfyscript.utilities.common.gui.RenderContext; -import com.wolfyscript.utilities.common.gui.Renderable; -import com.wolfyscript.utilities.common.gui.Renderer; -import com.wolfyscript.utilities.common.gui.WindowType; import java.util.Arrays; import java.util.Optional; import java.util.Set; @@ -148,7 +140,7 @@ default Optional getChild(String... path) { */ int height(); - Renderer getRenderer(); + Renderer getRenderer(); default void executeForAllSlots(int positionSlot, Consumer slotFunction) { for (int i = 0; i < height(); i++) { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java similarity index 77% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/WindowBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index 348eb36e0..c523c8927 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -16,16 +16,8 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.Component; -import com.wolfyscript.utilities.common.gui.ComponentBuilder; -import com.wolfyscript.utilities.common.gui.InteractionCallback; -import com.wolfyscript.utilities.common.gui.RenderCallback; -import com.wolfyscript.utilities.common.gui.Renderer; -import com.wolfyscript.utilities.common.gui.Signal; -import com.wolfyscript.utilities.common.gui.WindowRenderer; -import com.wolfyscript.utilities.common.gui.WindowType; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; @@ -72,12 +64,8 @@ public interface WindowBuilder { */ WindowBuilder title(WindowTitleUpdateCallback titleUpdateCallback); - WindowBuilder createSignal(String key, Class type, Consumer> signalBuilder); - WindowBuilder interact(InteractionCallback interactionCallback); - WindowBuilder children(Consumer children); - WindowBuilder render(Consumer render); Window create(Router parent); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java similarity index 83% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/WindowState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java index 88a801033..3315edafc 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java @@ -16,10 +16,7 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; - -import com.wolfyscript.utilities.common.gui.ComponentCollection; -import com.wolfyscript.utilities.common.gui.Signalable; +package com.wolfyscript.utilities.common.gui; public interface WindowState extends Signalable, ComponentCollection { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java similarity index 94% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/WindowStateBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java index 92009f26c..eb3c77258 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowStateBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui; public interface WindowStateBuilder { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowTitleUpdateCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java similarity index 89% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/WindowTitleUpdateCallback.java rename to src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java index ca534a10e..c368d11da 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/WindowTitleUpdateCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java @@ -16,9 +16,8 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.GuiHolder; import net.kyori.adventure.text.Component; public interface WindowTitleUpdateCallback { From ea23aa7cc3561be0e5b548bd474a72e05507fec8 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:47:57 +0200 Subject: [PATCH 081/117] Remove RouterChildBuilder Router structure has changed to not act as a tree. --- .../gui/components/RouterChildBuilder.java | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java deleted file mode 100644 index 090f3b649..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterChildBuilder.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui.components; - -import java.util.function.Consumer; - -public interface RouterChildBuilder { - - RouterChildBuilder window(String id, Consumer builderConsumer); - - RouterChildBuilder router(String id, Consumer builderConsumer); - - void applyTo(Router parent); -} From 6ca6b3879b981ddefdddc8fb6a7f71cca0c6b070 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:48:31 +0200 Subject: [PATCH 082/117] Button no longer uses ButtonComponentState --- .../wolfyscript/utilities/common/gui/components/Button.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java index 053eb83b7..a6a1c7d94 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java @@ -19,6 +19,7 @@ package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentState; import com.wolfyscript.utilities.common.gui.Interactable; import com.wolfyscript.utilities.common.gui.Stateful; @@ -27,7 +28,7 @@ * It always has a 1x1 size, because it occupies a single slot. * */ -public interface Button extends Component, Stateful, Interactable { +public interface Button extends Component, Stateful, Interactable { @Override default int width() { From b35a158dba9832c1a4389017876f9ff2c31f7d09 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:49:23 +0200 Subject: [PATCH 083/117] Rename GuiAPIManager "Router" occurrences to "Gui" --- .../utilities/common/gui/GuiAPIManager.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index 00eb57263..a9ec86318 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -18,8 +18,6 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.components.Router; -import com.wolfyscript.utilities.common.gui.components.RouterBuilder; import java.io.File; import java.util.Optional; import java.util.UUID; @@ -39,7 +37,7 @@ public interface GuiAPIManager { * @param id The unique id of the router to register. * @param routerBuilderConsumer The consumer that provides the new builder. */ - void registerRouter(String id, Consumer routerBuilderConsumer); + void registerGui(String id, Consumer routerBuilderConsumer); /** * Registers a new router that it loads from the given file. @@ -48,7 +46,7 @@ public interface GuiAPIManager { * @param file The file to load the router from. * @param routerBuilderConsumer The function to manipulate the new builder. */ - void registerRouterFromFile(File file, Consumer routerBuilderConsumer); + void registerGuiFromFile(String id, File file, Consumer routerBuilderConsumer); /** * Gets the registered router with the specified id.
@@ -56,11 +54,11 @@ public interface GuiAPIManager { * @param id The id of the router. * @return The registered router only if the id matches; otherwise empty Optional. */ - Optional getRouter(String id); + Optional getGui(String id); /** * Creates a new view for the specified viewers, with the specified cluster as its root.
- * This gets the registered cluster using {@link #getRouter(String)}. + * This gets the registered cluster using {@link #getGui(String)}. * * @param clusterId The id of the root cluster. * @param viewers The viewers of this view. From 757072be730372afe919ab8d7605577bbe5505bd Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:49:35 +0200 Subject: [PATCH 084/117] Rename GuiAPIManagerCommonImpl "Router" occurrences to "Gui" --- .../common/gui/GuiAPIManagerCommonImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java index c9d4f4737..9f4041665 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManagerCommonImpl.java @@ -22,7 +22,6 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.wolfyscript.utilities.common.WolfyUtils; -import com.wolfyscript.utilities.common.gui.components.Router; import java.util.Optional; import java.util.UUID; @@ -35,19 +34,20 @@ public GuiAPIManagerCommonImpl(WolfyUtils wolfyUtils) { this.wolfyUtils = wolfyUtils; } - protected void registerCluster(Router router) { + protected void registerGui(String id, Router router) { Preconditions.checkArgument(!clustersMap.containsKey(router.getID()), "A cluster with the id '" + router.getID() + "' is already registered!"); - clustersMap.put(router.getID(), router); + clustersMap.put(id, router); } - public GuiViewManager createViewAndOpen(String clusterID, UUID... players) { - GuiViewManager handler = createView(clusterID, players); + @Override + public GuiViewManager createViewAndOpen(String guiId, UUID... players) { + GuiViewManager handler = createView(guiId, players); handler.openNew(); return handler; } @Override - public Optional getRouter(String id) { + public Optional getGui(String id) { return Optional.ofNullable(clustersMap.get(id)); } } From 910cea1d55a1943009335940ab9dcacc5410b355 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:50:23 +0200 Subject: [PATCH 085/117] Update ComponentState to Signal changes --- .../wolfyscript/utilities/common/gui/ComponentState.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java index 262e77f3d..86b2cae3e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java @@ -24,14 +24,12 @@ public interface ComponentState { Component getOwner(); - Signal.Value captureSignal(String signalKey, Class msgType); + Signal captureSignal(String signalKey, Class msgType); - Signal.Value captureSignal(String signalKey); + Signal captureSignal(String signalKey); boolean shouldUpdate(); InteractionResult interact(GuiHolder holder, InteractionDetails interactionDetails); - void render(GuiHolder holder, RenderContext context); - } From f2c9f5d1471f7d3e12da820959fe7df93d137295 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:51:47 +0200 Subject: [PATCH 086/117] Remove unused imports * GuiHolder, GuiHolderCommonImpl, GuiViewManager, GuiViewManagerCommonImpl --- .../java/com/wolfyscript/utilities/common/gui/GuiHolder.java | 2 -- .../wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java | 2 -- .../com/wolfyscript/utilities/common/gui/GuiViewManager.java | 2 -- .../utilities/common/gui/GuiViewManagerCommonImpl.java | 2 -- 4 files changed, 8 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java index a7ec6081f..d9208e279 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java @@ -18,8 +18,6 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.components.Window; - public interface GuiHolder { GuiViewManager getViewManager(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java index 3d2903918..1718520f4 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolderCommonImpl.java @@ -18,8 +18,6 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.components.Window; - public abstract class GuiHolderCommonImpl implements GuiHolder { protected final Window currentWindow; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index 2ffc6a21f..a99b894ac 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -19,8 +19,6 @@ package com.wolfyscript.utilities.common.gui; import com.wolfyscript.utilities.common.WolfyUtils; -import com.wolfyscript.utilities.common.gui.components.Router; -import com.wolfyscript.utilities.common.gui.components.Window; import java.util.Optional; import java.util.Set; import java.util.UUID; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java index 209fc4b84..8fd693a35 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -22,8 +22,6 @@ import com.google.inject.Injector; import com.google.inject.TypeLiteral; import com.wolfyscript.utilities.common.WolfyUtils; -import com.wolfyscript.utilities.common.gui.components.Router; -import com.wolfyscript.utilities.common.gui.components.Window; import java.util.ArrayDeque; import java.util.Deque; import java.util.Optional; From 286c426622878182bf2501d57491f706fa5d8649 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:52:44 +0200 Subject: [PATCH 087/117] Rename GuiViewManagerCommonImpl#getRoot to #getRouter --- .../utilities/common/gui/GuiViewManagerCommonImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java index 8fd693a35..e8495b6be 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManagerCommonImpl.java @@ -92,7 +92,7 @@ public WolfyUtils getWolfyUtils() { } @Override - public Router getRoot() { + public Router getRouter() { return router; } From 57c294342c215fc0a0d1b45b23799112750ce651 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:54:21 +0200 Subject: [PATCH 088/117] Add more getters to GuiViewManager * #getCurrentWindowState * #getRenderContext(UUID) * #getRouter --- .../utilities/common/gui/GuiViewManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index a99b894ac..a954dea14 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -57,16 +57,16 @@ public interface GuiViewManager { void openPrevious(); /** - * The root cluster of this view manager. - * This is used for methods like {@link #openNew()} to open the entry menu. + * The router of this view manager. * * @return The root cluster of this view manager. */ - Router getRoot(); + Router getRouter(); + + Optional getCurrentWindowState(); /** * Gets the currently active menu. - * This may be a {@link Window }, {@link Router } * * @return The currently active menu. */ @@ -87,4 +87,6 @@ public interface GuiViewManager { */ WolfyUtils getWolfyUtils(); + Optional getRenderContext(UUID viewer); + } From ebfafabe311de7bb37e089e1fc86eefd92e7d7e1 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:54:47 +0200 Subject: [PATCH 089/117] Fix RenderContext#checkIfSlotInBounds --- .../utilities/common/gui/RenderContext.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index dd3a0d298..e7b6078d5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -35,11 +35,20 @@ public interface RenderContext { void setNativeStack(int slot, Object nativeStack); default boolean checkIfSlotInBounds(int slot) { - Component parent = getCurrentState().getOwner().parent(); - if (slot >= 0 && slot < parent.width() * parent.height()) { + int outerWidth; + int outerHeight; + if (getCurrentState().getOwner().parent() != null) { + Component parent = getCurrentState().getOwner().parent(); + outerWidth = parent.width(); + outerHeight = parent.height(); + } else { + outerWidth = 9; + outerHeight = 6; + } + if (slot >= 0 && slot < outerWidth * outerHeight) { return true; } - throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (parent.width() * parent.height() - 1) + "] !"); + throw new IllegalArgumentException("Slot " + slot + " out of bounds! Must be in the range of [" + 0 + "..." + (outerWidth * outerHeight - 1) + "] !"); } } From 05989fb657e1087840d4f648d04d3709c181e539 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:55:31 +0200 Subject: [PATCH 090/117] Remove signals from Stateful interface --- .../com/wolfyscript/utilities/common/gui/Stateful.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java index ed5ad7e5f..4b833255e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java @@ -25,12 +25,4 @@ public interface Stateful { S createState(ComponentState parentState, GuiViewManager viewManager); - Map> signals(); - - default Optional> getSignal(String key, Class type) { - Signal signal = signals().get(key); - if (signal != null && signal.valueType() == type) return Optional.of((Signal) signal); - return Optional.empty(); - } - } From 253d7f12e493e01b95f8f53ebec37f7f0d181f19 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:55:52 +0200 Subject: [PATCH 091/117] Add ReactiveConsumer & ReactiveSupplier --- .../gui/functions/ReactiveConsumer.java | 70 +++++++++++++++++++ .../gui/functions/ReactiveSupplier.java | 70 +++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java new file mode 100644 index 000000000..437627ab5 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java @@ -0,0 +1,70 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.functions; + +import com.wolfyscript.utilities.common.gui.Signal; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +/** + * A wrapper Consumer that is linked to {@link Signal}s. + * + * @param + */ +public class ReactiveConsumer implements Consumer { + + private static int NEXT_ID = 0; + + private final int id; + private final List> signals; + private final Consumer consumer; + + public ReactiveConsumer(List> signals, Consumer consumer) { + this.id = NEXT_ID++; + this.signals = signals; + this.consumer = consumer; + } + + public int id() { + return id; + } + + public void accept(T value) { + consumer.accept(value); + } + + public List> signals() { + return signals; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ReactiveConsumer that = (ReactiveConsumer) o; + return id == that.id; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java new file mode 100644 index 000000000..d678cea9f --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java @@ -0,0 +1,70 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.functions; + +import com.wolfyscript.utilities.common.gui.Signal; +import java.util.List; +import java.util.Objects; +import java.util.function.Supplier; + +/** + * A wrapper Supplier that is linked to {@link Signal}s. + * + * @param + */ +public class ReactiveSupplier implements Supplier { + + private static int NEXT_ID = 0; + + private final int id; + private final List> signals; + private final Supplier supplier; + + public ReactiveSupplier(List> signals, Supplier supplier) { + this.id = NEXT_ID++; + this.signals = signals; + this.supplier = supplier; + } + + public int id() { + return id; + } + + public T get() { + return supplier.get(); + } + + public List> signals() { + return signals; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ReactiveSupplier that = (ReactiveSupplier) o; + return id == that.id; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + +} From 581eb483e0438ff43829dba8b35769a6afb871c0 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:57:13 +0200 Subject: [PATCH 092/117] Add serializable functional interfaces These interfaces are used to detect used variables, like signals, at runtime. --- .../SerializableConsumer.java} | 10 ++++----- .../SerializableRunnable.java} | 6 ++++-- .../SerializableSupplier.java} | 21 ++++--------------- 3 files changed, 12 insertions(+), 25 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{components/RouterEntryBuilder.java => functions/SerializableConsumer.java} (80%) rename src/main/java/com/wolfyscript/utilities/common/gui/{Context.java => functions/SerializableRunnable.java} (84%) rename src/main/java/com/wolfyscript/utilities/common/gui/{components/RouterEntry.java => functions/SerializableSupplier.java} (75%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntryBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java similarity index 80% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntryBuilder.java rename to src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java index 8e2403d9a..89976d3bc 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntryBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java @@ -16,12 +16,10 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui.functions; -public interface RouterEntryBuilder { - - RouterEntryBuilder window(String id); - - RouterEntryBuilder route(String id); +import java.io.Serializable; +import java.util.function.Consumer; +public interface SerializableConsumer extends Consumer, Serializable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Context.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java similarity index 84% rename from src/main/java/com/wolfyscript/utilities/common/gui/Context.java rename to src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java index bd62d926f..daa6bea0f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Context.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java @@ -16,8 +16,10 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.functions; -public interface Context { +import java.io.Serializable; + +public interface SerializableRunnable extends Runnable, Serializable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntry.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java similarity index 75% rename from src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntry.java rename to src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java index 2c02d7b23..17c2c59bc 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/RouterEntry.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java @@ -16,23 +16,10 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui.components; +package com.wolfyscript.utilities.common.gui.functions; -import java.util.Optional; - -public interface RouterEntry { - - String id(); - - Type type(); - - Optional getRoute(); - - Optional getWindow(); - - enum Type { - WINDOW, - ROUTER - } +import java.io.Serializable; +import java.util.function.Supplier; +public interface SerializableSupplier extends Supplier, Serializable { } From 5fbaefe34b6cf1c7fe419b6e6bc2b0de6633f51e Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:58:35 +0200 Subject: [PATCH 093/117] Add signals getter to Renderer --- .../utilities/common/gui/Renderer.java | 17 +++----- .../utilities/common/gui/WindowRenderer.java | 39 ++++++++++++++++--- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java index 36c093690..6b61ad737 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java @@ -18,10 +18,9 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.items.ItemStackConfig; -import com.wolfyscript.utilities.tuple.Pair; -import java.util.function.BiConsumer; -import java.util.function.Function; +import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; +import java.util.Map; +import java.util.function.Supplier; public interface Renderer { @@ -33,6 +32,8 @@ public interface Renderer { void renderComponent(T_STATE state, int slot, Component component); + Map> getSignals(); + NativeRendererModule getNativeModule(); default boolean checkBoundsAtPos(int slot, Component component) throws IllegalStateException { @@ -41,14 +42,6 @@ default boolean checkBoundsAtPos(int slot, Component component) throws IllegalSt return slot > 0 && slot < parentWidth * parentHeight && (slot / parentHeight) + component.width() <= parentWidth && (slot / parentWidth) + component.height() <= parentHeight; } - interface ReactiveFunction > { - - Pair run(T_RENDERER builder, Signal.Value value); - - Signal getSignal(); - - } - interface Builder> { Signal useSignal(String key, Class type, Function defaultValueFunction); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java index afdfeea64..00849f94d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java @@ -18,17 +18,46 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.components.WindowState; -import java.util.function.Function; -import net.kyori.adventure.text.Component; +import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; +import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; +import java.util.function.Consumer; public interface WindowRenderer extends Renderer { interface Builder extends Renderer.Builder { - Builder title(Component textComponent); + Builder title(SerializableSupplier titleSupplier); - Builder title(Signal signal, Function, Component> updateTextComponent); + + /** + *

+ * Constructs a reactive function to select Components to render. + * An empty list or null means it renders nothing. + *

+ *

+ * The function detects all the signals inside the lambda that are from outside the lambda. + * Each of these signals will cause the function to re-run on updates. + *

+ * + * @param reactiveFunction The function to run on signal updates. + * @return This builder for chaining. + */ + @Override + Builder reactive(SerializableConsumer reactiveFunction); + + > Builder position(int slot, String id, Class builderType, Consumer builderConsumer); + + > Builder render(String id, Class builderType, Consumer builderConsumer); + + > Builder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + + } + + interface ReactiveRenderBuilder { + + > ReactiveRenderBuilder render(String id, Class builderType, Consumer builderConsumer); + + > ReactiveRenderBuilder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); } From 11d095d3851066ba5f80f79fbec00849e18f8f0a Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sun, 4 Jun 2023 21:59:26 +0200 Subject: [PATCH 094/117] Replace position, render, etc. with reactive & useSignal methods --- .../utilities/common/gui/Renderer.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java index 6b61ad737..6d37919ed 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java @@ -44,22 +44,9 @@ default boolean checkBoundsAtPos(int slot, Component component) throws IllegalSt interface Builder> { - Signal useSignal(String key, Class type, Function defaultValueFunction); - - Builder position(int slot, String component); - - Builder renderAt(int slot, ItemStackConfig stackConfig); - - Builder renderAt(int slot, String component); - - Builder render(String component); - - Builder position(Signal signal, Function, Integer> slot, Function, String> selector); - - Builder render(Signal signal, Function, String> selector); - - Builder renderAt(Signal signal, Function, Integer> slot, Function, String> selector); + Signal useSignal(String key, Class type, Supplier defaultValueFunction); + Builder reactive(SerializableConsumer reactiveFunction); } } From 9e8fe28ccac2150ff3f70d2bca0b6c2d1dcad75d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 7 Jun 2023 16:35:12 +0200 Subject: [PATCH 095/117] Add title methods to WindowRenderer.Builder --- .../wolfyscript/utilities/common/gui/WindowRenderer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java index 00849f94d..a480d9c51 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java @@ -51,6 +51,11 @@ interface Builder extends Renderer.Builder { > Builder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + Builder title(net.kyori.adventure.text.Component textComponent); + + Builder title(String staticTitle); + + Builder titleSignals(Signal... signals); } interface ReactiveRenderBuilder { @@ -59,6 +64,7 @@ interface ReactiveRenderBuilder { > ReactiveRenderBuilder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + } } From 5974814ef3889075c87341cfb8789da455dfc25f Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 21 Jun 2023 16:46:02 +0200 Subject: [PATCH 096/117] Add resource export utils to WolfyUtils --- src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java b/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java index 6d4ca19ed..c6d21ce14 100644 --- a/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java +++ b/src/main/java/com/wolfyscript/utilities/common/WolfyUtils.java @@ -27,6 +27,7 @@ import com.wolfyscript.utilities.common.language.LanguageAPI; import java.io.File; +import java.util.regex.Pattern; /** * Represents a single API instance that is bound to a plugin or mod. @@ -79,5 +80,7 @@ public MapperUtil getJacksonMapperUtil() { return mapperUtil; } + public abstract void exportResource(String resourcePath, File destination, boolean replace); + public abstract void exportResources(String resourceName, File dir, boolean replace, Pattern filePattern); } From 71fd956921bbced79f0bc6bf91a6c4edd53d94cf Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 21 Jun 2023 16:49:21 +0200 Subject: [PATCH 097/117] Change GuiAPIManager#registerGuiFromFile to only require the id and builder consumer --- .../com/wolfyscript/utilities/common/gui/GuiAPIManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index a9ec86318..36b9096ca 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -40,13 +40,13 @@ public interface GuiAPIManager { void registerGui(String id, Consumer routerBuilderConsumer); /** - * Registers a new router that it loads from the given file. + * Registers a new router that it loads from the specified gui data directory. * The consumer function provides that newly constructed {@link RouterBuilder}, which can be used to manipulate the builder. * - * @param file The file to load the router from. + * @param id The unique id of the router to register. * @param routerBuilderConsumer The function to manipulate the new builder. */ - void registerGuiFromFile(String id, File file, Consumer routerBuilderConsumer); + void registerGuiFromFiles(String id, Consumer routerBuilderConsumer); /** * Gets the registered router with the specified id.
From da50bc247d44b34a3ba9857806f4c6aaba04456b Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 27 Jun 2023 22:13:30 +0200 Subject: [PATCH 098/117] Add StackInputSlot & StackInputSlotBuilder --- .../common/gui/components/StackInputSlot.java | 28 ++++++++++++++ .../gui/components/StackInputSlotBuilder.java | 37 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java new file mode 100644 index 000000000..dfa6f4844 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java @@ -0,0 +1,28 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.adapters.ItemStack; +import com.wolfyscript.utilities.common.gui.*; + +public interface StackInputSlot extends Component, Stateful, Interactable { + + Signal signal(); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java new file mode 100644 index 000000000..043497a8c --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java @@ -0,0 +1,37 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.adapters.ItemStack; +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; +import com.wolfyscript.utilities.common.gui.InteractionCallback; +import com.wolfyscript.utilities.common.gui.Signal; + +import java.util.function.Consumer; + +public interface StackInputSlotBuilder extends ComponentBuilder { + + StackInputSlotBuilder onValueChange(Consumer onValueChange); + + StackInputSlotBuilder value(Signal valueSignal); + + StackInputSlotBuilder interact(InteractionCallback interactionCallback); + +} From 24f97b718669f29fc1e112c9aa96bb55304bf895 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 28 Jun 2023 20:50:25 +0200 Subject: [PATCH 099/117] Add GuiHolder#getPlayer to get player wrapper --- .../java/com/wolfyscript/utilities/common/gui/GuiHolder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java index d9208e279..994f37257 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiHolder.java @@ -18,10 +18,14 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.adapters.Player; + public interface GuiHolder { GuiViewManager getViewManager(); + Player getPlayer(); + Window getCurrentWindow(); } From d57d1f68d70c5697aedafd0ca21621c4cbc175fe Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 28 Jun 2023 20:50:58 +0200 Subject: [PATCH 100/117] Add ComponentBuilder#getSlots for better json handling --- .../wolfyscript/utilities/common/gui/ComponentBuilder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java index cf8fe5831..997ef1f04 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -29,6 +29,8 @@ import com.wolfyscript.utilities.json.KeyedTypeIdResolver; import com.wolfyscript.utilities.json.KeyedTypeResolver; +import java.util.List; + @JsonTypeResolver(KeyedTypeResolver.class) @JsonTypeIdResolver(KeyedTypeIdResolver.class) @@ -47,6 +49,8 @@ default NamespacedKey getType() { String getID(); + List getSlots(); + COMPONENT create(PARENT parent); } From 0a7a019d69e42d113347df29f57ae2615a1531b0 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 28 Jun 2023 20:51:22 +0200 Subject: [PATCH 101/117] Add ComponentCluster & ComponentClusterBuilder --- .../gui/components/ComponentCluster.java | 44 +++++++++++++++++++ .../components/ComponentClusterBuilder.java | 32 ++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentCluster.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentCluster.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentCluster.java new file mode 100644 index 000000000..9453b3b1c --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentCluster.java @@ -0,0 +1,44 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.Component; + +import java.util.Optional; +import java.util.Set; + +public interface ComponentCluster extends Component { + + /** + * The children of this Component; or an empty Set if there are no children. + * + * @return The child Components of this Component. + */ + Set childComponents(); + + /** + * Gets the direct child Component, or an empty Optional when it wasn't found. + * + * @param id The id of the child Component. + * @return The child Component; or empty Component. + */ + Optional getChild(String id); + + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java new file mode 100644 index 000000000..c514c4a6c --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java @@ -0,0 +1,32 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.components; + +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; + +import java.util.function.Consumer; + +public interface ComponentClusterBuilder extends ComponentBuilder { + + > ComponentClusterBuilder render(String id, Class builderType, Consumer builderConsumer); + + > ComponentClusterBuilder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + +} From e3220f2a362f0196850f0ee63727a814cbce2f1d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 28 Jun 2023 20:54:06 +0200 Subject: [PATCH 102/117] Removed some unused interfaces --- .../common/gui/ChildComponentBuilder.java | 36 ------------------- .../gui/components/ButtonComponentState.java | 24 ------------- .../gui/components/CallbackInitComponent.java | 29 --------------- 3 files changed, 89 deletions(-) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java deleted file mode 100644 index 375393a1d..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ChildComponentBuilder.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import com.google.common.collect.BiMap; - -/** - * Used to create child Components for parent Components. - * - * @param The type of the data implementation. - */ -public interface ChildComponentBuilder { - - /** - * Creates the children map that has the id of the child and Component as the value. - * - * @return The child Component map. - */ - BiMap create(); -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java deleted file mode 100644 index 773280d7e..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonComponentState.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui.components; - -import com.wolfyscript.utilities.common.gui.ComponentState; - -public interface ButtonComponentState extends ComponentState { -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java deleted file mode 100644 index c732bf994..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/CallbackInitComponent.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui.components; - -import com.wolfyscript.utilities.common.gui.GuiHolder; -import com.wolfyscript.utilities.common.gui.Renderer; - -@FunctionalInterface -public interface CallbackInitComponent { - - void run(Renderer.Builder render); - -} From 709ea63d66cc690a8573de87914e0c7d2cc3ef81 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sat, 15 Jul 2023 21:27:29 +0200 Subject: [PATCH 103/117] Add fastutil dependency --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index eb2580c14..8f539fa74 100644 --- a/pom.xml +++ b/pom.xml @@ -76,6 +76,12 @@ 5.1.0 provided + + it.unimi.dsi + fastutil + 8.5.6 + provided + org.junit.jupiter From d4bccfae6b8f92850fa18c4df1400d6127135cc7 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sat, 15 Jul 2023 22:40:29 +0200 Subject: [PATCH 104/117] Fully migrated from render methods to signal based rendering * The WindowRenderer is now instantiated for each GuiViewManager and constructs the initial state, including signals and components. After that, components are only updated via signals. * Slots are stored inside the ComponentBuilder now. * Add SignalledObject that can be linked to Signals * Removed old unused code * Removed WindowState and ComponentState --- .../common/gui/ButtonStateDefault.java | 4 +- .../utilities/common/gui/Component.java | 8 +- .../common/gui/ComponentBuilder.java | 8 ++ .../utilities/common/gui/ComponentState.java | 35 -------- .../utilities/common/gui/GuiViewManager.java | 2 - .../utilities/common/gui/Interactable.java | 2 +- .../common/gui/InteractionCallback.java | 2 +- .../utilities/common/gui/RenderCallback.java | 4 +- .../utilities/common/gui/RenderContext.java | 6 +- .../utilities/common/gui/Renderer.java | 12 +-- .../utilities/common/gui/Signal.java | 51 ----------- .../utilities/common/gui/SignalledObject.java | 7 ++ .../utilities/common/gui/Stateful.java | 28 ------ .../utilities/common/gui/Window.java | 15 +--- .../utilities/common/gui/WindowBuilder.java | 88 +++++++++++++++++-- .../utilities/common/gui/WindowRenderer.java | 78 +++++++++++++--- .../common/gui/WindowStateBuilder.java | 27 ------ .../common/gui/WindowTitleUpdateCallback.java | 27 ------ .../common/gui/components/Button.java | 4 +- .../common/gui/components/ButtonBuilder.java | 8 +- .../utilities/common/gui/components/Icon.java | 4 +- .../common/gui/components/StackInputSlot.java | 2 +- .../gui/functions/ReactiveConsumer.java | 12 +-- .../gui/functions/ReactiveSupplier.java | 12 +-- .../gui/functions/SerializableConsumer.java | 3 +- .../SerializableFunction.java} | 7 +- .../functions/SerializableFunctionUtil.java | 55 ++++++++++++ .../gui/functions/SerializableRunnable.java | 4 +- .../gui/functions/SerializableSupplier.java | 3 +- .../SignalledSerializable.java} | 16 ++-- 30 files changed, 277 insertions(+), 257 deletions(-) delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/SignalledObject.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java rename src/main/java/com/wolfyscript/utilities/common/gui/{WindowState.java => functions/SerializableFunction.java} (81%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java rename src/main/java/com/wolfyscript/utilities/common/gui/{ComponentCollection.java => functions/SignalledSerializable.java} (63%) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java index cef7294ee..09a066cd1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java @@ -86,8 +86,8 @@ public Builder render(RenderCallback renderCallback) { @Override public ButtonStateDefault create() { Preconditions.checkNotNull(renderCallback, "Cannot create Component without a RenderCallback!"); - final var interactCallback = Objects.requireNonNullElseGet(this.interactionCallback, () -> (holder, state, details) -> InteractionResult.def()); - final var renderCallback = Objects.requireNonNullElseGet(this.renderCallback, () -> (holder, state) -> {}); + final var interactCallback = Objects.requireNonNullElseGet(this.interactionCallback, () -> (holder, details) -> InteractionResult.def()); + final var renderCallback = Objects.requireNonNullElseGet(this.renderCallback, () -> (holder) -> {}); return new ButtonStateDefault(key, interactCallback, renderCallback); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index fc55b2fb7..f0ecc1f95 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -23,6 +23,8 @@ import com.wolfyscript.utilities.Keyed; import com.wolfyscript.utilities.NamespacedKey; import com.wolfyscript.utilities.common.WolfyUtils; +import it.unimi.dsi.fastutil.ints.IntList; + import java.util.ArrayDeque; import java.util.Deque; import java.util.function.Consumer; @@ -52,6 +54,8 @@ default NamespacedKey type() { */ WolfyUtils getWolfyUtils(); + IntList getSlots(); + /** * The parent of this Component, or null if it is a root Component. * @@ -59,7 +63,9 @@ default NamespacedKey type() { */ Component parent(); - Renderer getRenderer(); + Renderer getRenderer(); + + Renderer construct(GuiViewManager viewManager); /** * Gets the width of this Component in slot count. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java index 997ef1f04..786f12902 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -30,6 +30,7 @@ import com.wolfyscript.utilities.json.KeyedTypeResolver; import java.util.List; +import java.util.Set; @JsonTypeResolver(KeyedTypeResolver.class) @@ -51,6 +52,13 @@ default NamespacedKey getType() { List getSlots(); + /** + * Gets the signals that this component builder uses inside the parent construction consumer. + * + * @return The signals used in this builder. + */ + Set> getSignals(); + COMPONENT create(PARENT parent); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java deleted file mode 100644 index 86b2cae3e..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentState.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -public interface ComponentState { - - ComponentState getParent(); - - Component getOwner(); - - Signal captureSignal(String signalKey, Class msgType); - - Signal captureSignal(String signalKey); - - boolean shouldUpdate(); - - InteractionResult interact(GuiHolder holder, InteractionDetails interactionDetails); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index a954dea14..833e2d262 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -63,8 +63,6 @@ public interface GuiViewManager { */ Router getRouter(); - Optional getCurrentWindowState(); - /** * Gets the currently active menu. * diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java index 531665287..011c49a9a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java @@ -32,7 +32,7 @@ public interface Interactable { * @param interactionDetails The details about the interaction. * @return The interaction result. */ - InteractionResult interact(GuiHolder holder, ComponentState state, InteractionDetails interactionDetails); + InteractionResult interact(GuiHolder holder, InteractionDetails interactionDetails); /** * Called whenever an interaction occurs.
diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java index e372af016..8b3381713 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java @@ -21,6 +21,6 @@ @FunctionalInterface public interface InteractionCallback { - InteractionResult interact(GuiHolder holder, ComponentState state, InteractionDetails details); + InteractionResult interact(GuiHolder holder, InteractionDetails details); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java index ea46ff459..fda2a45bc 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java @@ -19,8 +19,8 @@ package com.wolfyscript.utilities.common.gui; @FunctionalInterface -public interface RenderCallback { +public interface RenderCallback { - void render(GuiHolder holder, S state); + void render(GuiHolder holder); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index e7b6078d5..3a55d365f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -26,7 +26,7 @@ */ public interface RenderContext { - ComponentState getCurrentState(); + Component getCurrentComponent(); int getCurrentOffset(); @@ -37,8 +37,8 @@ public interface RenderContext { default boolean checkIfSlotInBounds(int slot) { int outerWidth; int outerHeight; - if (getCurrentState().getOwner().parent() != null) { - Component parent = getCurrentState().getOwner().parent(); + if (getCurrentComponent().parent() != null) { + Component parent = getCurrentComponent().parent(); outerWidth = parent.width(); outerHeight = parent.height(); } else { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java index 6d37919ed..7c87e05ba 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java @@ -18,19 +18,16 @@ package com.wolfyscript.utilities.common.gui; -import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; import java.util.Map; import java.util.function.Supplier; -public interface Renderer { +public interface Renderer { int getWidth(); int getHeight(); - void render(T_STATE state, GuiHolder holder, RenderContext context); - - void renderComponent(T_STATE state, int slot, Component component); + void render(GuiHolder holder, RenderContext context); Map> getSignals(); @@ -42,11 +39,10 @@ default boolean checkBoundsAtPos(int slot, Component component) throws IllegalSt return slot > 0 && slot < parentWidth * parentHeight && (slot / parentHeight) + component.width() <= parentWidth && (slot / parentWidth) + component.height() <= parentHeight; } - interface Builder> { + interface Builder { - Signal useSignal(String key, Class type, Supplier defaultValueFunction); + Signal createSignal(String key, Class type, Supplier defaultValueFunction); - Builder reactive(SerializableConsumer reactiveFunction); } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java index 6763a3541..4261e100d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java @@ -18,7 +18,6 @@ package com.wolfyscript.utilities.common.gui; -import java.util.Collection; import java.util.function.Function; /** @@ -66,54 +65,4 @@ public interface Signal { */ MT get(); - /** - * Enters the context of the specified the {@link GuiViewManager}. - * From this point onward the {@link #get()}, {@link #set(MT)}, {@link #set(MT)} return/manipulate the value of the specified view manager. - * - * @param viewManager The view manager to use. - */ - void enter(GuiViewManager viewManager); - - /** - * Exits the context of the current view manager or does nothing if no view manager is active. - * - * @return A boolean telling if the signal was updated since the last {@link #enter(GuiViewManager)}. - */ - boolean exit(); - - /** - * The Builder is used to construct signals for Components (See ComponentBuilder). - * The type is defined by whatever parent Builder constructs this Builder. Usually a ComponentBuilder. - * - * @param The type of the value tracked. - */ - interface Builder { - - /** - * The key of the Signal. - * Must be unique in the path of the component, meaning no parent nor child can create a Signal with the same key! - * - * @return The key of the Signal. - */ - String getKey(); - - Class getValueType(); - - /** - * Defines a function that is used by the signal to provide a default value, whenever requested by a for example ComponentState. - * - * @param defaultValueFunction The function to create a default value. - * @return This Builder instance for chaining. - */ - Builder defaultValue(Function defaultValueFunction); - - /** - * Creates an instance of the Signal with the predefined settings of this builder. - * - * @return A new instance of a Signal. - */ - Signal create(); - - } - } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/SignalledObject.java b/src/main/java/com/wolfyscript/utilities/common/gui/SignalledObject.java new file mode 100644 index 000000000..4fd69f567 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/SignalledObject.java @@ -0,0 +1,7 @@ +package com.wolfyscript.utilities.common.gui; + +public interface SignalledObject { + + void update(GuiViewManager viewManager, GuiHolder guiHolder, RenderContext renderContext); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java b/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java deleted file mode 100644 index 4b833255e..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Stateful.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import java.util.Map; -import java.util.Optional; - -public interface Stateful { - - S createState(ComponentState parentState, GuiViewManager viewManager); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index 9b52b6db5..f04910d25 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -36,17 +36,10 @@ public interface Window extends Interactable, Renderable { */ RenderContext createContext(GuiViewManager viewManager, UUID uuid); - /** - * Creates the state of this window for the specified view manager. - * The state keeps track of the signal values and child component(state)s. - * - * @param viewManager The view manager to create the state for. - * @return The new state for the view manager. - */ - WindowState createState(GuiViewManager viewManager); - void open(GuiViewManager viewManager); + WindowRenderer construct(GuiViewManager viewManager); + /** * Gets the type that is configured for this Window.
* When this is empty, then {@link #getSize()} will return the specified size. @@ -71,7 +64,7 @@ public interface Window extends Interactable, Renderable { * @param holder The holder to create the title for. * @return The title component. */ - net.kyori.adventure.text.Component createTitle(GuiHolder holder, WindowState window); + net.kyori.adventure.text.Component createTitle(GuiHolder holder); /** * The children of this Component; or an empty Set if there are no children. @@ -140,7 +133,7 @@ default Optional getChild(String... path) { */ int height(); - Renderer getRenderer(); + Renderer getRenderer(); default void executeForAllSlots(int positionSlot, Consumer slotFunction) { for (int i = 0; i < height(); i++) { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index c523c8927..363894d9d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; @@ -50,23 +51,96 @@ public interface WindowBuilder { WindowBuilder type(@Nullable WindowType type); /** - *

- * The callback used to create the title of the inventory. - *

*

* The implementation may work different across platforms.
* On plain Spigot servers, the titles do not support all components inside inventory titles, like fonts.
* Paper fully supports all Components inside inventory titles. *

* - * @param titleUpdateCallback - * @return + * @return This builder to allow chaining the methods */ - WindowBuilder title(WindowTitleUpdateCallback titleUpdateCallback); + WindowBuilder title(String staticTitle); WindowBuilder interact(InteractionCallback interactionCallback); - WindowBuilder render(Consumer render); + /** + * Specifies the constructor callback, that is called right before the component is created. + * + * @param render The consumer to configure the renderer + * @return This builder for chaining + */ + WindowBuilder construct(Consumer render); + + /** + *

+ * Initializes the specified component with the given id at the given slot.
+ * The component won't yet be constructed nor rendered! + *

+ * This is useful if the component has some static parts that are non-reactive.
+ * This is used when loading the components from the config files (.conf)
+ * They can then be extended and rendered inside the {@link #construct(Consumer)} callback. + *

+ *

+ *

+ * In case you need to have reactive components, create them inside the {@link #construct(Consumer)} callback. + *

+ * @param id The id of the component to render + * @param builderType The type of the builder to use + * @param builderConsumer The consumer to configure the builder + * @return This Builder for chaining + * @param The type of the component builder + */ + > WindowBuilder init(int slot, String id, Class builderType, SerializableConsumer builderConsumer); + + /** + *

+ * Renders the specified static component with the given id. + *

+ *

+ * Static components are constructed directly and are not recreated per {@link GuiViewManager}. + * Therefor they improve performance, as they are only created once.
+ * Static components cannot use signals! + *

+ *

+ * In case you need to have reactive components, create them inside the {@link #construct(Consumer)} callback. + *

+ * @param id The id of the component to render + * @param builderType The type of the builder to use + * @param builderConsumer The consumer to configure the builder + * @return This Builder for chaining + * @param The type of the component builder + */ + > WindowBuilder render(String id, Class builderType, SerializableConsumer builderConsumer); + + /** + *

+ * Initializes the specified component with the given id at the given slot, and renders it statically.
+ * It basically combines
+ * {@link #init(int, String, Class, SerializableConsumer)} and
+ * {@link #render(String, Class, SerializableConsumer)}
+ * + *

+ * This is only really useful if you need to define positions of components in code.
+ * Usually you should use the config files (.conf), to specify slots. + *

+ *

+ *

+ * Static components are constructed directly and are not recreated per {@link GuiViewManager}. + * Therefor they improve performance, as they are only created once.
+ * Static components cannot use signals! + *

+ *

+ * In case you need to have reactive components, create them inside the {@link #construct(Consumer)} callback. + *

+ * + * @param slot + * @param id + * @param builderType + * @param builderConsumer + * @return + * @param + */ + > WindowBuilder renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); Window create(Router parent); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java index a480d9c51..2f26a3df5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java @@ -20,42 +20,95 @@ import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; + import java.util.function.Consumer; -public interface WindowRenderer extends Renderer { +public interface WindowRenderer extends Renderer { interface Builder extends Renderer.Builder { + /** + * Specify a dynamic custom title supplier that is used to update the title of the Inventory.
+ *

+ * Any signal used inside the supplier will cause it to update when the signal is updated. + *

+ * @param titleSupplier The supplier that provides the new title of the inventory + * @return This builder for chaining + */ Builder title(SerializableSupplier titleSupplier); + /** + * When no dynamic title is used (see {@link #title(SerializableSupplier)}), then this method can be used to + * create placeholder resolvers for the static title. The static title can be specified using {@link WindowBuilder#title(String)}. + *

+ * The title is updated whenever any of the specified signals are updated. + *

+ * + *

+ * The placeholder will be equal to the key of the signal.
+ * e.g.
+ *

createSignal("count", () -> 0)
will provide a placeholder
<count>
+ * + *

+ * + * @param signals The signals to use as placeholders + * @return This builder for chaining + */ + Builder titleSignals(Signal... signals); /** *

- * Constructs a reactive function to select Components to render. - * An empty list or null means it renders nothing. + * Constructs a reactive function to dynamically render components.
+ * This is only recommended for complex methods like if switches are required.
+ * If a simple condition is enough {@link #ifThenRender(SerializableSupplier, String, Class, SerializableConsumer)} should be used instead! *

*

- * The function detects all the signals inside the lambda that are from outside the lambda. - * Each of these signals will cause the function to re-run on updates. + * The callback is updated whenever a signal used inside it is updated. *

* * @param reactiveFunction The function to run on signal updates. * @return This builder for chaining. */ - @Override Builder reactive(SerializableConsumer reactiveFunction); - > Builder position(int slot, String id, Class builderType, Consumer builderConsumer); + /** + *

+ * Renders the specified component whenever the condition is met.
+ * Any signal used inside the condition will cause it to update when the signal is updated. + *

+ *

+ * The specified component is constructed upon invocation of this method and simply rendered/removed whenever the condition changes.
+ * Further updates to the components need to be handled by using signals. + *

+ * + * @param condition The condition that is reactive to signals used inside it. + * @param id The id of the component to render. + * @param builderType The type of builder to use. + * @param builderConsumer The consumer to configure the builder. + * @return This builder for chaining + * @param The type of the Component Builder + */ + > Builder ifThenRender(SerializableSupplier condition, String id, Class builderType, SerializableConsumer builderConsumer); - > Builder render(String id, Class builderType, Consumer builderConsumer); + , BI extends ComponentBuilder> Builder ifThenRenderOr(SerializableSupplier condition, Class builderValidType, Consumer builderValidConsumer, Class builderInvalidType, SerializableConsumer builderInvalidConsumer); - > Builder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); - Builder title(net.kyori.adventure.text.Component textComponent); + > Builder position(int slot, String id, Class builderType, SerializableConsumer builderConsumer); - Builder title(String staticTitle); + /** + *

+ * Renders the specified component with the given id. + *

+ * + * @param id The id of the component to render + * @param builderType The type of the builder to use + * @param builderConsumer The consumer to configure the builder + * @return This Builder for chaining + * @param The type of the component builder + */ + > Builder render(String id, Class builderType, SerializableConsumer builderConsumer); - Builder titleSignals(Signal... signals); + > Builder renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); } interface ReactiveRenderBuilder { @@ -64,7 +117,6 @@ interface ReactiveRenderBuilder { > ReactiveRenderBuilder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); - } } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java deleted file mode 100644 index eb3c77258..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowStateBuilder.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -public interface WindowStateBuilder { - - WindowStateBuilder childSlot(int slot, String childID); - - WindowStateBuilder componentSlot(int slot, String... pathFromRoot); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java deleted file mode 100644 index c368d11da..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowTitleUpdateCallback.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import net.kyori.adventure.text.Component; - -public interface WindowTitleUpdateCallback { - - Component run(GuiHolder holder, Window window, WindowState state); - -} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java index a6a1c7d94..b07af40d5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java @@ -19,16 +19,14 @@ package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.gui.Component; -import com.wolfyscript.utilities.common.gui.ComponentState; import com.wolfyscript.utilities.common.gui.Interactable; -import com.wolfyscript.utilities.common.gui.Stateful; /** * A simple button that has an icon (ItemStack) and an interaction callback. * It always has a 1x1 size, because it occupies a single slot. * */ -public interface Button extends Component, Stateful, Interactable { +public interface Button extends Component, Interactable { @Override default int width() { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index 234392a55..0bb203803 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -18,10 +18,8 @@ package com.wolfyscript.utilities.common.gui.components; -import com.wolfyscript.utilities.common.gui.Component; -import com.wolfyscript.utilities.common.gui.ComponentBuilder; -import com.wolfyscript.utilities.common.gui.InteractionCallback; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.*; +import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; import com.wolfyscript.utilities.common.items.ItemStackConfig; import java.util.function.Consumer; import java.util.function.Supplier; @@ -53,7 +51,7 @@ interface IconBuilder { IconBuilder stack(ItemStackConfig stackConfig); - IconBuilder stack(Supplier> stackConfigSupplier); + IconBuilder stack(SerializableSupplier> stackConfigSupplier); IconBuilder updateOnSignals(Signal... signals); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java index 4f4af38b4..9b25ff2a5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Icon.java @@ -19,11 +19,9 @@ package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.gui.Component; -import com.wolfyscript.utilities.common.gui.ComponentState; -import com.wolfyscript.utilities.common.gui.Stateful; import com.wolfyscript.utilities.common.items.ItemStackConfig; -public interface Icon extends Component, Stateful { +public interface Icon extends Component { ItemStackConfig getItemStackConfig(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java index dfa6f4844..7a57f5850 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java @@ -21,7 +21,7 @@ import com.wolfyscript.utilities.common.adapters.ItemStack; import com.wolfyscript.utilities.common.gui.*; -public interface StackInputSlot extends Component, Stateful, Interactable { +public interface StackInputSlot extends Component, Interactable { Signal signal(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java index 437627ab5..24d60f857 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java @@ -19,6 +19,8 @@ package com.wolfyscript.utilities.common.gui.functions; import com.wolfyscript.utilities.common.gui.Signal; + +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.function.Consumer; @@ -33,12 +35,12 @@ public class ReactiveConsumer implements Consumer { private static int NEXT_ID = 0; private final int id; - private final List> signals; - private final Consumer consumer; + private final Collection> signals; + private final SerializableConsumer consumer; - public ReactiveConsumer(List> signals, Consumer consumer) { + public ReactiveConsumer(SerializableConsumer consumer) { this.id = NEXT_ID++; - this.signals = signals; + this.signals = consumer.getSignalsUsed(); this.consumer = consumer; } @@ -50,7 +52,7 @@ public void accept(T value) { consumer.accept(value); } - public List> signals() { + public Collection> signals() { return signals; } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java index d678cea9f..2b3c4ac33 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java @@ -19,6 +19,8 @@ package com.wolfyscript.utilities.common.gui.functions; import com.wolfyscript.utilities.common.gui.Signal; + +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.function.Supplier; @@ -33,12 +35,12 @@ public class ReactiveSupplier implements Supplier { private static int NEXT_ID = 0; private final int id; - private final List> signals; - private final Supplier supplier; + private final Collection> signals; + private final SerializableSupplier supplier; - public ReactiveSupplier(List> signals, Supplier supplier) { + public ReactiveSupplier(SerializableSupplier supplier) { this.id = NEXT_ID++; - this.signals = signals; + this.signals = supplier.getSignalsUsed(); this.supplier = supplier; } @@ -50,7 +52,7 @@ public T get() { return supplier.get(); } - public List> signals() { + public Collection> signals() { return signals; } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java index 89976d3bc..f9ccce54a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableConsumer.java @@ -18,8 +18,7 @@ package com.wolfyscript.utilities.common.gui.functions; -import java.io.Serializable; import java.util.function.Consumer; -public interface SerializableConsumer extends Consumer, Serializable { +public interface SerializableConsumer extends Consumer, SignalledSerializable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunction.java similarity index 81% rename from src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java rename to src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunction.java index 3315edafc..0673462c8 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunction.java @@ -16,10 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.functions; -public interface WindowState extends Signalable, ComponentCollection { - - Window getOwner(); +import java.util.function.Function; +public interface SerializableFunction extends Function, SignalledSerializable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java new file mode 100644 index 000000000..fa4b24a12 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java @@ -0,0 +1,55 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.functions; + +import com.wolfyscript.utilities.common.gui.Signal; + +import java.io.Serializable; +import java.lang.invoke.SerializedLambda; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class SerializableFunctionUtil { + + public static Collection> getUsedSignals(Serializable serializable) { + try { + // Using serialized lambda we have access to runtime information, such as which outer variables are captured and used inside the lambda. + // See: https://stackoverflow.com/a/35223119 + SerializedLambda s = getSerializedLambda(serializable); + List> signals = new ArrayList<>(s.getCapturedArgCount()); + for (int i = 0; i < s.getCapturedArgCount(); i++) { + if (s.getCapturedArg(i) instanceof Signal signal) { + signals.add(signal); + } + } + return signals; + } catch (Exception e) { + e.printStackTrace(); + } + return List.of(); + } + + private static SerializedLambda getSerializedLambda(Serializable lambda) throws Exception { + final Method method = lambda.getClass().getDeclaredMethod("writeReplace"); + method.setAccessible(true); + return (SerializedLambda) method.invoke(lambda); + } +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java index daa6bea0f..a773b8517 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableRunnable.java @@ -18,8 +18,6 @@ package com.wolfyscript.utilities.common.gui.functions; -import java.io.Serializable; - -public interface SerializableRunnable extends Runnable, Serializable { +public interface SerializableRunnable extends Runnable, SignalledSerializable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java index 17c2c59bc..c71c40a2d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableSupplier.java @@ -18,8 +18,7 @@ package com.wolfyscript.utilities.common.gui.functions; -import java.io.Serializable; import java.util.function.Supplier; -public interface SerializableSupplier extends Supplier, Serializable { +public interface SerializableSupplier extends Supplier, SignalledSerializable { } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentCollection.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java similarity index 63% rename from src/main/java/com/wolfyscript/utilities/common/gui/ComponentCollection.java rename to src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java index 887d5de94..0a6ab5fec 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentCollection.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java @@ -16,14 +16,20 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.functions; -import java.util.Optional; +import com.wolfyscript.utilities.common.gui.Signal; -public interface ComponentCollection { +import java.io.Serializable; +import java.util.Collection; - Optional get(int slot); +/** + * This represents an interface that is Serializable and contains information about the used {@link Signal}s inside of the closure. + */ +public interface SignalledSerializable extends Serializable { - void updateComponent(int slot, ComponentState componentState); + default Collection> getSignalsUsed() { + return SerializableFunctionUtil.getUsedSignals(this); + } } From e00af7544566d4956fbd504b2bc692845cdde37d Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 20 Jul 2023 22:59:57 +0200 Subject: [PATCH 105/117] Add AbstractComponentBuilderImpl & AbstractComponentImpl --- .../impl/AbstractComponentBuilderImpl.java | 68 ++++++++++++++++ .../gui/impl/AbstractComponentImpl.java | 79 +++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java new file mode 100644 index 000000000..c8944c53a --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java @@ -0,0 +1,68 @@ +package com.wolfyscript.utilities.common.gui.impl; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.ComponentBuilder; +import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.json.annotations.KeyedBaseType; +import it.unimi.dsi.fastutil.ints.IntList; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +@KeyedBaseType(baseType = ComponentBuilder.class) +public abstract class AbstractComponentBuilderImpl implements ComponentBuilder { + + @JsonProperty("type") + private final NamespacedKey type; + private final String id; + @JsonProperty("slots") + @JsonAlias("slot") + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + private final IntList slots; + @JsonIgnore + private final Set> signals = new HashSet<>(); + private final WolfyUtils wolfyUtils; + + protected AbstractComponentBuilderImpl(String id, WolfyUtils wolfyUtils, IntList slots) { + this.type = wolfyUtils.getIdentifiers().getNamespaced(getClass()); + this.id = id; + this.wolfyUtils = wolfyUtils; + this.slots = slots; + } + + @Override + public String getID() { + return id; + } + + @Override + public IntList getSlots() { + return slots; + } + + protected void addSignals(Collection> signals) { + this.signals.addAll(signals); + } + + @Override + public Set> getSignals() { + return signals; + } + + protected WolfyUtils getWolfyUtils() { + return wolfyUtils; + } + + @Override + public NamespacedKey getNamespacedKey() { + return type; + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java new file mode 100644 index 000000000..4ea10c19f --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java @@ -0,0 +1,79 @@ +package com.wolfyscript.utilities.common.gui.impl; + +import com.google.common.base.Preconditions; +import com.wolfyscript.utilities.KeyedStaticId; +import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.SignalledObject; +import it.unimi.dsi.fastutil.ints.IntList; + +import java.util.Objects; + +/** + *

+ * Contains the common properties of all Components. + * It makes it easier to create custom components. + *

+ *

+ * Additional functionality should be implemented on a per-component basis without further inheritance, to make it easier to expand/change in the future. + * Instead, use interfaces (that are already there for the platform independent API) and implement them for each component. + * Duplicate code may occur, but it can be put into static methods. + *

+ */ +public abstract class AbstractComponentImpl implements Component, SignalledObject { + + private final NamespacedKey type; + private final String internalID; + private final WolfyUtils wolfyUtils; + private final Component parent; + private final IntList slots; + + public AbstractComponentImpl(String internalID, WolfyUtils wolfyUtils, Component parent, IntList slots) { + Preconditions.checkNotNull(internalID); + Preconditions.checkNotNull(wolfyUtils); + this.type = wolfyUtils.getIdentifiers().getNamespaced(getClass()); + Preconditions.checkNotNull(type, "Missing type key! One must be provided to the Component using the annotation: %s", KeyedStaticId.class.getName()); + this.internalID = internalID; + this.wolfyUtils = wolfyUtils; + this.parent = parent; + this.slots = slots; + } + + @Override + public NamespacedKey getNamespacedKey() { + return type; + } + + @Override + public String getID() { + return internalID; + } + + @Override + public WolfyUtils getWolfyUtils() { + return wolfyUtils; + } + + @Override + public Component parent() { + return parent; + } + + public IntList getSlots() { + return slots; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractComponentImpl that = (AbstractComponentImpl) o; + return Objects.equals(type, that.type) && Objects.equals(internalID, that.internalID); + } + + @Override + public int hashCode() { + return Objects.hash(type, internalID); + } +} From f1137cdb077eac34e2a4828b62cd70572edcd858 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 26 Jul 2023 21:28:53 +0200 Subject: [PATCH 106/117] Remove Component#getRenderer --- .../java/com/wolfyscript/utilities/common/gui/Component.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index f0ecc1f95..4ec63eb2d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -25,8 +25,6 @@ import com.wolfyscript.utilities.common.WolfyUtils; import it.unimi.dsi.fastutil.ints.IntList; -import java.util.ArrayDeque; -import java.util.Deque; import java.util.function.Consumer; public interface Component extends Keyed { @@ -63,7 +61,7 @@ default NamespacedKey type() { */ Component parent(); - Renderer getRenderer(); + Component construct(GuiViewManager viewManager); Renderer construct(GuiViewManager viewManager); From 3ca664042b467490959ca7eaad0a727b61c7d3ca Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 26 Jul 2023 21:30:14 +0200 Subject: [PATCH 107/117] Add Component#remove & Remove old #contruct method --- .../java/com/wolfyscript/utilities/common/gui/Component.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 4ec63eb2d..1d93ffea5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -63,7 +63,7 @@ default NamespacedKey type() { Component construct(GuiViewManager viewManager); - Renderer construct(GuiViewManager viewManager); + void remove(GuiHolder holder, GuiViewManager viewManager, RenderContext context); /** * Gets the width of this Component in slot count. From 7ea95d6d679e695b1a6cce59e0e6a80715f434e4 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 26 Jul 2023 21:30:29 +0200 Subject: [PATCH 108/117] Add ReactiveRenderBuilder --- .../common/gui/ReactiveRenderBuilder.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java new file mode 100644 index 000000000..34a7be89a --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java @@ -0,0 +1,35 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import java.util.function.Consumer; + +public interface ReactiveRenderBuilder { + + > ReactiveResult render(String id, Class builderType, Consumer builderConsumer); + + > ReactiveResult renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + + interface ReactiveResult { + + Component construct(); + + } + +} From 828b5ea0f20f2fa288ad056ac1be7774208dd32e Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 26 Jul 2023 21:32:47 +0200 Subject: [PATCH 109/117] Add Window#render & remove old #construct method --- .../java/com/wolfyscript/utilities/common/gui/Window.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index f04910d25..bc81d91a5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -38,7 +38,9 @@ public interface Window extends Interactable, Renderable { void open(GuiViewManager viewManager); - WindowRenderer construct(GuiViewManager viewManager); + Window construct(GuiViewManager viewManager); + + void render(GuiHolder holder, GuiViewManager viewManager, RenderContext context); /** * Gets the type that is configured for this Window.
@@ -133,8 +135,6 @@ default Optional getChild(String... path) { */ int height(); - Renderer getRenderer(); - default void executeForAllSlots(int positionSlot, Consumer slotFunction) { for (int i = 0; i < height(); i++) { for (int j = 0; j < width(); j++) { From faf594f280adc8832dccc608c79a62dc955dd64c Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Wed, 26 Jul 2023 21:38:53 +0200 Subject: [PATCH 110/117] Change reactive consumer to function * this function requires a ReactiveResult to be returned --- .../utilities/common/gui/WindowRenderer.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java index 2f26a3df5..18b8ce2f1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java @@ -19,6 +19,7 @@ package com.wolfyscript.utilities.common.gui; import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; +import com.wolfyscript.utilities.common.gui.functions.SerializableFunction; import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; import java.util.function.Consumer; @@ -69,7 +70,7 @@ interface Builder extends Renderer.Builder { * @param reactiveFunction The function to run on signal updates. * @return This builder for chaining. */ - Builder reactive(SerializableConsumer reactiveFunction); + Builder reactive(SerializableFunction reactiveFunction); /** *

@@ -111,12 +112,4 @@ interface Builder extends Renderer.Builder { > Builder renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); } - interface ReactiveRenderBuilder { - - > ReactiveRenderBuilder render(String id, Class builderType, Consumer builderConsumer); - - > ReactiveRenderBuilder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); - - } - } From baec0ee74d0d3a266271bdc2ee18bcb37eed3b79 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 27 Jul 2023 19:41:38 +0200 Subject: [PATCH 111/117] Move Signal interface & Add Store interface --- .../common/gui/ComponentBuilder.java | 1 + .../utilities/common/gui/Renderer.java | 8 +++++- .../utilities/common/gui/Signalable.java | 2 ++ .../utilities/common/gui/WindowRenderer.java | 1 + .../common/gui/components/ButtonBuilder.java | 2 +- .../common/gui/components/StackInputSlot.java | 1 + .../gui/components/StackInputSlotBuilder.java | 2 +- .../gui/functions/ReactiveConsumer.java | 3 +-- .../gui/functions/ReactiveSupplier.java | 3 +-- .../functions/SerializableFunctionUtil.java | 2 +- .../gui/functions/SignalledSerializable.java | 2 +- .../impl/AbstractComponentBuilderImpl.java | 2 +- .../common/gui/{ => signal}/Signal.java | 18 ++++++++----- .../utilities/common/gui/signal/Store.java | 26 +++++++++++++++++++ 14 files changed, 56 insertions(+), 17 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => signal}/Signal.java (83%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/signal/Store.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java index 786f12902..ef44854bf 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.databind.annotation.JsonTypeResolver; import com.wolfyscript.utilities.Keyed; import com.wolfyscript.utilities.NamespacedKey; +import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.json.KeyedTypeIdResolver; import com.wolfyscript.utilities.json.KeyedTypeResolver; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java index 7c87e05ba..3ca5cb604 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java @@ -18,7 +18,11 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.signal.Signal; +import com.wolfyscript.utilities.common.gui.signal.Store; + import java.util.Map; +import java.util.function.Consumer; import java.util.function.Supplier; public interface Renderer { @@ -41,7 +45,9 @@ default boolean checkBoundsAtPos(int slot, Component component) throws IllegalSt interface Builder { - Signal createSignal(String key, Class type, Supplier defaultValueFunction); + Signal signal(String key, Class type, Supplier defaultValueFunction); + + Store syncStore(String key, Class type, Supplier getValue, Consumer setValue); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java index 6d670e698..cdabb9ae0 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Signalable.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.signal.Signal; + import java.util.Deque; import java.util.Map; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java index 18b8ce2f1..858dcb150 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java @@ -21,6 +21,7 @@ import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; import com.wolfyscript.utilities.common.gui.functions.SerializableFunction; import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; +import com.wolfyscript.utilities.common.gui.signal.Signal; import java.util.function.Consumer; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index 0bb203803..b655b9411 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -20,9 +20,9 @@ import com.wolfyscript.utilities.common.gui.*; import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; +import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.common.items.ItemStackConfig; import java.util.function.Consumer; -import java.util.function.Supplier; /** * Builder to create a {@link Button} instance. diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java index 7a57f5850..addf34522 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlot.java @@ -20,6 +20,7 @@ import com.wolfyscript.utilities.common.adapters.ItemStack; import com.wolfyscript.utilities.common.gui.*; +import com.wolfyscript.utilities.common.gui.signal.Signal; public interface StackInputSlot extends Component, Interactable { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java index 043497a8c..f3bdb6a38 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java @@ -22,7 +22,7 @@ import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.ComponentBuilder; import com.wolfyscript.utilities.common.gui.InteractionCallback; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.signal.Signal; import java.util.function.Consumer; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java index 24d60f857..b510170ea 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveConsumer.java @@ -18,10 +18,9 @@ package com.wolfyscript.utilities.common.gui.functions; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.signal.Signal; import java.util.Collection; -import java.util.List; import java.util.Objects; import java.util.function.Consumer; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java index 2b3c4ac33..a25654354 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/ReactiveSupplier.java @@ -18,10 +18,9 @@ package com.wolfyscript.utilities.common.gui.functions; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.signal.Signal; import java.util.Collection; -import java.util.List; import java.util.Objects; import java.util.function.Supplier; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java index fa4b24a12..dac394f19 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SerializableFunctionUtil.java @@ -18,7 +18,7 @@ package com.wolfyscript.utilities.common.gui.functions; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.signal.Signal; import java.io.Serializable; import java.lang.invoke.SerializedLambda; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java index 0a6ab5fec..a979ddb11 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/functions/SignalledSerializable.java @@ -18,7 +18,7 @@ package com.wolfyscript.utilities.common.gui.functions; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.signal.Signal; import java.io.Serializable; import java.util.Collection; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java index c8944c53a..737c3b430 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java @@ -8,7 +8,7 @@ import com.wolfyscript.utilities.common.WolfyUtils; import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.ComponentBuilder; -import com.wolfyscript.utilities.common.gui.Signal; +import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import it.unimi.dsi.fastutil.ints.IntList; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java b/src/main/java/com/wolfyscript/utilities/common/gui/signal/Signal.java similarity index 83% rename from src/main/java/com/wolfyscript/utilities/common/gui/Signal.java rename to src/main/java/com/wolfyscript/utilities/common/gui/signal/Signal.java index 4261e100d..df51c62fe 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Signal.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/signal/Signal.java @@ -16,7 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.signal; + +import com.wolfyscript.utilities.common.gui.SignalledObject; import java.util.function.Function; @@ -25,9 +27,9 @@ * Signals are shared across all children of the Component that creates the Signal, * meaning that children can listen to that of the parent, but not the other way around! * - * @param The value type this Signal holds. Can be any Object. + * @param The value type this Signal holds. Can be any Object. */ -public interface Signal { +public interface Signal { /** * The key of this Signal. @@ -42,27 +44,29 @@ public interface Signal { * * @return The value type of this signal. */ - Class valueType(); + Class valueType(); /** * Sets the tracked value to a new value and causes a re-render. * * @param newValue The new value to apply. */ - void set(MT newValue); + void set(V newValue); /** * Gets the tracked value, then updates it, and causes a re-render. * * @param updateFunction The function to update the value. */ - void update(Function updateFunction); + void update(Function updateFunction); /** * Gets the current value. * * @return The current value. */ - MT get(); + V get(); + + void linkTo(SignalledObject signalledObject); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/signal/Store.java b/src/main/java/com/wolfyscript/utilities/common/gui/signal/Store.java new file mode 100644 index 000000000..66a2e932c --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/signal/Store.java @@ -0,0 +1,26 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.signal; + +public interface Store extends Signal { + + + + +} From 8fd6d970ce0e9f83b275b7a66c9b85c6d7b4b120 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Thu, 27 Jul 2023 22:04:14 +0200 Subject: [PATCH 112/117] Move WindowRenderer#Builder to DynamicConstructor --- .../utilities/common/adapters/Entity.java | 4 + .../utilities/common/gui/Component.java | 2 +- ...{Renderer.java => DynamicConstructor.java} | 27 +--- .../utilities/common/gui/Window.java | 2 +- .../utilities/common/gui/WindowBuilder.java | 2 +- .../common/gui/WindowDynamicConstructor.java | 122 ++++++++++++++++++ .../utilities/common/gui/WindowRenderer.java | 116 ----------------- 7 files changed, 134 insertions(+), 141 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{Renderer.java => DynamicConstructor.java} (55%) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java delete mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java diff --git a/src/main/java/com/wolfyscript/utilities/common/adapters/Entity.java b/src/main/java/com/wolfyscript/utilities/common/adapters/Entity.java index e848b3e82..50cd26417 100644 --- a/src/main/java/com/wolfyscript/utilities/common/adapters/Entity.java +++ b/src/main/java/com/wolfyscript/utilities/common/adapters/Entity.java @@ -22,8 +22,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.UUID; + public interface Entity { + UUID uuid(); + @NotNull Location getLocation(); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 1d93ffea5..07b34e9ec 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -61,7 +61,7 @@ default NamespacedKey type() { */ Component parent(); - Component construct(GuiViewManager viewManager); + Component construct(GuiHolder holder, GuiViewManager viewManager); void remove(GuiHolder holder, GuiViewManager viewManager, RenderContext context); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/DynamicConstructor.java similarity index 55% rename from src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java rename to src/main/java/com/wolfyscript/utilities/common/gui/DynamicConstructor.java index 3ca5cb604..73e9c4022 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Renderer.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/DynamicConstructor.java @@ -21,34 +21,17 @@ import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.common.gui.signal.Store; -import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; -public interface Renderer { +public interface DynamicConstructor { - int getWidth(); + GuiViewManager viewManager(); - int getHeight(); + GuiHolder holder(); - void render(GuiHolder holder, RenderContext context); + Signal signal(String key, Class type, Supplier defaultValueFunction); - Map> getSignals(); - - NativeRendererModule getNativeModule(); - - default boolean checkBoundsAtPos(int slot, Component component) throws IllegalStateException { - int parentWidth = getWidth(); - int parentHeight = getHeight(); - return slot > 0 && slot < parentWidth * parentHeight && (slot / parentHeight) + component.width() <= parentWidth && (slot / parentWidth) + component.height() <= parentHeight; - } - - interface Builder { - - Signal signal(String key, Class type, Supplier defaultValueFunction); - - Store syncStore(String key, Class type, Supplier getValue, Consumer setValue); - - } + Store syncStore(String key, Class type, Supplier getValue, Consumer setValue); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java index bc81d91a5..ab619ccc7 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Window.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Window.java @@ -38,7 +38,7 @@ public interface Window extends Interactable, Renderable { void open(GuiViewManager viewManager); - Window construct(GuiViewManager viewManager); + Window construct(GuiHolder holder, GuiViewManager viewManager); void render(GuiHolder holder, GuiViewManager viewManager, RenderContext context); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index 363894d9d..dc06d997b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -69,7 +69,7 @@ public interface WindowBuilder { * @param render The consumer to configure the renderer * @return This builder for chaining */ - WindowBuilder construct(Consumer render); + WindowBuilder construct(Consumer render); /** *

diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java new file mode 100644 index 000000000..fed446302 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java @@ -0,0 +1,122 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; +import com.wolfyscript.utilities.common.gui.functions.SerializableFunction; +import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; +import com.wolfyscript.utilities.common.gui.signal.Signal; + +import java.util.function.Consumer; + +public interface WindowDynamicConstructor extends DynamicConstructor { + + /** + * Specify a dynamic custom title supplier that is used to update the title of the Inventory.
+ *

+ * Any signal used inside the supplier will cause it to update when the signal is updated. + *

+ * + * @param titleSupplier The supplier that provides the new title of the inventory + * @return This builder for chaining + */ + WindowDynamicConstructor title(SerializableSupplier titleSupplier); + + /** + * When no dynamic title is used (see {@link #title(SerializableSupplier)}), then this method can be used to + * create placeholder resolvers for the static title. The static title can be specified using {@link WindowBuilder#title(String)}. + *

+ * The title is updated whenever any of the specified signals are updated. + *

+ * + *

+ * The placeholder will be equal to the key of the signal.
+ * e.g.
+ *

createSignal("count", () -> 0)
will provide a placeholder
<count>
+ * + *

+ * + * @param signals The signals to use as placeholders + * @return This builder for chaining + */ + WindowDynamicConstructor titleSignals(Signal... signals); + + /** + *

+ * Constructs a reactive function to dynamically render components.
+ * This is only recommended for complex methods like if switches are required.
+ * If a simple condition is enough {@link #ifThenRender(SerializableSupplier, String, Class, SerializableConsumer)} should be used instead! + *

+ *

+ * The callback is updated whenever a signal used inside it is updated. + *

+ * + * @param reactiveFunction The function to run on signal updates. + * @return This builder for chaining. + */ + WindowDynamicConstructor reactive(SerializableFunction reactiveFunction); + + /** + *

+ * Renders the specified component whenever the condition is met.
+ * Any signal used inside the condition will cause it to update when the signal is updated. + *

+ *

+ * The specified component is constructed upon invocation of this method and simply rendered/removed whenever the condition changes.
+ * Further updates to the components need to be handled by using signals. + *

+ * + * @param condition The condition that is reactive to signals used inside it. + * @param id The id of the component to render. + * @param builderType The type of builder to use. + * @param builderConsumer The consumer to configure the builder. + * @param The type of the Component Builder + * @return This builder for chaining + */ + > WindowDynamicConstructor ifThenRender(SerializableSupplier condition, String id, Class builderType, SerializableConsumer builderConsumer); + + , BI extends ComponentBuilder> WindowDynamicConstructor ifThenRenderOr(SerializableSupplier condition, Class builderValidType, Consumer builderValidConsumer, Class builderInvalidType, SerializableConsumer builderInvalidConsumer); + + /** + * + * + * @param slot + * @param id + * @param builderType + * @param builderConsumer + * @return + * @param + */ + > WindowDynamicConstructor position(int slot, String id, Class builderType, SerializableConsumer builderConsumer); + + /** + *

+ * Renders the specified component with the given id. + *

+ * + * @param id The id of the component to render + * @param builderType The type of the builder to use + * @param builderConsumer The consumer to configure the builder + * @param The type of the component builder + * @return This Builder for chaining + */ + > WindowDynamicConstructor render(String id, Class builderType, SerializableConsumer builderConsumer); + + > WindowDynamicConstructor renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java deleted file mode 100644 index 858dcb150..000000000 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowRenderer.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins - * Copyright (C) 2021 WolfyScript - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.wolfyscript.utilities.common.gui; - -import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; -import com.wolfyscript.utilities.common.gui.functions.SerializableFunction; -import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; -import com.wolfyscript.utilities.common.gui.signal.Signal; - -import java.util.function.Consumer; - -public interface WindowRenderer extends Renderer { - - interface Builder extends Renderer.Builder { - - /** - * Specify a dynamic custom title supplier that is used to update the title of the Inventory.
- *

- * Any signal used inside the supplier will cause it to update when the signal is updated. - *

- * @param titleSupplier The supplier that provides the new title of the inventory - * @return This builder for chaining - */ - Builder title(SerializableSupplier titleSupplier); - - /** - * When no dynamic title is used (see {@link #title(SerializableSupplier)}), then this method can be used to - * create placeholder resolvers for the static title. The static title can be specified using {@link WindowBuilder#title(String)}. - *

- * The title is updated whenever any of the specified signals are updated. - *

- * - *

- * The placeholder will be equal to the key of the signal.
- * e.g.
- *

createSignal("count", () -> 0)
will provide a placeholder
<count>
- * - *

- * - * @param signals The signals to use as placeholders - * @return This builder for chaining - */ - Builder titleSignals(Signal... signals); - - /** - *

- * Constructs a reactive function to dynamically render components.
- * This is only recommended for complex methods like if switches are required.
- * If a simple condition is enough {@link #ifThenRender(SerializableSupplier, String, Class, SerializableConsumer)} should be used instead! - *

- *

- * The callback is updated whenever a signal used inside it is updated. - *

- * - * @param reactiveFunction The function to run on signal updates. - * @return This builder for chaining. - */ - Builder reactive(SerializableFunction reactiveFunction); - - /** - *

- * Renders the specified component whenever the condition is met.
- * Any signal used inside the condition will cause it to update when the signal is updated. - *

- *

- * The specified component is constructed upon invocation of this method and simply rendered/removed whenever the condition changes.
- * Further updates to the components need to be handled by using signals. - *

- * - * @param condition The condition that is reactive to signals used inside it. - * @param id The id of the component to render. - * @param builderType The type of builder to use. - * @param builderConsumer The consumer to configure the builder. - * @return This builder for chaining - * @param The type of the Component Builder - */ - > Builder ifThenRender(SerializableSupplier condition, String id, Class builderType, SerializableConsumer builderConsumer); - - , BI extends ComponentBuilder> Builder ifThenRenderOr(SerializableSupplier condition, Class builderValidType, Consumer builderValidConsumer, Class builderInvalidType, SerializableConsumer builderInvalidConsumer); - - - > Builder position(int slot, String id, Class builderType, SerializableConsumer builderConsumer); - - /** - *

- * Renders the specified component with the given id. - *

- * - * @param id The id of the component to render - * @param builderType The type of the builder to use - * @param builderConsumer The consumer to configure the builder - * @return This Builder for chaining - * @param The type of the component builder - */ - > Builder render(String id, Class builderType, SerializableConsumer builderConsumer); - - > Builder renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); - } - -} From 4dcdaac1db4dd5a1c88f0f373780b0f797234150 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 5 Sep 2023 18:34:38 +0200 Subject: [PATCH 113/117] Relocate callbacks --- .../wolfyscript/utilities/common/WolfyCore.java | 2 ++ .../utilities/common/gui/ButtonStateDefault.java | 2 ++ .../utilities/common/gui/GuiAPIManager.java | 14 +++++++++----- .../utilities/common/gui/GuiViewManager.java | 11 +++++++++++ .../utilities/common/gui/Interactable.java | 2 ++ .../utilities/common/gui/RouterBuilder.java | 2 ++ .../utilities/common/gui/WindowBuilder.java | 1 + .../gui/{ => callback}/InteractionCallback.java | 6 +++++- .../common/gui/{ => callback}/RenderCallback.java | 4 +++- .../common/gui/components/ButtonBuilder.java | 1 + .../common/gui/components/ButtonState.java | 4 ++-- .../gui/components/StackInputSlotBuilder.java | 2 +- 12 files changed, 41 insertions(+), 10 deletions(-) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => callback}/InteractionCallback.java (80%) rename src/main/java/com/wolfyscript/utilities/common/gui/{ => callback}/RenderCallback.java (89%) diff --git a/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java b/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java index 7b026cba6..668045340 100644 --- a/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java +++ b/src/main/java/com/wolfyscript/utilities/common/WolfyCore.java @@ -22,6 +22,8 @@ import com.wolfyscript.utilities.Platform; import com.wolfyscript.utilities.common.chat.Chat; import com.wolfyscript.utilities.common.registry.Registries; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.platform.AudienceProvider; import org.reflections.Reflections; /** diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java index 09a066cd1..16da727a6 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ButtonStateDefault.java @@ -19,6 +19,8 @@ package com.wolfyscript.utilities.common.gui; import com.google.common.base.Preconditions; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; +import com.wolfyscript.utilities.common.gui.callback.RenderCallback; import com.wolfyscript.utilities.common.gui.components.ButtonState; import java.util.Objects; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java index 36b9096ca..91b8c7823 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiAPIManager.java @@ -18,10 +18,10 @@ package com.wolfyscript.utilities.common.gui; -import java.io.File; import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; +import java.util.stream.Stream; /** * Handles the general GUI API and acts as an entry point to the whole creation of {@link Router}s and {@link GuiViewManager}s.
@@ -37,7 +37,7 @@ public interface GuiAPIManager { * @param id The unique id of the router to register. * @param routerBuilderConsumer The consumer that provides the new builder. */ - void registerGui(String id, Consumer routerBuilderConsumer); + void registerGui(String guiID, Consumer routerBuilderConsumer); /** * Registers a new router that it loads from the specified gui data directory. @@ -46,7 +46,7 @@ public interface GuiAPIManager { * @param id The unique id of the router to register. * @param routerBuilderConsumer The function to manipulate the new builder. */ - void registerGuiFromFiles(String id, Consumer routerBuilderConsumer); + void registerGuiFromFiles(String guiID, Consumer routerBuilderConsumer); /** * Gets the registered router with the specified id.
@@ -64,7 +64,7 @@ public interface GuiAPIManager { * @param viewers The viewers of this view. * @return The newly created view. */ - GuiViewManager createView(String clusterId, UUID... viewers); + GuiViewManager createView(String guiId, UUID... viewers); /** * Same as {@link #createView(String, UUID...)} and opens the entry menu right after the creation of the view. @@ -73,6 +73,10 @@ public interface GuiAPIManager { * @param viewers The viewers of this view. * @return The newly created view. */ - GuiViewManager createViewAndOpen(String clusterID, UUID... viewers); + GuiViewManager createViewAndOpen(String guiID, UUID... viewers); + + Stream getViewManagersFor(UUID uuid); + + Stream getViewManagersFor(UUID uuid, String guiID); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java index 833e2d262..af31f0953 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/GuiViewManager.java @@ -19,6 +19,9 @@ package com.wolfyscript.utilities.common.gui; import com.wolfyscript.utilities.common.WolfyUtils; +import com.wolfyscript.utilities.common.gui.callback.TextInputCallback; +import com.wolfyscript.utilities.common.gui.callback.TextInputTabCompleteCallback; + import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -87,4 +90,12 @@ public interface GuiViewManager { Optional getRenderContext(UUID viewer); + Optional textInputCallback(); + + void setTextInputCallback(TextInputCallback inputCallback); + + Optional textInputTabCompleteCallback(); + + void setTextInputTabCompleteCallback(TextInputTabCompleteCallback textInputTabCompleteCallback); + } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java index 011c49a9a..7e99ee643 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Interactable.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; + public interface Interactable { /** diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java index eba934d71..d9f310c85 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RouterBuilder.java @@ -18,6 +18,8 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; + import java.util.function.Consumer; public interface RouterBuilder { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index dc06d997b..fbc079ca5 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -18,6 +18,7 @@ package com.wolfyscript.utilities.common.gui; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; import com.wolfyscript.utilities.common.gui.functions.SerializableConsumer; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; import java.util.function.Consumer; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/callback/InteractionCallback.java similarity index 80% rename from src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java rename to src/main/java/com/wolfyscript/utilities/common/gui/callback/InteractionCallback.java index 8b3381713..ccb78e1ce 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/InteractionCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/callback/InteractionCallback.java @@ -16,7 +16,11 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.callback; + +import com.wolfyscript.utilities.common.gui.GuiHolder; +import com.wolfyscript.utilities.common.gui.InteractionDetails; +import com.wolfyscript.utilities.common.gui.InteractionResult; @FunctionalInterface public interface InteractionCallback { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/callback/RenderCallback.java similarity index 89% rename from src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java rename to src/main/java/com/wolfyscript/utilities/common/gui/callback/RenderCallback.java index fda2a45bc..1b1c3b33a 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderCallback.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/callback/RenderCallback.java @@ -16,7 +16,9 @@ * along with this program. If not, see . */ -package com.wolfyscript.utilities.common.gui; +package com.wolfyscript.utilities.common.gui.callback; + +import com.wolfyscript.utilities.common.gui.GuiHolder; @FunctionalInterface public interface RenderCallback { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index b655b9411..c5fe164b1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -19,6 +19,7 @@ package com.wolfyscript.utilities.common.gui.components; import com.wolfyscript.utilities.common.gui.*; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.common.items.ItemStackConfig; diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java index 4701d1dca..f14f96fe1 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonState.java @@ -18,8 +18,8 @@ package com.wolfyscript.utilities.common.gui.components; -import com.wolfyscript.utilities.common.gui.InteractionCallback; -import com.wolfyscript.utilities.common.gui.RenderCallback; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; +import com.wolfyscript.utilities.common.gui.callback.RenderCallback; import com.wolfyscript.utilities.common.gui.StateSelector; /** diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java index f3bdb6a38..f3fdb85c9 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/StackInputSlotBuilder.java @@ -21,7 +21,7 @@ import com.wolfyscript.utilities.common.adapters.ItemStack; import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.ComponentBuilder; -import com.wolfyscript.utilities.common.gui.InteractionCallback; +import com.wolfyscript.utilities.common.gui.callback.InteractionCallback; import com.wolfyscript.utilities.common.gui.signal.Signal; import java.util.function.Consumer; From 95e26656115bb831cf542d1d0fce728f524c976f Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 5 Sep 2023 18:34:54 +0200 Subject: [PATCH 114/117] Add TextInput callbacks --- .../gui/callback/TextInputCallback.java | 28 +++++++++++++++++ .../TextInputTabCompleteCallback.java | 30 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputCallback.java create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputTabCompleteCallback.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputCallback.java new file mode 100644 index 000000000..1a363069c --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputCallback.java @@ -0,0 +1,28 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.callback; + +import com.wolfyscript.utilities.common.adapters.Player; +import com.wolfyscript.utilities.common.gui.GuiViewManager; + +public interface TextInputCallback { + + boolean run(Player player, GuiViewManager viewManager, String input, String[] args); + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputTabCompleteCallback.java b/src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputTabCompleteCallback.java new file mode 100644 index 000000000..3434290fb --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/callback/TextInputTabCompleteCallback.java @@ -0,0 +1,30 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui.callback; + +import com.wolfyscript.utilities.common.adapters.Player; +import com.wolfyscript.utilities.common.gui.GuiViewManager; + +import java.util.List; + +public interface TextInputTabCompleteCallback { + + List apply(Player player, GuiViewManager viewManager, String input, String[] args); + +} From 39e5c9d0278ab445ad554d3dcd3fa823b8d468bd Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Tue, 21 Nov 2023 19:19:47 +0100 Subject: [PATCH 115/117] Add sound option to ButtonBuilder --- .../utilities/common/gui/components/ButtonBuilder.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java index c5fe164b1..b0ad7772e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ButtonBuilder.java @@ -23,7 +23,11 @@ import com.wolfyscript.utilities.common.gui.functions.SerializableSupplier; import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.common.items.ItemStackConfig; +import net.kyori.adventure.sound.Sound; + +import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Function; /** * Builder to create a {@link Button} instance. @@ -41,6 +45,8 @@ public interface ButtonBuilder extends ComponentBuilder { ButtonBuilder interact(InteractionCallback interactionCallback); + ButtonBuilder sound(Function> soundFunction); + Button create(Component parent); /** From ad4ef8caa1f5286be9661bf951589be58723c0e6 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sat, 2 Dec 2023 19:31:15 +0100 Subject: [PATCH 116/117] Add NamespacedKey#toKyoriKey --- .../java/com/wolfyscript/utilities/NamespacedKey.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/wolfyscript/utilities/NamespacedKey.java b/src/main/java/com/wolfyscript/utilities/NamespacedKey.java index 6e58c013f..9545ca225 100644 --- a/src/main/java/com/wolfyscript/utilities/NamespacedKey.java +++ b/src/main/java/com/wolfyscript/utilities/NamespacedKey.java @@ -18,6 +18,12 @@ package com.wolfyscript.utilities; +import com.fasterxml.jackson.annotation.JsonIgnore; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.key.Namespaced; +import org.intellij.lang.annotations.Pattern; +import org.intellij.lang.annotations.Subst; + /** * The NamespacedKey is used to manage and identify resources and prevent conflicts with for example plugins.
* It consists of a unique namespace and a key. (The same key can exist in different namespaces)
@@ -55,6 +61,10 @@ public interface NamespacedKey { String toString(String separator); + default net.kyori.adventure.key.Key toKyoriKey() { + return net.kyori.adventure.key.Key.key(toString(":")); + } + /** * Represents the key part of the NamespacedKey. * The idea behind this component is to make it easier to manage folders specified in the key and provide util methods for it.
From 775408e54498e6494d1ed8cdeb4fa8799b4042a8 Mon Sep 17 00:00:00 2001 From: WolfyScript Date: Sat, 2 Dec 2023 19:32:24 +0100 Subject: [PATCH 117/117] Replace slot positioning with Position class --- .../utilities/common/gui/Component.java | 14 ++- .../common/gui/ComponentBuilder.java | 8 +- .../utilities/common/gui/Position.java | 108 ++++++++++++++++++ .../utilities/common/gui/Positionable.java | 2 +- .../common/gui/ReactiveRenderBuilder.java | 2 +- .../utilities/common/gui/RenderContext.java | 2 +- .../utilities/common/gui/WindowBuilder.java | 8 +- .../common/gui/WindowDynamicConstructor.java | 12 +- .../common/gui/components/Button.java | 3 +- .../components/ComponentClusterBuilder.java | 3 +- .../impl/AbstractComponentBuilderImpl.java | 22 ++-- .../gui/impl/AbstractComponentImpl.java | 15 ++- 12 files changed, 161 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/wolfyscript/utilities/common/gui/Position.java diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java index 07b34e9ec..fc0c31374 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Component.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Component.java @@ -52,8 +52,6 @@ default NamespacedKey type() { */ WolfyUtils getWolfyUtils(); - IntList getSlots(); - /** * The parent of this Component, or null if it is a root Component. * @@ -79,6 +77,18 @@ default NamespacedKey type() { */ int height(); + Position position(); + + default int offset() { + Component parent = parent(); + int totalOffset = 0; + while(parent != null && parent.position().type() != Position.Type.ABSOLUTE) { + totalOffset += parent.position().slot(); + parent = parent.parent(); + } + return totalOffset; + } + default void executeForAllSlots(int positionSlot, Consumer slotFunction) { for (int i = 0; i < height(); i++) { for (int j = 0; j < width(); j++) { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java index ef44854bf..acf83586c 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ComponentBuilder.java @@ -39,7 +39,7 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type") @JsonPropertyOrder(value = { "type" }) @JsonIgnoreProperties(ignoreUnknown = true) -public interface ComponentBuilder extends Keyed { +public interface ComponentBuilder extends Keyed { @JsonIgnore @Override @@ -49,16 +49,16 @@ default NamespacedKey getType() { return getNamespacedKey(); } - String getID(); + String id(); - List getSlots(); + Position position(); /** * Gets the signals that this component builder uses inside the parent construction consumer. * * @return The signals used in this builder. */ - Set> getSignals(); + Set> signals(); COMPONENT create(PARENT parent); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Position.java b/src/main/java/com/wolfyscript/utilities/common/gui/Position.java new file mode 100644 index 000000000..567fbeb21 --- /dev/null +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Position.java @@ -0,0 +1,108 @@ +/* + * WolfyUtilities, APIs and Utilities for Minecraft Spigot plugins + * Copyright (C) 2021 WolfyScript + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.wolfyscript.utilities.common.gui; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.wolfyscript.utilities.json.annotations.OptionalValueDeserializer; +import com.wolfyscript.utilities.json.annotations.OptionalValueSerializer; + +import java.io.IOException; + +@OptionalValueDeserializer(deserializer = Position.ValueDeserializer.class) +@OptionalValueSerializer(serializer = Position.ValueSerializer.class) +public class Position { + + private final Type type; + private final int slot; + + @JsonCreator + public Position(@JsonProperty("type") Type type, @JsonProperty("slot") int slot) { + this.type = type; + this.slot = slot; + } + + public Type type() { + return type; + } + + public int slot() { + return slot; + } + + public static Position relative(int slot) { + return new Position(Type.RELATIVE, slot); + } + + public static Position absolute(int slot) { + return new Position(Type.ABSOLUTE, slot); + } + + public enum Type { + /** + * Relative position with the parent component as the origin + */ + @JsonAlias("relative") + RELATIVE, + /** + * Absolute position with the Window as the origin + */ + @JsonAlias("absolute") + ABSOLUTE + } + + public static class ValueDeserializer extends com.wolfyscript.utilities.json.ValueDeserializer { + + public ValueDeserializer() { + super(Position.class); + } + + @Override + public Position deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { + if (p.currentToken() == JsonToken.VALUE_NUMBER_INT) { + return Position.absolute(p.getIntValue()); + } + return Position.absolute(0); + } + } + + public static class ValueSerializer extends com.wolfyscript.utilities.json.ValueSerializer { + + public ValueSerializer() { + super(Position.class); + } + + @Override + public boolean serialize(Position targetObject, JsonGenerator generator, SerializerProvider provider) throws IOException { + if (targetObject.type() == Type.ABSOLUTE) { + generator.writeNumber(targetObject.slot()); + return true; + } + return false; + } + } + +} diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java b/src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java index ddd6e9c67..da853af5e 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/Positionable.java @@ -20,6 +20,6 @@ public interface Positionable { - int getPosition(); + Position position(); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java index 34a7be89a..38de82c94 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/ReactiveRenderBuilder.java @@ -24,7 +24,7 @@ public interface ReactiveRenderBuilder { > ReactiveResult render(String id, Class builderType, Consumer builderConsumer); - > ReactiveResult renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + > ReactiveResult renderAt(Position position, String id, Class builderType, Consumer builderConsumer); interface ReactiveResult { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java index 3a55d365f..e87b4e327 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/RenderContext.java @@ -28,7 +28,7 @@ public interface RenderContext { Component getCurrentComponent(); - int getCurrentOffset(); + int currentOffset(); void setStack(int slot, ItemStackConfig stackConfig); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java index fbc079ca5..e55653ecc 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowBuilder.java @@ -91,7 +91,7 @@ public interface WindowBuilder { * @return This Builder for chaining * @param The type of the component builder */ - > WindowBuilder init(int slot, String id, Class builderType, SerializableConsumer builderConsumer); + > WindowBuilder init(Position position, String id, Class builderType, SerializableConsumer builderConsumer); /** *

@@ -117,7 +117,7 @@ public interface WindowBuilder { *

* Initializes the specified component with the given id at the given slot, and renders it statically.
* It basically combines
- * {@link #init(int, String, Class, SerializableConsumer)} and
+ * {@link #init(Position, String, Class, SerializableConsumer)} and
* {@link #render(String, Class, SerializableConsumer)}
* *

@@ -134,14 +134,14 @@ public interface WindowBuilder { * In case you need to have reactive components, create them inside the {@link #construct(Consumer)} callback. *

* - * @param slot + * @param position * @param id * @param builderType * @param builderConsumer * @return * @param */ - > WindowBuilder renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); + > WindowBuilder renderAt(Position position, String id, Class builderType, SerializableConsumer builderConsumer); Window create(Router parent); diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java b/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java index fed446302..ec0f5b79f 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/WindowDynamicConstructor.java @@ -60,8 +60,8 @@ public interface WindowDynamicConstructor extends DynamicConstructor { /** *

* Constructs a reactive function to dynamically render components.
- * This is only recommended for complex methods like if switches are required.
- * If a simple condition is enough {@link #ifThenRender(SerializableSupplier, String, Class, SerializableConsumer)} should be used instead! + * This is only recommended for complex methods, like if switches are required.
+ * If a simple condition is enough {@link #renderWhen(SerializableSupplier, String, Class, SerializableConsumer)} should be used instead! *

*

* The callback is updated whenever a signal used inside it is updated. @@ -89,9 +89,9 @@ public interface WindowDynamicConstructor extends DynamicConstructor { * @param The type of the Component Builder * @return This builder for chaining */ - > WindowDynamicConstructor ifThenRender(SerializableSupplier condition, String id, Class builderType, SerializableConsumer builderConsumer); + > WindowDynamicConstructor renderWhen(SerializableSupplier condition, String id, Class builderType, SerializableConsumer builderConsumer); - , BI extends ComponentBuilder> WindowDynamicConstructor ifThenRenderOr(SerializableSupplier condition, Class builderValidType, Consumer builderValidConsumer, Class builderInvalidType, SerializableConsumer builderInvalidConsumer); + , BI extends ComponentBuilder> WindowDynamicConstructor renderWhenElse(SerializableSupplier condition, Class builderValidType, Consumer builderValidConsumer, Class builderInvalidType, SerializableConsumer builderInvalidConsumer); /** * @@ -103,7 +103,7 @@ public interface WindowDynamicConstructor extends DynamicConstructor { * @return * @param */ - > WindowDynamicConstructor position(int slot, String id, Class builderType, SerializableConsumer builderConsumer); + > WindowDynamicConstructor position(Position position, String id, Class builderType, SerializableConsumer builderConsumer); /** *

@@ -118,5 +118,5 @@ public interface WindowDynamicConstructor extends DynamicConstructor { */ > WindowDynamicConstructor render(String id, Class builderType, SerializableConsumer builderConsumer); - > WindowDynamicConstructor renderAt(int slot, String id, Class builderType, SerializableConsumer builderConsumer); + > WindowDynamicConstructor renderAt(Position position, String id, Class builderType, SerializableConsumer builderConsumer); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java index b07af40d5..c663eaa1b 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/Button.java @@ -20,13 +20,14 @@ import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.Interactable; +import com.wolfyscript.utilities.common.gui.Positionable; /** * A simple button that has an icon (ItemStack) and an interaction callback. * It always has a 1x1 size, because it occupies a single slot. * */ -public interface Button extends Component, Interactable { +public interface Button extends Component, Interactable, Positionable { @Override default int width() { diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java b/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java index c514c4a6c..cd50c8849 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/components/ComponentClusterBuilder.java @@ -20,6 +20,7 @@ import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.ComponentBuilder; +import com.wolfyscript.utilities.common.gui.Position; import java.util.function.Consumer; @@ -27,6 +28,6 @@ public interface ComponentClusterBuilder extends ComponentBuilder> ComponentClusterBuilder render(String id, Class builderType, Consumer builderConsumer); - > ComponentClusterBuilder renderAt(int slot, String id, Class builderType, Consumer builderConsumer); + > ComponentClusterBuilder renderAt(Position position, String id, Class builderType, Consumer builderConsumer); } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java index 737c3b430..fca14744d 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentBuilderImpl.java @@ -8,8 +8,10 @@ import com.wolfyscript.utilities.common.WolfyUtils; import com.wolfyscript.utilities.common.gui.Component; import com.wolfyscript.utilities.common.gui.ComponentBuilder; +import com.wolfyscript.utilities.common.gui.Position; import com.wolfyscript.utilities.common.gui.signal.Signal; import com.wolfyscript.utilities.json.annotations.KeyedBaseType; +import com.wolfyscript.utilities.json.annotations.OptionalValueDeserializer; import it.unimi.dsi.fastutil.ints.IntList; import java.util.Collection; @@ -17,34 +19,32 @@ import java.util.Set; @KeyedBaseType(baseType = ComponentBuilder.class) -public abstract class AbstractComponentBuilderImpl implements ComponentBuilder { +public abstract class AbstractComponentBuilderImpl implements ComponentBuilder { @JsonProperty("type") private final NamespacedKey type; private final String id; - @JsonProperty("slots") - @JsonAlias("slot") - @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - private final IntList slots; + @JsonProperty("position") + private final Position position; @JsonIgnore private final Set> signals = new HashSet<>(); private final WolfyUtils wolfyUtils; - protected AbstractComponentBuilderImpl(String id, WolfyUtils wolfyUtils, IntList slots) { + protected AbstractComponentBuilderImpl(String id, WolfyUtils wolfyUtils, Position position) { this.type = wolfyUtils.getIdentifiers().getNamespaced(getClass()); this.id = id; this.wolfyUtils = wolfyUtils; - this.slots = slots; + this.position = position; } @Override - public String getID() { + public String id() { return id; } @Override - public IntList getSlots() { - return slots; + public Position position() { + return position; } protected void addSignals(Collection> signals) { @@ -52,7 +52,7 @@ protected void addSignals(Collection> signals) { } @Override - public Set> getSignals() { + public Set> signals() { return signals; } diff --git a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java index 4ea10c19f..aba3e3309 100644 --- a/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java +++ b/src/main/java/com/wolfyscript/utilities/common/gui/impl/AbstractComponentImpl.java @@ -5,6 +5,8 @@ import com.wolfyscript.utilities.NamespacedKey; import com.wolfyscript.utilities.common.WolfyUtils; import com.wolfyscript.utilities.common.gui.Component; +import com.wolfyscript.utilities.common.gui.Position; +import com.wolfyscript.utilities.common.gui.Positionable; import com.wolfyscript.utilities.common.gui.SignalledObject; import it.unimi.dsi.fastutil.ints.IntList; @@ -21,15 +23,15 @@ * Duplicate code may occur, but it can be put into static methods. *

*/ -public abstract class AbstractComponentImpl implements Component, SignalledObject { +public abstract class AbstractComponentImpl implements Component, SignalledObject, Positionable { private final NamespacedKey type; private final String internalID; private final WolfyUtils wolfyUtils; private final Component parent; - private final IntList slots; + private final Position position; - public AbstractComponentImpl(String internalID, WolfyUtils wolfyUtils, Component parent, IntList slots) { + public AbstractComponentImpl(String internalID, WolfyUtils wolfyUtils, Component parent, Position position) { Preconditions.checkNotNull(internalID); Preconditions.checkNotNull(wolfyUtils); this.type = wolfyUtils.getIdentifiers().getNamespaced(getClass()); @@ -37,7 +39,7 @@ public AbstractComponentImpl(String internalID, WolfyUtils wolfyUtils, Component this.internalID = internalID; this.wolfyUtils = wolfyUtils; this.parent = parent; - this.slots = slots; + this.position = position; } @Override @@ -60,8 +62,9 @@ public Component parent() { return parent; } - public IntList getSlots() { - return slots; + @Override + public Position position() { + return position; } @Override