From 30ee79b7c073f1cd379f1af14ac0449369ddcf0a Mon Sep 17 00:00:00 2001 From: Surya Date: Sun, 30 May 2021 21:02:56 +0530 Subject: [PATCH] Add configs --- build.gradle | 5 - .../mods/savecoords/IFileStore.java | 15 ++- .../savecoords/SaveCoordinatesClient.java | 28 ++--- .../savecoords/gui/IKeyBindConfiguration.java | 10 ++ .../savecoords/gui/impl/ConfigScreen.java | 23 ++++ .../gui/impl/ConfigViewHandler.java | 107 ++++++++++++++++++ .../gui/impl/DefaultViewHandler.java | 8 +- ...tion.java => DeletePositionOperation.java} | 6 +- .../savecoords/gui/impl/ListViewHandler.java | 13 ++- .../mods/savecoords/gui/impl/ModGui.java | 6 +- ...ration.java => PingPositionOperation.java} | 4 +- .../gui/impl/SaveConfigsOperation.java | 24 ++++ .../gui/impl/SaveCoordinatesGui.java | 66 ++++++----- ...ration.java => SavePositionOperation.java} | 8 +- .../savecoords/gui/impl/TexturedButton.java | 42 +++++++ .../savecoords/gui/impl/ViewHandlerBase.java | 13 ++- .../mods/savecoords/impl/Factory.java | 5 + .../mods/savecoords/impl/FileStore.java | 51 ++++++--- .../savecoords/impl/KeyBindConfiguration.java | 56 +++++++++ .../mods/savecoords/model/ConfigData.java | 20 ++++ .../mods/savecoords/model/ModData.java | 30 ++++- .../mods/savecoords/util/ResourceUtils.java | 2 +- src/main/resources/fabric.mod.json | 2 +- 23 files changed, 443 insertions(+), 101 deletions(-) create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/gui/IKeyBindConfiguration.java create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigScreen.java create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigViewHandler.java rename src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/{DeleteOperation.java => DeletePositionOperation.java} (60%) rename src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/{PingOperation.java => PingPositionOperation.java} (75%) create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveConfigsOperation.java rename src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/{SaveOperation.java => SavePositionOperation.java} (55%) create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/TexturedButton.java create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/impl/KeyBindConfiguration.java create mode 100644 src/main/java/me/bionicbeanie/mods/savecoords/model/ConfigData.java diff --git a/build.gradle b/build.gradle index 2fd94a5..bc21dbe 100644 --- a/build.gradle +++ b/build.gradle @@ -15,10 +15,6 @@ repositories { name = "CottonMC" url = "https://server.bbkr.space/artifactory/libs-release" } - maven { - name = "ClothConfig" - url = "https://maven.shedaniel.me/" - } } dependencies { @@ -29,7 +25,6 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" modImplementation include("io.github.cottonmc:LibGui:${project.libgui_version}") - modImplementation include("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") } processResources { diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/IFileStore.java b/src/main/java/me/bionicbeanie/mods/savecoords/IFileStore.java index 5266416..cf4a37e 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/IFileStore.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/IFileStore.java @@ -3,16 +3,21 @@ package me.bionicbeanie.mods.savecoords; import java.io.IOException; import java.util.List; +import me.bionicbeanie.mods.savecoords.model.ConfigData; import me.bionicbeanie.mods.savecoords.model.PlayerPosition; public interface IFileStore { - String getDefaultWorld() throws IOException; + String readDefaultWorldName() throws IOException; + + ConfigData readConfigData() throws IOException; - void setDefaultWorld(String defaultWorldName) throws IOException; + void writeDefaultWorldName(String defaultWorldName) throws IOException; - void save(PlayerPosition position) throws IOException; + void writePosition(PlayerPosition position) throws IOException; + + void writeConfigs(ConfigData configData) throws IOException; - void delete(String id) throws IOException; + void deletePosition(String id) throws IOException; - List list() throws IOException; + List listPositions() throws IOException; } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java b/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java index a4a93d4..ca8fb8a 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/SaveCoordinatesClient.java @@ -1,35 +1,25 @@ package me.bionicbeanie.mods.savecoords; -import org.lwjgl.glfw.GLFW; - +import me.bionicbeanie.mods.savecoords.gui.IKeyBindConfiguration; import me.bionicbeanie.mods.savecoords.gui.impl.ModGui; +import me.bionicbeanie.mods.savecoords.impl.Factory; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.minecraft.client.options.KeyBinding; -import net.minecraft.client.util.InputUtil; +import net.minecraft.client.MinecraftClient; public class SaveCoordinatesClient implements ClientModInitializer { @Override public void onInitializeClient() { - KeyBinding keyBinding = registerKeyBinding(); - + @SuppressWarnings("resource") + IFileStore fileStore = Factory.createFileStore(MinecraftClient.getInstance().runDirectory.getAbsolutePath()); + IKeyBindConfiguration keyBindConfiguration = Factory.createKeyBindConfiguration(fileStore); + ClientTickEvents.END_CLIENT_TICK.register(client -> { - while (keyBinding.wasPressed()) { - ModGui.start(client); + while (keyBindConfiguration.getDefaultKeyBinding().wasPressed()) { + ModGui.start(client, fileStore, keyBindConfiguration); } }); } - - private KeyBinding registerKeyBinding() { - String translationKey = "key.savecoords.coords"; - String category = "category.savecoords.generic"; - int keyBind = GLFW.GLFW_KEY_H; - - KeyBinding keyBinding = new KeyBinding(translationKey, InputUtil.Type.KEYSYM, keyBind, category); - - return KeyBindingHelper.registerKeyBinding(keyBinding); - } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/IKeyBindConfiguration.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/IKeyBindConfiguration.java new file mode 100644 index 0000000..5a3927e --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/IKeyBindConfiguration.java @@ -0,0 +1,10 @@ +package me.bionicbeanie.mods.savecoords.gui; + +import net.minecraft.client.options.KeyBinding; + +public interface IKeyBindConfiguration { + + KeyBinding getDefaultKeyBinding(); + + void setDefaultKeyBinding(int keyCode); +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigScreen.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigScreen.java new file mode 100644 index 0000000..60e640c --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigScreen.java @@ -0,0 +1,23 @@ +package me.bionicbeanie.mods.savecoords.gui.impl; + +import java.util.function.Consumer; + +import io.github.cottonmc.cotton.gui.GuiDescription; +import me.bionicbeanie.mods.savecoords.gui.SaveCoordinatesScreen; + +public class ConfigScreen extends SaveCoordinatesScreen{ + + private Consumer keyCodeConsumer; + + public ConfigScreen(GuiDescription description, Consumer keyCodeConsumer) { + super(description); + + this.keyCodeConsumer = keyCodeConsumer; + } + + @Override + public boolean keyReleased(int ch, int keyCode, int modifiers) { + keyCodeConsumer.accept(ch); + return super.keyReleased(ch, keyCode, modifiers); + } +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigViewHandler.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigViewHandler.java new file mode 100644 index 0000000..4b07425 --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ConfigViewHandler.java @@ -0,0 +1,107 @@ +package me.bionicbeanie.mods.savecoords.gui.impl; + +import java.util.function.Supplier; + +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import me.bionicbeanie.mods.savecoords.gui.IRootPanel; +import me.bionicbeanie.mods.savecoords.model.ConfigData; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.util.InputUtil; +import net.minecraft.client.util.InputUtil.Key; +import net.minecraft.text.LiteralText; + +class ConfigViewHandler extends ViewHandlerBase { + + private WButton keyBindingButton; + private WButton saveButton; + private WButton backButton; + private boolean focussing = false; + private int newKeyBinding = -1; + private WButton resetButton; + + public ConfigViewHandler() { + keyBindingButton = new WButton(); + saveButton = new WButton(new LiteralText("SAVE")); + backButton = new WButton(new LiteralText("BACK")); + resetButton = new WButton(new LiteralText("RESET")); + } + + @Override + protected Supplier setupView(IRootPanel rootGridPanel, ConfigData state) { + + if (state == null) { + state = new ConfigData(); + } + + newKeyBinding = state.getDefaultKeyBindingCode(); + + focussing = false; + + WLabel configLabel = new WLabel("Default Key Binding"); + rootGridPanel.add(configLabel, 4, 3, 3, 1); + + setConfigValue(state.getDefaultKeyBindingCode()); + + keyBindingButton.setOnClick(() -> { + focussing = !focussing; + if (focussing) { + keyBindingButton.setLabel(new LiteralText("_")); + } + }); + + resetButton.setOnClick(() -> { + focussing = true; + setConfigValue(new ConfigData().getDefaultKeyBindingCode()); + focussing = false; + }); + + rootGridPanel.add(keyBindingButton, 4, 4, 3, 1); + rootGridPanel.add(saveButton, 13, 9, 2, 1); + rootGridPanel.add(backButton, 0, 9, 2, 1); + rootGridPanel.add(resetButton, 8, 4, 2, 1); + + return () -> { + ConfigData data = new ConfigData(); + data.setDefaultKeyBindingCode(newKeyBinding); + + return data; + }; + } + + @Override + protected Screen createScreen() { + return new ConfigScreen(this, (k) -> { + if (focussing) { + setConfigValue(k); + focussing = false; + } + }); + } + + public void onBack(Runnable runnable) { + this.backButton.setOnClick(runnable); + } + + public void onSave(Runnable runnable) { + this.saveButton.setOnClick(runnable); + } + + private void setConfigValue(Integer k) { + newKeyBinding = k; + keyBindingButton.setLabel(new LiteralText(parseKeyName(k))); + } + + private String parseKeyName(Integer k) { + Key key = InputUtil.Type.KEYSYM.createFromCode(k); + String keyString = key.toString(); + + try { + return keyString.split("\\.")[2]; + } catch (Exception e) { + e.printStackTrace(); + } + + return keyString; + } +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DefaultViewHandler.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DefaultViewHandler.java index 484edc6..b2d0e12 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DefaultViewHandler.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DefaultViewHandler.java @@ -39,7 +39,7 @@ class DefaultViewHandler extends ViewHandlerBase { } @Override - public Supplier placeWidgets(IRootPanel root, PlayerPosition existingPosition) { + public Supplier setupView(IRootPanel root, PlayerPosition existingPosition) { PlayerRawPosition rawPosition = existingPosition == null ? locator.locate() : existingPosition; @@ -134,7 +134,7 @@ class DefaultViewHandler extends ViewHandlerBase { } try { - return fileStore.getDefaultWorld(); + return fileStore.readDefaultWorldName(); } catch (Exception e) { e.printStackTrace(); } @@ -186,8 +186,6 @@ class DefaultViewHandler extends ViewHandlerBase { } private WButton CreateButton(String name) { - WButton button = new WButton(new LiteralText(name)); - - return button; + return new WButton(new LiteralText(name)); } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DeleteOperation.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DeletePositionOperation.java similarity index 60% rename from src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DeleteOperation.java rename to src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DeletePositionOperation.java index 4f6d5df..df28090 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DeleteOperation.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/DeletePositionOperation.java @@ -4,14 +4,14 @@ import java.util.function.Supplier; import me.bionicbeanie.mods.savecoords.IFileStore; -class DeleteOperation extends ViewOperationBase { +class DeletePositionOperation extends ViewOperationBase { - public DeleteOperation(IFileStore fileStore, Supplier stateSupplier) { + public DeletePositionOperation(IFileStore fileStore, Supplier stateSupplier) { super(fileStore, stateSupplier); } @Override protected void executeOperation(IFileStore fileStore, String positionId) throws Exception { - fileStore.delete(positionId); + fileStore.deletePosition(positionId); } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java index b550e77..feb876c 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ListViewHandler.java @@ -38,7 +38,7 @@ class ListViewHandler extends ViewHandlerBase { } @Override - public Supplier placeWidgets(IRootPanel root, Void nullState) { + public Supplier setupView(IRootPanel root, Void nullState) { List positions = getPositions(fileStore); WListPanel listPanel = createListPane(positions); @@ -77,7 +77,7 @@ class ListViewHandler extends ViewHandlerBase { private List getPositions(IFileStore fileStore) { try { - List positions = fileStore.list(); + List positions = fileStore.listPositions(); Collections.sort(positions, (p1, p2) -> p2.getPositionMetadata().getLastModified() .compareTo(p1.getPositionMetadata().getLastModified())); return positions; @@ -111,7 +111,7 @@ class ListViewHandler extends ViewHandlerBase { this.location = new WLabel("Foo"); this.world = new WLabel("Foo"); this.icon = new WSprite(new Identifier("minecraft:textures/item/ender_eye.png")); - this.deleteButton = new WButton(new LiteralText("x")); + this.deleteButton = createDeleteButton(); this.pingButton = new WButton(new LiteralText("")); this.detailButton = new WButton(new LiteralText("")); @@ -138,6 +138,13 @@ class ListViewHandler extends ViewHandlerBase { this.setSize(15 * 18, 2 * 18); } + private WButton createDeleteButton() { + TexturedButton button = new TexturedButton(new LiteralText("x")); + button.setTexture(ResourceUtils.CreateIdentifier("close")); + + return button; + } + void setPosition(PlayerPosition position, IFileStore fileStore) { this.icon.setImage(ResourceUtils.CreateWorldIconIdentifier(position.getWorldDimension())); this.location.setText(new LiteralText(position.getLocationName())); diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ModGui.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ModGui.java index 57c2e9b..33e6049 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ModGui.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ModGui.java @@ -3,16 +3,16 @@ package me.bionicbeanie.mods.savecoords.gui.impl; import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.IPlayerLocator; import me.bionicbeanie.mods.savecoords.gui.IGuiController; +import me.bionicbeanie.mods.savecoords.gui.IKeyBindConfiguration; import me.bionicbeanie.mods.savecoords.impl.Factory; import net.minecraft.client.MinecraftClient; public class ModGui { - public static void start(MinecraftClient client) { + public static void start(MinecraftClient client, IFileStore fileStore, IKeyBindConfiguration keyBindConfiguration) { IGuiController controller = new GuiController(client); IPlayerLocator locator = Factory.CreatePlayerLocator(client); - IFileStore fileStore = Factory.createFileStore(client.runDirectory.getAbsolutePath()); - new SaveCoordinatesGui(fileStore, locator, controller); + new SaveCoordinatesGui(fileStore, locator, keyBindConfiguration, controller); } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/PingOperation.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/PingPositionOperation.java similarity index 75% rename from src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/PingOperation.java rename to src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/PingPositionOperation.java index bb614fb..a351d27 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/PingOperation.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/PingPositionOperation.java @@ -6,9 +6,9 @@ import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.model.PlayerRawPosition; import net.minecraft.client.MinecraftClient; -class PingOperation extends ViewOperationBase{ +class PingPositionOperation extends ViewOperationBase{ - public PingOperation(IFileStore fileStore, Supplier stateSupplier) { + public PingPositionOperation(IFileStore fileStore, Supplier stateSupplier) { super(fileStore, stateSupplier); } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveConfigsOperation.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveConfigsOperation.java new file mode 100644 index 0000000..8ed94ad --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveConfigsOperation.java @@ -0,0 +1,24 @@ +package me.bionicbeanie.mods.savecoords.gui.impl; + +import java.util.function.Supplier; + +import me.bionicbeanie.mods.savecoords.IFileStore; +import me.bionicbeanie.mods.savecoords.gui.IKeyBindConfiguration; +import me.bionicbeanie.mods.savecoords.model.ConfigData; + +public class SaveConfigsOperation extends ViewOperationBase{ + + private IKeyBindConfiguration keyBindConfiguration; + + public SaveConfigsOperation(IFileStore fileStore, IKeyBindConfiguration keyBindConfiguration, Supplier stateSupplier) { + super(fileStore, stateSupplier); + + this.keyBindConfiguration = keyBindConfiguration; + } + + @Override + protected void executeOperation(IFileStore fileStore, ConfigData state) throws Exception { + fileStore.writeConfigs(state); + this.keyBindConfiguration.setDefaultKeyBinding(state.getDefaultKeyBindingCode()); + } +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java index 1f23ed2..67b8201 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveCoordinatesGui.java @@ -1,9 +1,13 @@ package me.bionicbeanie.mods.savecoords.gui.impl; +import java.io.IOException; + import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.IPlayerLocator; import me.bionicbeanie.mods.savecoords.gui.IGuiController; +import me.bionicbeanie.mods.savecoords.gui.IKeyBindConfiguration; import me.bionicbeanie.mods.savecoords.gui.IViewHandler; +import me.bionicbeanie.mods.savecoords.model.ConfigData; import me.bionicbeanie.mods.savecoords.model.PlayerPosition; import me.bionicbeanie.mods.savecoords.model.PlayerRawPosition; @@ -13,15 +17,20 @@ public class SaveCoordinatesGui { private IFileStore fileStore; private IViewHandler defaultHandler; private IViewHandler listHandler; + private IViewHandler configHandler; private IPlayerLocator locator; + private IKeyBindConfiguration keyBindConfiguration; - SaveCoordinatesGui(IFileStore fileStore, IPlayerLocator locator, IGuiController screenController) { + SaveCoordinatesGui(IFileStore fileStore, IPlayerLocator locator, IKeyBindConfiguration keyBindConfiguration, + IGuiController screenController) { this.screenController = screenController; this.fileStore = fileStore; + this.keyBindConfiguration = keyBindConfiguration; this.locator = locator; this.defaultHandler = CreateDefaultViewHandler(); this.listHandler = CreateListViewHandler(); + this.configHandler = CreateConfigHandler(); showDefaultView(null); } @@ -29,10 +38,11 @@ public class SaveCoordinatesGui { private IViewHandler CreateDefaultViewHandler() { DefaultViewHandler handler = new DefaultViewHandler(fileStore, locator); - handler.onClose(screenController::closeScreen); handler.onSave(this::onSavePosition); handler.onList(this::showListView); - handler.onPing(new PingOperation(fileStore, locator::locate)); + handler.onConfig(this::showConfigView); + handler.onPing(new PingPositionOperation(fileStore, locator::locate)); + handler.onClose(screenController::closeScreen); return handler; } @@ -40,19 +50,28 @@ public class SaveCoordinatesGui { private IViewHandler CreateListViewHandler() { ListViewHandler handler = new ListViewHandler(fileStore, this::onDeletePosition, this::onEditPosition, this::onPingPosition); - + handler.onBack(() -> showDefaultView(null)); return handler; } + private IViewHandler CreateConfigHandler() { + ConfigViewHandler handler = new ConfigViewHandler(); + + handler.onBack(() -> showDefaultView(null)); + handler.onSave(this::onSaveConfigs); + + return handler; + } + private void onSavePosition() { - new SaveOperation(fileStore, defaultHandler::getState).run(); + new SavePositionOperation(fileStore, defaultHandler::getState).run(); showListView(); } private void onDeletePosition(PlayerPosition position) { - new DeleteOperation(fileStore, () -> position.getId()).run(); + new DeletePositionOperation(fileStore, () -> position.getId()).run(); showListView(); } @@ -61,9 +80,14 @@ public class SaveCoordinatesGui { } private void onPingPosition(PlayerRawPosition position) { - new PingOperation(fileStore, () -> position).run(); + new PingPositionOperation(fileStore, () -> position).run(); } - + + private void onSaveConfigs() { + new SaveConfigsOperation(fileStore, keyBindConfiguration, configHandler::getState).run(); + showDefaultView(null); + } + private void showDefaultView(PlayerPosition position) { screenController.openScreen(this.defaultHandler.createView(position)); } @@ -72,23 +96,11 @@ public class SaveCoordinatesGui { screenController.openScreen(this.listHandler.createView(null)); } -// public void showConfigView() { -// -// ConfigBuilder builder = ConfigBuilder.create() -// .setParentScreen(this.screen) -// .setTitle(new LiteralText("Save Coordinates config")); -// -// ConfigCategory general = builder.getOrCreateCategory(new LiteralText("Generic")); -// ConfigEntryBuilder entryBuilder = builder.entryBuilder(); -// -// general.addEntry(entryBuilder.startKeyCodeField(new LiteralText("Default Keybind"), -// InputUtil.Type.KEYSYM.createFromCode(GLFW.GLFW_KEY_H)) -// .setDefaultValue(InputUtil.Type.KEYSYM.createFromCode(GLFW.GLFW_KEY_H)) -// .setTooltip(new LiteralText("Keybind to open Save Coordinates menu")) -// .setSaveConsumer(newValue -> newValue = newValue) -// .build()); -// -// screenController.openScreen(builder.build()); -// } - + private void showConfigView() { + try { + screenController.openScreen(this.configHandler.createView(fileStore.readConfigData())); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveOperation.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SavePositionOperation.java similarity index 55% rename from src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveOperation.java rename to src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SavePositionOperation.java index acbb605..cbe9a8d 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SaveOperation.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/SavePositionOperation.java @@ -5,15 +5,15 @@ import java.util.function.Supplier; import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.model.PlayerPosition; -class SaveOperation extends ViewOperationBase { +class SavePositionOperation extends ViewOperationBase { - public SaveOperation(IFileStore fileStore, Supplier stateSupplier) { + public SavePositionOperation(IFileStore fileStore, Supplier stateSupplier) { super(fileStore, stateSupplier); } @Override protected void executeOperation(IFileStore fileStore, PlayerPosition position) throws Exception { - fileStore.save(position); - fileStore.setDefaultWorld(position.getPositionMetadata().getWorldName()); + fileStore.writePosition(position); + fileStore.writeDefaultWorldName(position.getPositionMetadata().getWorldName()); } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/TexturedButton.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/TexturedButton.java new file mode 100644 index 0000000..3edd8d6 --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/TexturedButton.java @@ -0,0 +1,42 @@ +package me.bionicbeanie.mods.savecoords.gui.impl; + +import io.github.cottonmc.cotton.gui.client.ScreenDrawing; +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class TexturedButton extends WButton { + + private Identifier texture; + + public TexturedButton(Text label) { + super(label); + } + + public void setTexture(Identifier texture) { + this.texture = texture; + } + + @Override + public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + super.paint(matrices, x, y, mouseX, mouseY); + + if (texture != null) { + ScreenDrawing.texturedGuiRect(matrices, x + 1, y + 1, getWidth() - 2, getHeight() - 2, texture, -1, -1, + 0xFFFFFF); + } + + if (getLabel() != null) { + int color = 0xE0E0E0; + if (!isEnabled()) { + color = 0xA0A0A0; + } + + int xOffset = (getIcon() != null && alignment == HorizontalAlignment.LEFT) ? 18 : 0; + ScreenDrawing.drawStringWithShadow(matrices, getLabel().asOrderedText(), alignment, x + xOffset, + y + ((20 - 8) / 2), width, color); + } + } +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ViewHandlerBase.java b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ViewHandlerBase.java index 0d1adb9..bf5c212 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ViewHandlerBase.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/gui/impl/ViewHandlerBase.java @@ -17,16 +17,21 @@ abstract class ViewHandlerBase extends LightweightGuiDescription implements I this.rootGridPanel = createRootPanel(); } - protected abstract Supplier placeWidgets(IRootPanel rootGridPanel, T state); + protected abstract Supplier setupView(IRootPanel rootGridPanel, T state); + + protected Screen createScreen() { + return new SaveCoordinatesScreen(this); + } @Override public Screen createView(T state) { rootGridPanel.reset(); - this.stateSupplier = placeWidgets(rootGridPanel, state); + this.stateSupplier = setupView(rootGridPanel, state); rootGridPanel.validate(); - return new SaveCoordinatesScreen(this); + + return createScreen(); } - + @Override public T getState() { return stateSupplier.get(); diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java b/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java index ca53b93..f695300 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/impl/Factory.java @@ -2,6 +2,7 @@ package me.bionicbeanie.mods.savecoords.impl; import me.bionicbeanie.mods.savecoords.IFileStore; import me.bionicbeanie.mods.savecoords.IPlayerLocator; +import me.bionicbeanie.mods.savecoords.gui.IKeyBindConfiguration; import net.minecraft.client.MinecraftClient; public class Factory { @@ -13,4 +14,8 @@ public class Factory { public static IPlayerLocator CreatePlayerLocator(MinecraftClient client) { return new PlayerLocator(client); } + + public static IKeyBindConfiguration createKeyBindConfiguration(IFileStore fileStore) { + return new KeyBindConfiguration(fileStore); + } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/impl/FileStore.java b/src/main/java/me/bionicbeanie/mods/savecoords/impl/FileStore.java index 410d645..8244118 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/impl/FileStore.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/impl/FileStore.java @@ -15,6 +15,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import me.bionicbeanie.mods.savecoords.IFileStore; +import me.bionicbeanie.mods.savecoords.model.ConfigData; import me.bionicbeanie.mods.savecoords.model.ModData; import me.bionicbeanie.mods.savecoords.model.PlayerPosition; @@ -41,28 +42,44 @@ class FileStore implements IFileStore { } @Override - public String getDefaultWorld() throws IOException { + public String readDefaultWorldName() throws IOException { ModData data = load(); - return data.defaultWorldName; + return data.getDefaultWorldName(); + } + + @Override + public ConfigData readConfigData() throws IOException { + ModData data = load(); + + return data.getConfigData(); } - @Override - public void setDefaultWorld(String defaultWorldName) throws IOException { - ModData data = load(); - data.defaultWorldName = defaultWorldName; + @Override + public void writeDefaultWorldName(String defaultWorldName) throws IOException { + ModData data = load(); + data.setDefaultWorldName(defaultWorldName);; + + dump(data); + } + + @Override + public void writeConfigs(ConfigData configData) throws IOException { + ModData data = load(); + data.setConfigData(configData); + dump(data); } @Override - public List list() throws IOException { + public List listPositions() throws IOException { ModData data = load(); List playerPositionList = new LinkedList<>(); - if (data.positions != null) { - for (int i = 0; i < data.positions.length; ++i) { - playerPositionList.add(data.positions[i]); + if (data.getPositions() != null) { + for (int i = 0; i < data.getPositions().length; ++i) { + playerPositionList.add(data.getPositions()[i]); } } @@ -70,8 +87,8 @@ class FileStore implements IFileStore { } @Override - public void save(PlayerPosition position) throws IOException { - List playerPositions = list(); + public void writePosition(PlayerPosition position) throws IOException { + List playerPositions = listPositions(); playerPositions.removeIf(p -> StringUtils.equalsIgnoreCase(position.getId(), p.getId())); playerPositions.add(position); @@ -79,8 +96,8 @@ class FileStore implements IFileStore { } @Override - public void delete(String id) throws IOException { - List playerPositions = list(); + public void deletePosition(String id) throws IOException { + List playerPositions = listPositions(); playerPositions.removeIf(p -> StringUtils.equalsIgnoreCase(id, p.getId())); savePositions(playerPositions); } @@ -92,7 +109,7 @@ class FileStore implements IFileStore { private void savePositions(List playerPositions) throws IOException { ModData data = load(); - data.positions = playerPositions.toArray(new PlayerPosition[playerPositions.size()]); + data.setPositions(playerPositions.toArray(new PlayerPosition[playerPositions.size()])); dump(data); } @@ -103,8 +120,8 @@ class FileStore implements IFileStore { } catch (Exception e) { // Fallback for old versions ModData data = new ModData(); - data.defaultWorldName = ""; - data.positions = gson.fromJson(String.join("", lines), PlayerPosition[].class); + data.setDefaultWorldName(""); + data.setPositions(gson.fromJson(String.join("", lines), PlayerPosition[].class)); dump(data); diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/impl/KeyBindConfiguration.java b/src/main/java/me/bionicbeanie/mods/savecoords/impl/KeyBindConfiguration.java new file mode 100644 index 0000000..0e4ebdd --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/impl/KeyBindConfiguration.java @@ -0,0 +1,56 @@ +package me.bionicbeanie.mods.savecoords.impl; + +import java.io.IOException; + +import me.bionicbeanie.mods.savecoords.IFileStore; +import me.bionicbeanie.mods.savecoords.gui.IKeyBindConfiguration; +import me.bionicbeanie.mods.savecoords.model.ConfigData; +import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.util.InputUtil; + +class KeyBindConfiguration implements IKeyBindConfiguration { + + KeyBinding defaultKeyBinding; + + KeyBindConfiguration(IFileStore fileStore) { + try { + defaultKeyBinding = createDefaultKeyBinding(fileStore); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } + + @Override + public KeyBinding getDefaultKeyBinding() { + return defaultKeyBinding; + } + + @Override + public void setDefaultKeyBinding(int keyCode) { + defaultKeyBinding = createKeyBinding(keyCode); + } + + private KeyBinding createDefaultKeyBinding(IFileStore fileStore) throws IOException { + + ConfigData configData = fileStore.readConfigData(); + + if (configData == null) { + configData = new ConfigData(); + } + + int keyBind = configData.getDefaultKeyBindingCode(); + + return createKeyBinding(keyBind); + } + + private KeyBinding createKeyBinding(int keyBind) { + String translationKey = "key.savecoords.coords"; + String category = "category.savecoords.generic"; + + KeyBinding keyBinding = new KeyBinding(translationKey, InputUtil.Type.KEYSYM, keyBind, category); + + return keyBinding; + } + +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/model/ConfigData.java b/src/main/java/me/bionicbeanie/mods/savecoords/model/ConfigData.java new file mode 100644 index 0000000..2639ed5 --- /dev/null +++ b/src/main/java/me/bionicbeanie/mods/savecoords/model/ConfigData.java @@ -0,0 +1,20 @@ +package me.bionicbeanie.mods.savecoords.model; + +import org.lwjgl.glfw.GLFW; + +public class ConfigData { + + private int defaultKeyBindingCode; + + public ConfigData() { + this.defaultKeyBindingCode = GLFW.GLFW_KEY_H; //Default value + } + + public void setDefaultKeyBindingCode(int defaultKeyBindingCode) { + this.defaultKeyBindingCode = defaultKeyBindingCode; + } + + public int getDefaultKeyBindingCode() { + return defaultKeyBindingCode; + } +} diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/model/ModData.java b/src/main/java/me/bionicbeanie/mods/savecoords/model/ModData.java index a304109..ddb485a 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/model/ModData.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/model/ModData.java @@ -2,7 +2,33 @@ package me.bionicbeanie.mods.savecoords.model; public class ModData { - public String defaultWorldName; + private String defaultWorldName; - public PlayerPosition[] positions; + private PlayerPosition[] positions; + + private ConfigData configData; + + public String getDefaultWorldName() { + return defaultWorldName; + } + + public void setDefaultWorldName(String defaultWorldName) { + this.defaultWorldName = defaultWorldName; + } + + public PlayerPosition[] getPositions() { + return positions; + } + + public void setPositions(PlayerPosition[] positions) { + this.positions = positions; + } + + public ConfigData getConfigData() { + return configData; + } + + public void setConfigData(ConfigData configData) { + this.configData = configData; + } } diff --git a/src/main/java/me/bionicbeanie/mods/savecoords/util/ResourceUtils.java b/src/main/java/me/bionicbeanie/mods/savecoords/util/ResourceUtils.java index 9e63116..2d204f8 100644 --- a/src/main/java/me/bionicbeanie/mods/savecoords/util/ResourceUtils.java +++ b/src/main/java/me/bionicbeanie/mods/savecoords/util/ResourceUtils.java @@ -39,7 +39,7 @@ public class ResourceUtils { return new TextureIcon(CreateIdentifier("more")); } - private static Identifier CreateIdentifier(String file) { + public static Identifier CreateIdentifier(String file) { return new Identifier("savecoords", "textures/gui/" + file + ".png"); } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 18bf688..80e0460 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -19,7 +19,7 @@ "environment": "*", "entrypoints": { "client": [ - "me.bionicbeanie.mods.SaveCoordinatesClient" + "me.bionicbeanie.mods.savecoords.SaveCoordinatesClient" ] }, "mixins": [