From 13c7ba45ff201423eb8dba8a40cfb66ebb531439 Mon Sep 17 00:00:00 2001 From: Xander Date: Tue, 25 Apr 2023 16:28:41 +0100 Subject: Architectury! (#61) --- .github/workflows/gradle.yml | 12 +- .gitignore | 1 + build.gradle.kts | 260 +++------- common/.gitignore | 42 ++ common/build.gradle.kts | 52 ++ .../main/java/dev/isxander/yacl/api/Binding.java | 64 +++ .../java/dev/isxander/yacl/api/ButtonOption.java | 66 +++ .../java/dev/isxander/yacl/api/ConfigCategory.java | 94 ++++ .../java/dev/isxander/yacl/api/Controller.java | 28 + .../java/dev/isxander/yacl/api/LabelOption.java | 41 ++ .../java/dev/isxander/yacl/api/ListOption.java | 152 ++++++ .../dev/isxander/yacl/api/ListOptionEntry.java | 23 + .../java/dev/isxander/yacl/api/NameableEnum.java | 10 + .../main/java/dev/isxander/yacl/api/Option.java | 227 ++++++++ .../java/dev/isxander/yacl/api/OptionAddable.java | 19 + .../java/dev/isxander/yacl/api/OptionFlag.java | 23 + .../java/dev/isxander/yacl/api/OptionGroup.java | 94 ++++ .../dev/isxander/yacl/api/PlaceholderCategory.java | 52 ++ .../dev/isxander/yacl/api/YetAnotherConfigLib.java | 107 ++++ .../dev/isxander/yacl/api/utils/Dimension.java | 33 ++ .../isxander/yacl/api/utils/MutableDimension.java | 11 + .../dev/isxander/yacl/api/utils/OptionUtils.java | 39 ++ .../java/dev/isxander/yacl/config/ConfigEntry.java | 11 + .../dev/isxander/yacl/config/ConfigInstance.java | 48 ++ .../isxander/yacl/config/GsonConfigInstance.java | 212 ++++++++ .../java/dev/isxander/yacl/gui/AbstractWidget.java | 107 ++++ .../dev/isxander/yacl/gui/CategoryListWidget.java | 99 ++++ .../java/dev/isxander/yacl/gui/CategoryWidget.java | 38 ++ .../isxander/yacl/gui/ElementListWidgetExt.java | 177 +++++++ .../isxander/yacl/gui/LowProfileButtonWidget.java | 28 + .../dev/isxander/yacl/gui/OptionListWidget.java | 570 +++++++++++++++++++++ .../isxander/yacl/gui/RequireRestartScreen.java | 21 + .../dev/isxander/yacl/gui/SearchFieldWidget.java | 66 +++ .../isxander/yacl/gui/TextScaledButtonWidget.java | 34 ++ .../dev/isxander/yacl/gui/TooltipButtonWidget.java | 33 ++ .../java/dev/isxander/yacl/gui/YACLScreen.java | 319 ++++++++++++ .../yacl/gui/controllers/ActionController.java | 120 +++++ .../yacl/gui/controllers/BooleanController.java | 157 ++++++ .../yacl/gui/controllers/ColorController.java | 221 ++++++++ .../yacl/gui/controllers/ControllerWidget.java | 170 ++++++ .../yacl/gui/controllers/LabelController.java | 193 +++++++ .../yacl/gui/controllers/ListEntryWidget.java | 135 +++++ .../yacl/gui/controllers/TickBoxController.java | 120 +++++ .../cycling/CyclingControllerElement.java | 60 +++ .../controllers/cycling/CyclingListController.java | 79 +++ .../gui/controllers/cycling/EnumController.java | 60 +++ .../controllers/cycling/ICyclingController.java | 38 ++ .../yacl/gui/controllers/package-info.java | 12 + .../controllers/slider/DoubleSliderController.java | 114 +++++ .../controllers/slider/FloatSliderController.java | 114 +++++ .../gui/controllers/slider/ISliderController.java | 54 ++ .../slider/IntegerSliderController.java | 111 ++++ .../controllers/slider/LongSliderController.java | 111 ++++ .../slider/SliderControllerElement.java | 164 ++++++ .../yacl/gui/controllers/slider/package-info.java | 10 + .../gui/controllers/string/IStringController.java | 44 ++ .../gui/controllers/string/StringController.java | 37 ++ .../string/StringControllerElement.java | 408 +++++++++++++++ .../string/number/DoubleFieldController.java | 104 ++++ .../string/number/FloatFieldController.java | 104 ++++ .../string/number/IntegerFieldController.java | 109 ++++ .../string/number/LongFieldController.java | 109 ++++ .../string/number/NumberFieldController.java | 69 +++ .../controllers/string/number/package-info.java | 10 + .../java/dev/isxander/yacl/gui/utils/GuiUtils.java | 41 ++ .../dev/isxander/yacl/impl/ButtonOptionImpl.java | 218 ++++++++ .../dev/isxander/yacl/impl/ConfigCategoryImpl.java | 137 +++++ .../dev/isxander/yacl/impl/GenericBindingImpl.java | 35 ++ .../dev/isxander/yacl/impl/LabelOptionImpl.java | 154 ++++++ .../isxander/yacl/impl/ListOptionEntryImpl.java | 149 ++++++ .../dev/isxander/yacl/impl/ListOptionImpl.java | 338 ++++++++++++ .../dev/isxander/yacl/impl/OptionGroupImpl.java | 129 +++++ .../java/dev/isxander/yacl/impl/OptionImpl.java | 303 +++++++++++ .../yacl/impl/PlaceholderCategoryImpl.java | 99 ++++ .../yacl/impl/YetAnotherConfigLibImpl.java | 122 +++++ .../yacl/impl/utils/DimensionIntegerImpl.java | 115 +++++ .../isxander/yacl/impl/utils/YACLConstants.java | 8 + .../yacl/mixin/AbstractSelectionListMixin.java | 25 + .../yacl/mixin/OptionInstanceAccessor.java | 13 + common/src/main/resources/architectury.common.json | 3 + .../assets/yet_another_config_lib/lang/el_gr.json | 23 + .../assets/yet_another_config_lib/lang/en_us.json | 29 ++ .../assets/yet_another_config_lib/lang/et_ee.json | 18 + .../assets/yet_another_config_lib/lang/fr_fr.json | 29 ++ .../assets/yet_another_config_lib/lang/pl_pl.json | 23 + .../assets/yet_another_config_lib/lang/pt_br.json | 18 + .../assets/yet_another_config_lib/lang/ru_ru.json | 24 + .../assets/yet_another_config_lib/lang/sl_si.json | 22 + .../assets/yet_another_config_lib/lang/zh_cn.json | 29 ++ .../assets/yet_another_config_lib/lang/zh_tw.json | 23 + common/src/main/resources/yacl-128x.png | Bin 0 -> 13813 bytes common/src/main/resources/yacl.accesswidener | 6 + common/src/main/resources/yacl.mixins.json | 12 + fabric/.gitignore | 42 ++ fabric/build.gradle.kts | 158 ++++++ fabric/src/main/resources/fabric.mod.json | 35 ++ forge/.gitignore | 42 ++ forge/build.gradle.kts | 164 ++++++ forge/gradle.properties | 1 + .../isxander/yacl/forge/YACLForgeEntrypoint.java | 11 + forge/src/main/resources/META-INF/mods.toml | 28 + forge/src/main/resources/pack.mcmeta | 6 + gradle.properties | 12 +- gradle/libs.versions.toml | 48 ++ gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 6 - gradlew.bat | 14 +- settings.gradle.kts | 14 + src/client/java/dev/isxander/yacl/api/Binding.java | 64 --- .../java/dev/isxander/yacl/api/ButtonOption.java | 66 --- .../java/dev/isxander/yacl/api/ConfigCategory.java | 94 ---- .../java/dev/isxander/yacl/api/Controller.java | 28 - .../java/dev/isxander/yacl/api/LabelOption.java | 41 -- .../java/dev/isxander/yacl/api/ListOption.java | 152 ------ .../dev/isxander/yacl/api/ListOptionEntry.java | 23 - .../java/dev/isxander/yacl/api/NameableEnum.java | 10 - src/client/java/dev/isxander/yacl/api/Option.java | 227 -------- .../java/dev/isxander/yacl/api/OptionAddable.java | 19 - .../java/dev/isxander/yacl/api/OptionFlag.java | 23 - .../java/dev/isxander/yacl/api/OptionGroup.java | 94 ---- .../dev/isxander/yacl/api/PlaceholderCategory.java | 52 -- .../dev/isxander/yacl/api/YetAnotherConfigLib.java | 107 ---- .../dev/isxander/yacl/api/utils/OptionUtils.java | 39 -- .../java/dev/isxander/yacl/gui/AbstractWidget.java | 107 ---- .../dev/isxander/yacl/gui/CategoryListWidget.java | 99 ---- .../java/dev/isxander/yacl/gui/CategoryWidget.java | 38 -- .../isxander/yacl/gui/ElementListWidgetExt.java | 179 ------- .../isxander/yacl/gui/LowProfileButtonWidget.java | 29 -- .../dev/isxander/yacl/gui/OptionListWidget.java | 568 -------------------- .../isxander/yacl/gui/RequireRestartScreen.java | 21 - .../dev/isxander/yacl/gui/SearchFieldWidget.java | 66 --- .../isxander/yacl/gui/TextScaledButtonWidget.java | 34 -- .../dev/isxander/yacl/gui/TooltipButtonWidget.java | 34 -- .../java/dev/isxander/yacl/gui/YACLScreen.java | 316 ------------ .../yacl/gui/controllers/ActionController.java | 120 ----- .../yacl/gui/controllers/BooleanController.java | 157 ------ .../yacl/gui/controllers/ColorController.java | 221 -------- .../yacl/gui/controllers/ControllerWidget.java | 170 ------ .../yacl/gui/controllers/LabelController.java | 193 ------- .../yacl/gui/controllers/ListEntryWidget.java | 133 ----- .../yacl/gui/controllers/TickBoxController.java | 120 ----- .../cycling/CyclingControllerElement.java | 60 --- .../controllers/cycling/CyclingListController.java | 79 --- .../gui/controllers/cycling/EnumController.java | 60 --- .../controllers/cycling/ICyclingController.java | 38 -- .../yacl/gui/controllers/package-info.java | 12 - .../controllers/slider/DoubleSliderController.java | 114 ----- .../controllers/slider/FloatSliderController.java | 114 ----- .../gui/controllers/slider/ISliderController.java | 54 -- .../slider/IntegerSliderController.java | 111 ---- .../controllers/slider/LongSliderController.java | 111 ---- .../slider/SliderControllerElement.java | 164 ------ .../yacl/gui/controllers/slider/package-info.java | 10 - .../gui/controllers/string/IStringController.java | 44 -- .../gui/controllers/string/StringController.java | 40 -- .../string/StringControllerElement.java | 408 --------------- .../string/number/DoubleFieldController.java | 104 ---- .../string/number/FloatFieldController.java | 104 ---- .../string/number/IntegerFieldController.java | 109 ---- .../string/number/LongFieldController.java | 109 ---- .../string/number/NumberFieldController.java | 69 --- .../controllers/string/number/package-info.java | 10 - .../java/dev/isxander/yacl/gui/utils/GuiUtils.java | 41 -- .../dev/isxander/yacl/impl/ButtonOptionImpl.java | 218 -------- .../dev/isxander/yacl/impl/ConfigCategoryImpl.java | 137 ----- .../dev/isxander/yacl/impl/GenericBindingImpl.java | 35 -- .../dev/isxander/yacl/impl/LabelOptionImpl.java | 154 ------ .../isxander/yacl/impl/ListOptionEntryImpl.java | 149 ------ .../dev/isxander/yacl/impl/ListOptionImpl.java | 338 ------------ .../dev/isxander/yacl/impl/OptionGroupImpl.java | 129 ----- .../java/dev/isxander/yacl/impl/OptionImpl.java | 304 ----------- .../yacl/impl/PlaceholderCategoryImpl.java | 99 ---- .../yacl/impl/YetAnotherConfigLibImpl.java | 122 ----- .../mixin/client/AbstractSelectionListMixin.java | 26 - .../yacl/mixin/client/OptionInstanceAccessor.java | 13 - .../yet-another-config-lib.client.mixins.json | 14 - .../dev/isxander/yacl/api/utils/Dimension.java | 33 -- .../isxander/yacl/api/utils/MutableDimension.java | 11 - .../java/dev/isxander/yacl/config/ConfigEntry.java | 11 - .../dev/isxander/yacl/config/ConfigInstance.java | 48 -- .../isxander/yacl/config/GsonConfigInstance.java | 212 -------- .../yacl/impl/utils/DimensionIntegerImpl.java | 115 ----- .../isxander/yacl/impl/utils/YACLConstants.java | 8 - .../assets/yet-another-config-lib/lang/el_gr.json | 23 - .../assets/yet-another-config-lib/lang/en_us.json | 29 -- .../assets/yet-another-config-lib/lang/et_ee.json | 18 - .../assets/yet-another-config-lib/lang/fr_fr.json | 29 -- .../assets/yet-another-config-lib/lang/pl_pl.json | 23 - .../assets/yet-another-config-lib/lang/pt_br.json | 18 - .../assets/yet-another-config-lib/lang/ru_ru.json | 24 - .../assets/yet-another-config-lib/lang/sl_si.json | 22 - .../assets/yet-another-config-lib/lang/zh_cn.json | 29 -- .../assets/yet-another-config-lib/lang/zh_tw.json | 23 - src/main/resources/fabric.mod.json | 39 -- src/main/resources/yacl-128x.png | Bin 13813 -> 0 bytes src/main/resources/yacl.accesswidener | 6 - .../java/dev/isxander/yacl/test/ExampleMod.java | 11 - .../isxander/yacl/test/config/ExampleConfig.java | 44 -- .../dev/isxander/yacl/test/config/GuiTest.java | 449 ---------------- .../yacl/test/mixins/TitleScreenMixin.java | 30 -- src/testmod/resources/fabric.mod.json | 22 - .../yet-another-config-lib.test.mixins.json | 11 - test-common/.gitignore | 42 ++ test-common/build.gradle.kts | 24 + .../java/dev/isxander/yacl/test/ConfigTest.java | 51 ++ .../main/java/dev/isxander/yacl/test/GuiTest.java | 462 +++++++++++++++++ test-fabric/.gitignore | 42 ++ test-fabric/build.gradle.kts | 57 +++ .../yacl/test/fabric/ModMenuEntrypoint.java | 12 + test-fabric/src/main/resources/fabric.mod.json | 13 + test-forge/.gitignore | 42 ++ test-forge/build.gradle.kts | 63 +++ test-forge/gradle.properties | 1 + .../dev/isxander/yacl/test/forge/ForgeTest.java | 18 + test-forge/src/main/resources/META-INF/mods.toml | 28 + test-forge/src/main/resources/pack.mcmeta | 6 + 216 files changed, 9628 insertions(+), 8847 deletions(-) create mode 100644 common/.gitignore create mode 100644 common/build.gradle.kts create mode 100644 common/src/main/java/dev/isxander/yacl/api/Binding.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/ButtonOption.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/ConfigCategory.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/Controller.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/LabelOption.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/ListOption.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/ListOptionEntry.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/NameableEnum.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/Option.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/OptionAddable.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/OptionFlag.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/OptionGroup.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/PlaceholderCategory.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/YetAnotherConfigLib.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/utils/Dimension.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/utils/MutableDimension.java create mode 100644 common/src/main/java/dev/isxander/yacl/api/utils/OptionUtils.java create mode 100644 common/src/main/java/dev/isxander/yacl/config/ConfigEntry.java create mode 100644 common/src/main/java/dev/isxander/yacl/config/ConfigInstance.java create mode 100644 common/src/main/java/dev/isxander/yacl/config/GsonConfigInstance.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/AbstractWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/CategoryListWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/CategoryWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/ElementListWidgetExt.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/LowProfileButtonWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/RequireRestartScreen.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/SearchFieldWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/TextScaledButtonWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/TooltipButtonWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/YACLScreen.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/ActionController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/BooleanController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/ColorController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/LabelController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/ListEntryWidget.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/TickBoxController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/cycling/CyclingControllerElement.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/cycling/CyclingListController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/cycling/EnumController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/cycling/ICyclingController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/package-info.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/DoubleSliderController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/FloatSliderController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/ISliderController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/IntegerSliderController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/LongSliderController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/slider/package-info.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/IStringController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/StringController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/StringControllerElement.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/number/DoubleFieldController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/number/FloatFieldController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/number/IntegerFieldController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/number/LongFieldController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/number/NumberFieldController.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/controllers/string/number/package-info.java create mode 100644 common/src/main/java/dev/isxander/yacl/gui/utils/GuiUtils.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/ButtonOptionImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/ConfigCategoryImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/GenericBindingImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/LabelOptionImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/ListOptionEntryImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/ListOptionImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/OptionGroupImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/OptionImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/PlaceholderCategoryImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/YetAnotherConfigLibImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/utils/DimensionIntegerImpl.java create mode 100644 common/src/main/java/dev/isxander/yacl/impl/utils/YACLConstants.java create mode 100644 common/src/main/java/dev/isxander/yacl/mixin/AbstractSelectionListMixin.java create mode 100644 common/src/main/java/dev/isxander/yacl/mixin/OptionInstanceAccessor.java create mode 100644 common/src/main/resources/architectury.common.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/el_gr.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/en_us.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/et_ee.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/fr_fr.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/pl_pl.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/pt_br.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/ru_ru.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/sl_si.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/zh_cn.json create mode 100644 common/src/main/resources/assets/yet_another_config_lib/lang/zh_tw.json create mode 100644 common/src/main/resources/yacl-128x.png create mode 100644 common/src/main/resources/yacl.accesswidener create mode 100644 common/src/main/resources/yacl.mixins.json create mode 100644 fabric/.gitignore create mode 100644 fabric/build.gradle.kts create mode 100644 fabric/src/main/resources/fabric.mod.json create mode 100644 forge/.gitignore create mode 100644 forge/build.gradle.kts create mode 100644 forge/gradle.properties create mode 100644 forge/src/main/java/dev/isxander/yacl/forge/YACLForgeEntrypoint.java create mode 100644 forge/src/main/resources/META-INF/mods.toml create mode 100644 forge/src/main/resources/pack.mcmeta create mode 100644 gradle/libs.versions.toml delete mode 100644 src/client/java/dev/isxander/yacl/api/Binding.java delete mode 100644 src/client/java/dev/isxander/yacl/api/ButtonOption.java delete mode 100644 src/client/java/dev/isxander/yacl/api/ConfigCategory.java delete mode 100644 src/client/java/dev/isxander/yacl/api/Controller.java delete mode 100644 src/client/java/dev/isxander/yacl/api/LabelOption.java delete mode 100644 src/client/java/dev/isxander/yacl/api/ListOption.java delete mode 100644 src/client/java/dev/isxander/yacl/api/ListOptionEntry.java delete mode 100644 src/client/java/dev/isxander/yacl/api/NameableEnum.java delete mode 100644 src/client/java/dev/isxander/yacl/api/Option.java delete mode 100644 src/client/java/dev/isxander/yacl/api/OptionAddable.java delete mode 100644 src/client/java/dev/isxander/yacl/api/OptionFlag.java delete mode 100644 src/client/java/dev/isxander/yacl/api/OptionGroup.java delete mode 100644 src/client/java/dev/isxander/yacl/api/PlaceholderCategory.java delete mode 100644 src/client/java/dev/isxander/yacl/api/YetAnotherConfigLib.java delete mode 100644 src/client/java/dev/isxander/yacl/api/utils/OptionUtils.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/AbstractWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/CategoryListWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/CategoryWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/ElementListWidgetExt.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/LowProfileButtonWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/OptionListWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/RequireRestartScreen.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/SearchFieldWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/TextScaledButtonWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/TooltipButtonWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/YACLScreen.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/ActionController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/BooleanController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/ColorController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/ControllerWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/LabelController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/ListEntryWidget.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/TickBoxController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/cycling/CyclingControllerElement.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/cycling/CyclingListController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/cycling/EnumController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/cycling/ICyclingController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/package-info.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/DoubleSliderController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/FloatSliderController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/ISliderController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/IntegerSliderController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/LongSliderController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/SliderControllerElement.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/slider/package-info.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/IStringController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/StringController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/StringControllerElement.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/number/DoubleFieldController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/number/FloatFieldController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/number/IntegerFieldController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/number/LongFieldController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/number/NumberFieldController.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/controllers/string/number/package-info.java delete mode 100644 src/client/java/dev/isxander/yacl/gui/utils/GuiUtils.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/ButtonOptionImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/ConfigCategoryImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/GenericBindingImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/LabelOptionImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/ListOptionEntryImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/ListOptionImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/OptionGroupImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/OptionImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/PlaceholderCategoryImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/impl/YetAnotherConfigLibImpl.java delete mode 100644 src/client/java/dev/isxander/yacl/mixin/client/AbstractSelectionListMixin.java delete mode 100644 src/client/java/dev/isxander/yacl/mixin/client/OptionInstanceAccessor.java delete mode 100644 src/client/resources/yet-another-config-lib.client.mixins.json delete mode 100644 src/main/java/dev/isxander/yacl/api/utils/Dimension.java delete mode 100644 src/main/java/dev/isxander/yacl/api/utils/MutableDimension.java delete mode 100644 src/main/java/dev/isxander/yacl/config/ConfigEntry.java delete mode 100644 src/main/java/dev/isxander/yacl/config/ConfigInstance.java delete mode 100644 src/main/java/dev/isxander/yacl/config/GsonConfigInstance.java delete mode 100644 src/main/java/dev/isxander/yacl/impl/utils/DimensionIntegerImpl.java delete mode 100644 src/main/java/dev/isxander/yacl/impl/utils/YACLConstants.java delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/el_gr.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/en_us.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/et_ee.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/fr_fr.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/pl_pl.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/pt_br.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/ru_ru.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/sl_si.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/zh_cn.json delete mode 100644 src/main/resources/assets/yet-another-config-lib/lang/zh_tw.json delete mode 100644 src/main/resources/fabric.mod.json delete mode 100644 src/main/resources/yacl-128x.png delete mode 100644 src/main/resources/yacl.accesswidener delete mode 100644 src/testmod/java/dev/isxander/yacl/test/ExampleMod.java delete mode 100644 src/testmod/java/dev/isxander/yacl/test/config/ExampleConfig.java delete mode 100644 src/testmod/java/dev/isxander/yacl/test/config/GuiTest.java delete mode 100644 src/testmod/java/dev/isxander/yacl/test/mixins/TitleScreenMixin.java delete mode 100644 src/testmod/resources/fabric.mod.json delete mode 100644 src/testmod/resources/yet-another-config-lib.test.mixins.json create mode 100644 test-common/.gitignore create mode 100644 test-common/build.gradle.kts create mode 100644 test-common/src/main/java/dev/isxander/yacl/test/ConfigTest.java create mode 100644 test-common/src/main/java/dev/isxander/yacl/test/GuiTest.java create mode 100644 test-fabric/.gitignore create mode 100644 test-fabric/build.gradle.kts create mode 100644 test-fabric/src/main/java/dev/isxander/yacl/test/fabric/ModMenuEntrypoint.java create mode 100644 test-fabric/src/main/resources/fabric.mod.json create mode 100644 test-forge/.gitignore create mode 100644 test-forge/build.gradle.kts create mode 100644 test-forge/gradle.properties create mode 100644 test-forge/src/main/java/dev/isxander/yacl/test/forge/ForgeTest.java create mode 100644 test-forge/src/main/resources/META-INF/mods.toml create mode 100644 test-forge/src/main/resources/pack.mcmeta diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index b05f565..3786124 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -3,7 +3,7 @@ name: Gradle CI on: push: branches: - - '*' + - '**' paths-ignore: - 'README.md' - 'LICENSE' @@ -12,7 +12,7 @@ on: - 'changelogs/**' pull_request: branches: - - '*' + - '**' paths-ignore: - 'README.md' - 'LICENSE' @@ -47,4 +47,10 @@ jobs: run: ./gradlew build --no-daemon - uses: actions/upload-artifact@v3 with: - path: build/libs/*.jar + path: | + **/build/libs/ + !build/libs/ + !**/*-dev.jar + !**/*-shadow.jar + !**/*-transformProduction*.jar + !**/test*/ diff --git a/.gitignore b/.gitignore index 2f31456..fa11b06 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ build /.idea .gradle !.gitkeep +/.architectury-transformer diff --git a/build.gradle.kts b/build.gradle.kts index dde9614..0daff2c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,221 +1,109 @@ plugins { - java + alias(libs.plugins.architectury.plugin) + alias(libs.plugins.architectury.loom) apply false - id("fabric-loom") version "1.1.+" // 1.0.+ but patch must be 16 or higher - id("io.github.juuxel.loom-quiltflower") version "1.8.+" - - id("com.modrinth.minotaur") version "2.6.+" - id("me.hypherionmc.cursegradle") version "2.+" - id("com.github.breadmoirai.github-release") version "2.+" - `maven-publish` - - id("io.github.p03w.machete") version "1.+" - id("org.ajoberstar.grgit") version "5.0.0" + alias(libs.plugins.unified.publishing) apply false + alias(libs.plugins.github.release) + alias(libs.plugins.grgit) } -val ciRun = System.getenv().containsKey("GITHUB_ACTIONS") - -group = "dev.isxander" -version = "2.4.2" - -if (ciRun) - version = "$version+${grgit.branch.current().name.replace('/', '.')}-SNAPSHOT" - -loom { - splitEnvironmentSourceSets() - - mods { - register("yet-another-config-lib") { - sourceSet(sourceSets["main"]) - sourceSet(sourceSets["client"]) - } - } +architectury { + minecraft = libs.versions.minecraft.get() } -val testmod by sourceSets.registering { - compileClasspath += sourceSets.main.get().compileClasspath - runtimeClasspath += sourceSets.main.get().runtimeClasspath - compileClasspath += sourceSets["client"].compileClasspath - runtimeClasspath += sourceSets["client"].runtimeClasspath -} +val changelogText = file("changelogs/${project.version}.md").takeIf { it.exists() }?.readText() ?: "No changelog provided." +val snapshotVer = "${grgit.branch.current().name.replace('/', '.')}-SNAPSHOT" -loom { - accessWidenerPath.set(file("src/main/resources/yacl.accesswidener")) +allprojects { + apply(plugin = "java") + apply(plugin = "maven-publish") + apply(plugin = "architectury-plugin") - runs { - register("testmod") { - client() - ideConfigGenerated(true) - name("Test Mod") - source(testmod.get()) - } + version = "2.5.0+1.19.4" + group = "dev.isxander" - named("client") { ideConfigGenerated(false) } - named("server") { ideConfigGenerated(false) } + if (System.getenv().containsKey("GITHUB_ACTIONS")) { + version = "$version+$snapshotVer" } - createRemapConfigurations(testmod.get()) -} + pluginManager.withPlugin("base") { + val base = the() -repositories { - mavenCentral() - maven("https://maven.terraformersmc.com") - maven("https://maven.quiltmc.org/repository/release") -} - -val minecraftVersion: String by project -val fabricLoaderVersion: String by project -val qmBuild: String by project - -dependencies { - minecraft("com.mojang:minecraft:$minecraftVersion") - mappings(loom.layered { - mappings("org.quiltmc:quilt-mappings:$minecraftVersion+build.$qmBuild:intermediary-v2") - officialMojangMappings() - }) - modImplementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") - - "modClientImplementation"(fabricApi.module("fabric-resource-loader-v0", "0.76.0+1.19.4")) - - "testmodImplementation"(sourceSets.main.get().output) - "testmodImplementation"(sourceSets["client"].output) -} - -java { - withSourcesJar() - withJavadocJar() -} - -tasks { - processResources { - val modId: String by project - val modName: String by project - val modDescription: String by project - val githubProject: String by project - - inputs.property("id", modId) - inputs.property("group", project.group) - inputs.property("name", modName) - inputs.property("description", modDescription) - inputs.property("version", project.version) - inputs.property("github", githubProject) - - filesMatching(listOf("fabric.mod.json", "quilt.mod.json")) { - expand( - "id" to modId, - "group" to project.group, - "name" to modName, - "description" to modDescription, - "version" to project.version, - "github" to githubProject, - ) - } + base.archivesName.set("yet-another-config-lib-${project.name}") } - register("releaseMod") { - group = "mod" + ext["changelogText"] = changelogText - dependsOn("modrinth") - dependsOn("modrinthSyncBody") - dependsOn("curseforge") - dependsOn("publishModPublicationToReleasesRepository") - dependsOn("githubRelease") - } -} - -val changelogText = file("changelogs/${project.version}.md").takeIf { it.exists() }?.readText() ?: "No changelog provided." - -val modrinthId: String by project -if (modrinthId.isNotEmpty()) { - modrinth { - token.set(findProperty("MODRINTH_TOKEN")?.toString()) - projectId.set(modrinthId) - versionNumber.set("${project.version}") - versionType.set("release") - uploadFile.set(tasks["remapJar"]) - gameVersions.set(listOf("1.19.4")) - loaders.set(listOf("fabric", "quilt")) - dependencies { - required.project("fabric-api") + repositories { + mavenCentral() + maven("https://maven.terraformersmc.com/releases") + maven("https://maven.isxander.dev/releases") + maven("https://maven.isxander.dev/snapshots") + maven("https://maven.quiltmc.org/repository/release") + maven("https://api.modrinth.com/maven") { + name = "Modrinth" + content { + includeGroup("maven.modrinth") + } } - changelog.set(changelogText) - syncBodyFrom.set(file("README.md").readText()) + maven("https://jitpack.io") } -} -val curseforgeId: String by project -if (hasProperty("CURSEFORGE_TOKEN") && curseforgeId.isNotEmpty()) { - curseforge { - apiKey = findProperty("CURSEFORGE_TOKEN") - project(closureOf { - mainArtifact(tasks["remapJar"], closureOf { - displayName = "${project.version}" - }) - - id = curseforgeId - releaseType = "release" - addGameVersion("1.19.4") - addGameVersion("Fabric") - addGameVersion("Java 17") - - changelog = changelogText - changelogType = "markdown" - - relations(closureOf { - requiredDependency("fabric-api") - }) - }) - - options(closureOf { - forgeGradleIntegration = false - }) + pluginManager.withPlugin("publishing") { + val publishing = the() + + publishing.repositories { + val username = "XANDER_MAVEN_USER".let { System.getenv(it) ?: findProperty(it) }?.toString() + val password = "XANDER_MAVEN_PASS".let { System.getenv(it) ?: findProperty(it) }?.toString() + if (username != null && password != null) { + maven(url = "https://maven.isxander.dev/releases") { + name = "Releases" + credentials { + this.username = username + this.password = password + } + } + maven(url = "https://maven.isxander.dev/snapshots") { + name = "Snapshots" + credentials { + this.username = username + this.password = password + } + } + } else { + println("Xander Maven credentials not satisfied.") + } + } } } githubRelease { token(findProperty("GITHUB_TOKEN")?.toString()) - val githubProject: String by project + val githubProject: String by rootProject val split = githubProject.split("/") owner(split[0]) repo(split[1]) tagName("${project.version}") targetCommitish(grgit.branch.current().name) body(changelogText) - releaseAssets(tasks["remapJar"].outputs.files) + releaseAssets( + { project(":fabric").tasks["remapJar"].outputs.files }, + { project(":fabric").tasks["remapSourcesJar"].outputs.files }, + { project(":forge").tasks["remapJar"].outputs.files }, + { project(":forge").tasks["remapSourcesJar"].outputs.files }, + ) } -publishing { - publications { - create("mod") { - groupId = "dev.isxander" - artifactId = "yet-another-config-lib" +tasks.register("releaseMod") { + group = "mod" - from(components["java"]) - artifact(tasks["remapSourcesJar"]) - } - } + dependsOn("githubRelease") +} - repositories { - val username = "XANDER_MAVEN_USER".let { System.getenv(it) ?: findProperty(it) }?.toString() - val password = "XANDER_MAVEN_PASS".let { System.getenv(it) ?: findProperty(it) }?.toString() - if (username != null && password != null) { - maven(url = "https://maven.isxander.dev/releases") { - name = "Releases" - credentials { - this.username = username - this.password = password - } - } - maven(url = "https://maven.isxander.dev/snapshots") { - name = "Snapshots" - credentials { - this.username = username - this.password = password - } - } - } else { - println("Xander Maven credentials not satisfied.") - } - } +tasks.register("buildAll") { + group = "mod" + + dependsOn(project(":fabric").tasks["build"]) + dependsOn(project(":forge").tasks["build"]) } diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..fb79bd1 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + alias(libs.plugins.architectury.loom) +} + +base { + archivesName.set("yet-another-config-lib") +} + +architectury { + common("fabric", "forge") +} + +loom { + silentMojangMappingsLicense() + + accessWidenerPath.set(file("src/main/resources/yacl.accesswidener")) +} + +dependencies { + minecraft(libs.minecraft) + mappings(loom.layered { + mappings("org.quiltmc:quilt-mappings:${libs.versions.minecraft.get()}+build.${libs.versions.quilt.mappings.get()}:intermediary-v2") + officialMojangMappings() + }) + modImplementation(libs.fabric.loader) +} + +java { + withSourcesJar() +} + +tasks { + remapJar { + archiveClassifier.set(null as String?) + + from(rootProject.file("LICENSE")) + } +} + +publishing { + publications { + create("common") { + groupId = "dev.isxander.yacl" + artifactId = "yet-another-config-lib-common" + + from(components["java"]) + } + } +} +tasks.findByPath("publishCommonPublicationToReleasesRepository")?.let { + rootProject.tasks["releaseMod"].dependsOn(it) +} diff --git a/common/src/main/java/dev/isxander/yacl/api/Binding.java b/common/src/main/java/dev/isxander/yacl/api/Binding.java new file mode 100644 index 0000000..b4cd2d0 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/Binding.java @@ -0,0 +1,64 @@ +package dev.isxander.yacl.api; + +import dev.isxander.yacl.impl.GenericBindingImpl; +import dev.isxander.yacl.mixin.OptionInstanceAccessor; +import net.minecraft.client.OptionInstance; +import org.apache.commons.lang3.Validate; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * Controls modifying the bound option. + * Provides the default value, a setter and a getter. + */ +public interface Binding { + void setValue(T value); + + T getValue(); + + T defaultValue(); + + /** + * Creates a generic binding. + * + * @param def default value of the option, used to reset + * @param getter should return the current value of the option + * @param setter should set the option to the supplied value + */ + static Binding generic(T def, Supplier getter, Consumer setter) { + Validate.notNull(def, "`def` must not be null"); + Validate.notNull(getter, "`getter` must not be null"); + Validate.notNull(setter, "`setter` must not be null"); + + return new GenericBindingImpl<>(def, getter, setter); + } + + /** + * Creates a {@link Binding} for Minecraft's {@link OptionInstance} + */ + static Binding minecraft(OptionInstance minecraftOption) { + Validate.notNull(minecraftOption, "`minecraftOption` must not be null"); + + return new GenericBindingImpl<>( + ((OptionInstanceAccessor) (Object) minecraftOption).getInitialValue(), + minecraftOption::get, + minecraftOption::set + ); + } + + /** + * Creates an immutable binding that has no default and cannot be modified. + * + * @param value the value for the binding + */ + static Binding immutable(T value) { + Validate.notNull(value, "`value` must not be null"); + + return new GenericBindingImpl<>( + value, + () -> value, + changed -> {} + ); + } +} diff --git a/common/src/main/java/dev/isxander/yacl/api/ButtonOption.java b/common/src/main/java/dev/isxander/yacl/api/ButtonOption.java new file mode 100644 index 0000000..88e1c4b --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/ButtonOption.java @@ -0,0 +1,66 @@ +package dev.isxander.yacl.api; + +import dev.isxander.yacl.gui.YACLScreen; +import dev.isxander.yacl.impl.ButtonOptionImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +public interface ButtonOption extends Option> { + /** + * Action to be executed upon button press + */ + BiConsumer action(); + + static dev.isxander.yacl.api.ButtonOption.Builder createBuilder() { + return new ButtonOptionImpl.BuilderImpl(); + } + + interface Builder { + /** + * Sets the name to be used by the option. + * + * @see Option#name() + */ + dev.isxander.yacl.api.ButtonOption.Builder name(@NotNull Component name); + + /** + * Sets the tooltip to be used by the option. + * Can be invoked twice to append more lines. + * No need to wrap the text yourself, the gui does this itself. + * + * @param tooltips text lines - merged with a new-line on {@link Option.Builder#build()}. + */ + dev.isxander.yacl.api.ButtonOption.Builder tooltip(@NotNull Component... tooltips); + + dev.isxander.yacl.api.ButtonOption.Builder action(@NotNull BiConsumer action); + + /** + * Action to be executed upon button press + * + * @see ButtonOption#action() + */ + @Deprecated + dev.isxander.yacl.api.ButtonOption.Builder action(@NotNull Consumer action); + + /** + * Sets if the option can be configured + * + * @see Option#available() + */ + dev.isxander.yacl.api.ButtonOption.Builder available(boolean available); + + /** + * Sets the controller for the option. + * This is how you interact and change the options. + * + * @see dev.isxander.yacl.gui.controllers + */ + dev.isxander.yacl.api.ButtonOption.Builder controller(@NotNull Function>> control); + + ButtonOption build(); + } +} diff --git a/common/src/main/java/dev/isxander/yacl/api/ConfigCategory.java b/common/src/main/java/dev/isxander/yacl/api/ConfigCategory.java new file mode 100644 index 0000000..7764479 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/ConfigCategory.java @@ -0,0 +1,94 @@ +package dev.isxander.yacl.api; + +import com.google.common.collect.ImmutableList; +import dev.isxander.yacl.impl.ConfigCategoryImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +/** + * Separates {@link Option}s or {@link OptionGroup}s into multiple distinct sections. + * Served to a user as a button in the left column, + * upon pressing, the options list is filled with options contained within this category. + */ +public interface ConfigCategory { + /** + * Name of category, displayed as a button on the left column. + */ + @NotNull Component name(); + + /** + * Gets every {@link OptionGroup} in this category. + */ + @NotNull ImmutableList groups(); + + /** + * Tooltip (or description) of the category. + * Rendered on hover. + */ + @NotNull Component tooltip(); + + /** + * Creates a builder to construct a {@link ConfigCategory} + */ + static Builder createBuilder() { + return new ConfigCategoryImpl.BuilderImpl(); + } + + interface Builder extends OptionAddable { + /** + * Sets name of the category + * + * @see ConfigCategory#name() + */ + Builder name(@NotNull Component name); + + /** + * Adds an option to the root group of the category. + * To add to another group, use {@link Builder#group(OptionGroup)}. + * To construct an option, use {@link Option#createBuilder(Class)} + * + * @see ConfigCategory#groups() + * @see OptionGroup#isRoot() + */ + @Override + Builder option(@NotNull Option option); + + /** + * Adds multiple options to the root group of the category. + * To add to another group, use {@link Builder#groups(Collection)}. + * To construct an option, use {@link Option#createBuilder(Class)} + * + * @see ConfigCategory#groups() + * @see OptionGroup#isRoot() + */ + @Override + Builder options(@NotNull Collection> options); + + /** + * Adds an option group. + * To add an option to the root group, use {@link Builder#option(Option)} + * To construct a group, use {@link OptionGroup#createBuilder()} + */ + Builder group(@NotNull OptionGroup group); + + /** + * Adds multiple option groups. + * To add multiple options to the root group, use {@link Builder#options(Collection)} + * To construct a group, use {@link OptionGroup#createBuilder()} + */ + Builder groups(@NotNull Collection groups); + + /** + * Sets the tooltip to be used by the category. + * Can be invoked twice to append more lines. + * No need to wrap the text yourself, the gui does this itself. + * + * @param tooltips text lines - merged with a new-line on {@link Builder#build()}. + */ + Builder tooltip(@NotNull Component... tooltips); + + ConfigCategory build(); + } +} diff --git a/common/src/main/java/dev/isxander/yacl/api/Controller.java b/common/src/main/java/dev/isxander/yacl/api/Controller.java new file mode 100644 index 0000000..0b8e2ed --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/Controller.java @@ -0,0 +1,28 @@ +package dev.isxander.yacl.api; + +import dev.isxander.yacl.api.utils.Dimension; +import dev.isxander.yacl.gui.AbstractWidget; +import dev.isxander.yacl.gui.YACLScreen; +import net.minecraft.network.chat.Component; + +/** + * Provides a widget to control the option. + */ +public interface Controller { + /** + * Gets the dedicated {@link Option} for this controller + */ + Option option(); + + /** + * Gets the formatted value based on {@link Option#pendingValue()} + */ + Component formatValue(); + + /** + * Provides a widget to display + * + * @param screen parent screen + */ + AbstractWidget provideWidget(YACLScreen screen, Dimension widgetDimension); +} diff --git a/common/src/main/java/dev/isxander/yacl/api/LabelOption.java b/common/src/main/java/dev/isxander/yacl/api/LabelOption.java new file mode 100644 index 0000000..05c7214 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/LabelOption.java @@ -0,0 +1,41 @@ +package dev.isxander.yacl.api; + +import dev.isxander.yacl.impl.LabelOptionImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +/** + * A label option is an easier way of creating a label with a {@link dev.isxander.yacl.gui.controllers.LabelController}. + * This option is immutable and cannot be disabled. Tooltips are supported through + * {@link Component} styling. + */ +public interface LabelOption extends Option { + @NotNull Component label(); + + /** + * Creates a new label option with the given label, skipping a builder for ease. + */ + static LabelOption create(@NotNull Component label) { + return new LabelOptionImpl(label); + } + + static dev.isxander.yacl.api.LabelOption.Builder createBuilder() { + return new LabelOptionImpl.BuilderImpl(); + } + + interface Builder { + /** + * Appends a line to the label + */ + dev.isxander.yacl.api.LabelOption.Builder line(@NotNull Component line); + + /** + * Appends multiple lines to the label + */ + dev.isxander.yacl.api.LabelOption.Builder lines(@NotNull Collection lines); + + LabelOption build(); + } +} diff --git a/common/src/main/java/dev/isxander/yacl/api/ListOption.java b/common/src/main/java/dev/isxander/yacl/api/ListOption.java new file mode 100644 index 0000000..afba8ee --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/ListOption.java @@ -0,0 +1,152 @@ +package dev.isxander.yacl.api; + +import com.google.common.collect.ImmutableList; +import dev.isxander.yacl.impl.ListOptionImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * A list option that takes form as an option group for UX. + * You add this option through {@link ConfigCategory.Builder#group(OptionGroup)}. Do NOT add as an option. + * Users can add remove and reshuffle a list type. You can use any controller you wish, there are no dedicated + * controllers for list types. List options do not manipulate your list but get and set the list with a + * regular binding for simplicity. + * + * You may apply option flags like a normal option and collapse like a normal group, it is a merge of them both. + * Methods in this interface marked with {@link ApiStatus.Internal} should not be used, and could be subject to + * change at any time + * @param + */ +public interface ListOption extends OptionGroup, Option> { + @Override + @NotNull ImmutableList> options(); + + /** + * Class of the entry type + */ + @NotNull Class elementTypeClass(); + + @ApiStatus.Internal + ListOptionEntry insertNewEntryToTop(); + + @ApiStatus.Internal + void insertEntry(int index, ListOptionEntry entry); + + @ApiStatus.Internal + int indexOf(ListOptionEntry entry); + + @ApiStatus.Internal + void removeEntry(ListOptionEntry entry); + + @ApiStatus.Internal + void addRefreshListener(Runnable changedListener); + + static Builder createBuilder(Class typeClass) { + return new ListOptionImpl.BuilderImpl<>(typeClass); + } + + interface Builder { + /** + * Sets name of the list, for UX purposes, a name should always be given, + * but isn't enforced. + * + * @see ListOption#name() + */ + Builder name(@NotNull Component name); + + /** + * Sets the tooltip to be used by the list. It is displayed like a normal + * group when you hover over the name. Entries do not allow a tooltip. + *

+ * Can be invoked twice to append more lines. + * No need to wrap the text yourself, the gui does this itself. + * + * @param tooltips text lines - merged with a new-line on {@link dev.isxander.yacl.api.ListOption.Builder#build()}. + */ + Builder tooltip(@NotNull Component... tooltips); + + /** + * Sets the value that is used when creating new entries + */ + Builder initial(@NotNull T initialValue); + + /** + * Sets the controller for the option. + * This is how you interact and change the options. + * + * @see dev.isxander.yacl.gui.controllers + */ + Builder controller(@NotNull Function, Controller> control); + + /** + * Sets the binding for the option. + * Used for default, getter and setter. + * + * @see Binding + */ + Builder binding(@NotNull Binding> binding); + + /** + * Sets the binding for the option. + * Shorthand of {@link Binding#generic(Object, Supplier, Consumer)} + * + * @param def default value of the option, used to reset + * @param getter should return the current value of the option + * @param setter should set the option to the supplied value + * @see Binding + */ + Builder binding(@NotNull List def, @NotNull Supplier<@NotNull List> getter, @NotNull Consumer<@NotNull List> setter); + + /** + * Sets if the option can be configured + * + * @see Option#available() + */ + Builder available(boolean available); + + /** + * Adds a flag to the option. + * Upon applying changes, all flags are executed. + * {@link Option#flags()} + */ + Builder flag(@NotNull OptionFlag... flag); + + /** + * Adds a flag to the option. + * Upon applying changes, all flags are executed. + * {@link Option#flags()} + */ + Builder flags(@NotNull Collection flags); + + /** + * Dictates if the group should be collapsed by default. + * If not set, it will not be collapsed by default. + * + * @see OptionGroup#collapsed() + */ + Builder collapsed(boolean collapsible); + + /** + * Adds a listener to the option. Invoked upon changing any of the list's entries. + * + * @see Option#addListener(BiConsumer) + */ + ListOption.Builder listener(@NotNull BiConsumer>, List> listener); + + /** + * Adds multiple listeners to the option. Invoked upon changing of any of the list's entries. + * + * @see Option#addListener(BiConsumer) + */ + ListOption.Builder listeners(@NotNull Collection>, List>> listeners); + + ListOption build(); + } +} diff --git a/common/src/main/java/dev/isxander/yacl/api/ListOptionEntry.java b/common/src/main/java/dev/isxander/yacl/api/ListOptionEntry.java new file mode 100644 index 0000000..e0a3424 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/ListOptionEntry.java @@ -0,0 +1,23 @@ +package dev.isxander.yacl.api; + +import com.google.common.collect.ImmutableSet; +import org.jetbrains.annotations.NotNull; + +public interface ListOptionEntry extends Option { + ListOption parentGroup(); + + @Override + default @NotNull Class typeClass() { + return parentGroup().elementTypeClass(); + } + + @Override + default @NotNull ImmutableSet flags() { + return parentGroup().flags(); + } + + @Override + default boolean available() { + return parentGroup().available(); + } +} diff --git a/common/src/main/java/dev/isxander/yacl/api/NameableEnum.java b/common/src/main/java/dev/isxander/yacl/api/NameableEnum.java new file mode 100644 index 0000000..4b04057 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/NameableEnum.java @@ -0,0 +1,10 @@ +package dev.isxander.yacl.api; + +import net.minecraft.network.chat.Component; + +/** + * Used for the default value formatter of {@link dev.isxander.yacl.gui.controllers.cycling.EnumController} + */ +public interface NameableEnum { + Component getDisplayName(); +} diff --git a/common/src/main/java/dev/isxander/yacl/api/Option.java b/common/src/main/java/dev/isxander/yacl/api/Option.java new file mode 100644 index 0000000..a6c0311 --- /dev/null +++ b/common/src/main/java/dev/isxander/yacl/api/Option.java @@ -0,0 +1,227 @@ +package dev.isxander.yacl.api; + +import com.google.common.collect.ImmutableSet; +import dev.isxander.yacl.impl.OptionImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +public interface Option { + /** + * Name of the option + */ + @NotNull Component name(); + + /** + * Tooltip (or description) of the option. + * Rendered on hover. + */ + @NotNull Component tooltip(); + + /** + * Widget provider for a type of option. + * + * @see dev.isxander.yacl.gui.controllers + */ + @NotNull Controller controller(); + + /** + * Binding for the option. + * Controls setting, getting and default value. + * + * @see Binding + */ + @NotNull Binding binding(); + + /** + * If the option can be configured + */ + boolean available(); + + /** + * Sets if the option can be configured after being built + * + * @see Option#available() + */ + void setAvailable(boolean available); + + /** + * Class of the option type. + * Used by some controllers. + */ + @NotNull Class typeClass(); + + /** + * Tasks that needs to be executed upon applying changes. + */ + @NotNull ImmutableSet flags(); + + /** + * Checks if the pending value is not equal to the current set value + */ + boolean changed(); + + /** + * Value in the GUI, ready to set the actual bound value or be undone. + */ + @NotNull T pendingValue(); + + /** + * Sets the pending value + */ + void requestSet(T value); + + /** + * Applies the pending value to the bound value. + * Cannot be undone. + * + * @return if there were changes to apply {@link Option#changed()} + */ + boolean applyValue(); + + /** + * Sets the pending value to the bound value. + */ + void forgetPendingValue(); + + /** + * Sets the pending value to the default bound value. + */ + void requestSetDefault(); + + /** + * Checks if the current pending value is equal to its default value + */ + boolean isPendingValueDefault(); + + default boolean canResetToDefault() { +