Skip to content

Commit

Permalink
feat: add on entry clicked event
Browse files Browse the repository at this point in the history
Closes #149
  • Loading branch information
klikli-dev committed Oct 12, 2023
1 parent e4cacf4 commit fa874b9
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.klikli_dev.modonomicon.api.events;

import com.klikli_dev.modonomicon.client.gui.book.EntryDisplayState;
import net.minecraft.resources.ResourceLocation;

public class EntryClickedEvent extends ModonomiconEvent {
protected ResourceLocation bookId;
protected ResourceLocation entryId;

protected double mouseX;
protected double mouseY;
protected int button;

protected EntryDisplayState displayState;

public EntryClickedEvent(ResourceLocation bookId, ResourceLocation entryId, double mouseX, double mouseY, int button, EntryDisplayState displayState) {
super(true);

this.bookId = bookId;
this.entryId = entryId;
this.mouseX = mouseX;
this.mouseY = mouseY;
this.button = button;
this.displayState = displayState;
}

public ResourceLocation getBookId() {
return this.bookId;
}

public ResourceLocation getEntryId() {
return this.entryId;
}

public double getMouseX() {
return this.mouseX;
}

public double getMouseY() {
return this.mouseY;
}

public int getButton() {
return this.button;
}

public EntryDisplayState getDisplayState() {
return this.displayState;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.klikli_dev.modonomicon.api.events;

public enum EventPriority {
HIGHEST,
HIGH,
NORMAL,
LOW,
LOWEST;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.klikli_dev.modonomicon.api.events;

public abstract class ModonomiconEvent {
private final boolean isCancelable;
private boolean isCanceled = false;

public ModonomiconEvent() {
this(true);
}

public ModonomiconEvent(boolean isCancelable) {
this.isCancelable = isCancelable;
}

public boolean isCancelable() {
return this.isCancelable;
}

public boolean isCanceled() {
return this.isCanceled;
}

public void setCanceled(boolean cancel) {
if (!this.isCancelable()) {
throw new UnsupportedOperationException(
"Attempted to call ModonomiconEvent#setCanceled() on a non-cancelable event of type: "
+ this.getClass().getCanonicalName()
);
}
this.isCanceled = cancel;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
*/
package com.klikli_dev.modonomicon.client.gui.book;

import com.klikli_dev.modonomicon.api.events.EntryClickedEvent;
import com.klikli_dev.modonomicon.api.events.ModonomiconEvent;
import com.klikli_dev.modonomicon.book.BookCategory;
import com.klikli_dev.modonomicon.book.BookCategoryBackgroundParallaxLayer;
import com.klikli_dev.modonomicon.book.BookEntry;
import com.klikli_dev.modonomicon.book.conditions.context.BookConditionEntryContext;
import com.klikli_dev.modonomicon.bookstate.BookUnlockStateManager;
import com.klikli_dev.modonomicon.bookstate.BookVisualStateManager;
import com.klikli_dev.modonomicon.client.gui.BookGuiManager;
import com.klikli_dev.modonomicon.events.ModonomiconEvents;
import com.klikli_dev.modonomicon.networking.BookEntryReadMessage;
import com.klikli_dev.modonomicon.networking.SaveCategoryStateMessage;
import com.klikli_dev.modonomicon.platform.Services;
Expand Down Expand Up @@ -118,8 +121,17 @@ public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) {
float yOffset = this.getYOffset();
for (var entry : this.category.getEntries().values()) {
var displayStyle = this.getEntryDisplayState(entry);
if (displayStyle == EntryDisplayState.UNLOCKED) {
if (this.isEntryHovered(entry, xOffset, yOffset, (int) pMouseX, (int) pMouseY)) {

if (this.isEntryHovered(entry, xOffset, yOffset, (int) pMouseX, (int) pMouseY)) {

var event = new EntryClickedEvent(this.category.getBook().getId(), entry.getId(), pMouseX, pMouseY, pButton, displayStyle);
//if event is canceled -> click was handled and we do not open the entry.
if(ModonomiconEvents.client().entryClicked(event)){
return true;
}

//only if the entry is unlocked we open it
if (displayStyle == EntryDisplayState.UNLOCKED) {
this.openEntry(entry);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.klikli_dev.modonomicon.events;

import com.klikli_dev.modonomicon.api.events.EntryClickedEvent;
import com.klikli_dev.modonomicon.api.events.EventPriority;
import com.klikli_dev.modonomicon.bookstate.BookStatesSaveData;
import com.klikli_dev.modonomicon.bookstate.BookVisualStateManager;
import com.mojang.datafixers.util.Pair;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class ModonomiconEvents {

private static final Client client = new Client();

private static final Server server = new Server();

public static Client client() {
return client;
}

public static Server server() {
return server;
}

public static class Server{

}

public static class Client{

private final List<Pair<Consumer<EntryClickedEvent>, EventPriority>> entryClickedCallbacks = new ArrayList<>();

/**
* Register a callback for the EntryClickedEvent with Normal priority.
* Forge: Should be called in FMLClientSetupEvent
* Fabric: Should be called from ClientModInitializer
*/
public void onEntryClicked(Consumer<EntryClickedEvent> callback) {
this.onEntryClicked(callback, EventPriority.NORMAL);

}

/**
* Register a callback for the EntryClickedEvent with the given priority.
* Forge: Should be called in FMLClientSetupEvent
* Fabric: Should be called from ClientModInitializer
*/
public void onEntryClicked(Consumer<EntryClickedEvent> callback, EventPriority priority) {
this.entryClickedCallbacks.add(Pair.of(callback, priority));
this.entryClickedCallbacks.sort((a, b) -> b.getSecond().compareTo(a.getSecond()));
}

/**
* Fires the entry clicked event, and returns true if the event was canceled.
*/
public boolean entryClicked(EntryClickedEvent event) {
for (var callback : this.entryClickedCallbacks) {
callback.getFirst().accept(event);
if (event.isCanceled()) {
break;
}
}

return event.isCanceled();
}
}

}

0 comments on commit fa874b9

Please sign in to comment.