Added menu signals

This commit is contained in:
Auxilor
2022-09-30 12:44:06 +01:00
parent 3b34d6ef27
commit 27d2b5c8a4
9 changed files with 140 additions and 9 deletions

View File

@@ -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.
*

View File

@@ -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.
*

View File

@@ -0,0 +1,8 @@
package com.willfp.eco.core.gui.menu;
/**
* Represents a signal sent to a menu.
*/
public interface Signal {
}

View File

@@ -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());
}
}

View File

@@ -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 {
}

View File

@@ -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();
}

View File

@@ -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,