Added menu signals
This commit is contained in:
@@ -135,6 +135,17 @@ public interface Menu {
|
||||
*/
|
||||
void refresh(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Send a signal to the menu.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param signal The signal.
|
||||
*/
|
||||
default void sendSignal(@NotNull final Player player,
|
||||
@NotNull final Signal signal) {
|
||||
// Override when needed.
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data.
|
||||
*
|
||||
|
||||
@@ -122,7 +122,7 @@ public interface MenuBuilder extends PageBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the menu close handler.
|
||||
* Add a menu close handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
@@ -132,7 +132,7 @@ public interface MenuBuilder extends PageBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the menu close handler.
|
||||
* Add a menu close handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
@@ -140,7 +140,7 @@ public interface MenuBuilder extends PageBuilder {
|
||||
MenuBuilder onClose(@NotNull CloseHandler action);
|
||||
|
||||
/**
|
||||
* Set the menu open handler.
|
||||
* Add a menu open handler.
|
||||
*
|
||||
* @param action The handler.
|
||||
* @return The builder.
|
||||
@@ -148,13 +148,23 @@ public interface MenuBuilder extends PageBuilder {
|
||||
MenuBuilder onOpen(@NotNull OpenHandler action);
|
||||
|
||||
/**
|
||||
* Set the action to run on render.
|
||||
* Add an action to run on render.
|
||||
*
|
||||
* @param action The action.
|
||||
* @return The builder.
|
||||
*/
|
||||
MenuBuilder onRender(@NotNull BiConsumer<Player, Menu> action);
|
||||
|
||||
/**
|
||||
* Add an action to run on signal receive.
|
||||
*
|
||||
* @param action The action.
|
||||
* @return THe builder.
|
||||
*/
|
||||
default MenuBuilder onSignalReceive(@NotNull final SignalHandler action) {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the menu.
|
||||
*
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
/**
|
||||
* Represents a signal sent to a menu.
|
||||
*/
|
||||
public interface Signal {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.willfp.eco.core.gui.menu;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Handles signals sent to menus.
|
||||
*/
|
||||
public abstract class SignalHandler<T extends Signal> {
|
||||
/**
|
||||
* The class of signal.
|
||||
*/
|
||||
private final Class<T> signalClass;
|
||||
|
||||
/**
|
||||
* Create a new signal handler.
|
||||
*
|
||||
* @param signalClass The class of signal to handle.
|
||||
*/
|
||||
protected SignalHandler(@NotNull final Class<T> signalClass) {
|
||||
this.signalClass = signalClass;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @param signal The signal.
|
||||
*/
|
||||
public abstract void handle(@NotNull Player player,
|
||||
@NotNull Menu menu,
|
||||
@NotNull T signal);
|
||||
|
||||
/**
|
||||
* Get if this handler can handle a certain signal.
|
||||
*
|
||||
* @param signal The signal
|
||||
* @return If the signal can be handled.
|
||||
*/
|
||||
public boolean canHandleSignal(@NotNull final Signal signal) {
|
||||
return signalClass.isAssignableFrom(signal.getClass());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.willfp.eco.core.gui.page;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Signal;
|
||||
|
||||
/**
|
||||
* Represents a page change.
|
||||
*
|
||||
* @param newPage The new page.
|
||||
* @param oldPage The old page.
|
||||
*/
|
||||
public record PageChangeSignal(
|
||||
int newPage,
|
||||
int oldPage
|
||||
) implements Signal {
|
||||
|
||||
}
|
||||
@@ -43,7 +43,16 @@ public final class PageChanger implements GUIComponent {
|
||||
Page.getMaxPage(player, menu)
|
||||
)
|
||||
);
|
||||
|
||||
if (newPage == page) {
|
||||
return;
|
||||
}
|
||||
|
||||
menu.addState(player, Page.PAGE_KEY, newPage);
|
||||
menu.sendSignal(player, new PageChangeSignal(
|
||||
newPage,
|
||||
page
|
||||
));
|
||||
})
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ package com.willfp.eco.core.gui
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu
|
||||
import com.willfp.eco.core.gui.menu.MenuBuilder
|
||||
import com.willfp.eco.core.gui.menu.Signal
|
||||
import com.willfp.eco.core.gui.menu.SignalHandler
|
||||
import com.willfp.eco.core.gui.page.Page
|
||||
import com.willfp.eco.core.gui.page.PageBuilder
|
||||
import com.willfp.eco.core.gui.slot.Slot
|
||||
@@ -140,6 +142,14 @@ fun MenuBuilder.addPage(page: Int, creation: PageBuilder.() -> Unit): MenuBuilde
|
||||
return this.addPage(Page(page, builder.build()))
|
||||
}
|
||||
|
||||
/** @see MenuBuilder.onSignalReceive */
|
||||
inline fun <reified T : Signal> MenuBuilder.onSignalReceive(crossinline handler: (Player, Menu, T) -> Unit): MenuBuilder {
|
||||
return this.onSignalReceive(object : SignalHandler<T>(T::class.java) {
|
||||
override fun handle(player: Player, menu: Menu, signal: T) =
|
||||
handler(player, menu, signal)
|
||||
})
|
||||
}
|
||||
|
||||
/** Kotlin builder for menus. */
|
||||
fun menu(
|
||||
rows: Int,
|
||||
|
||||
Reference in New Issue
Block a user