From 04fe933f4c24817100f3101f088accf55a621f8a Mon Sep 17 00:00:00 2001 From: isxander Date: Thu, 11 Apr 2024 18:43:06 +0100 Subject: Extremely fragile and broken multiversion build with stonecutter --- src/main/java/dev/isxander/yacl3/api/Binding.java | 64 +++ .../java/dev/isxander/yacl3/api/ButtonOption.java | 55 ++ .../dev/isxander/yacl3/api/ConfigCategory.java | 138 +++++ .../java/dev/isxander/yacl3/api/Controller.java | 28 + .../java/dev/isxander/yacl3/api/LabelOption.java | 41 ++ .../java/dev/isxander/yacl3/api/ListOption.java | 178 +++++++ .../dev/isxander/yacl3/api/ListOptionEntry.java | 18 + .../java/dev/isxander/yacl3/api/NameableEnum.java | 10 + src/main/java/dev/isxander/yacl3/api/Option.java | 223 ++++++++ .../java/dev/isxander/yacl3/api/OptionAddable.java | 51 ++ .../dev/isxander/yacl3/api/OptionDescription.java | 161 ++++++ .../java/dev/isxander/yacl3/api/OptionFlag.java | 23 + .../java/dev/isxander/yacl3/api/OptionGroup.java | 131 +++++ .../isxander/yacl3/api/PlaceholderCategory.java | 55 ++ .../isxander/yacl3/api/YetAnotherConfigLib.java | 113 ++++ .../api/controller/BooleanControllerBuilder.java | 16 + .../api/controller/ColorControllerBuilder.java | 14 + .../yacl3/api/controller/ControllerBuilder.java | 10 + .../controller/CyclingListControllerBuilder.java | 15 + .../controller/DoubleFieldControllerBuilder.java | 10 + .../controller/DoubleSliderControllerBuilder.java | 10 + .../DropdownStringControllerBuilder.java | 18 + .../api/controller/EnumControllerBuilder.java | 12 + .../controller/EnumDropdownControllerBuilder.java | 10 + .../controller/FloatFieldControllerBuilder.java | 10 + .../controller/FloatSliderControllerBuilder.java | 10 + .../controller/IntegerFieldControllerBuilder.java | 10 + .../controller/IntegerSliderControllerBuilder.java | 10 + .../api/controller/ItemControllerBuilder.java | 11 + .../api/controller/LongFieldControllerBuilder.java | 10 + .../controller/LongSliderControllerBuilder.java | 10 + .../controller/NumberFieldControllerBuilder.java | 7 + .../api/controller/SliderControllerBuilder.java | 6 + .../api/controller/StringControllerBuilder.java | 10 + .../api/controller/TickBoxControllerBuilder.java | 10 + .../api/controller/ValueFormattableController.java | 14 + .../yacl3/api/controller/ValueFormatter.java | 7 + .../dev/isxander/yacl3/api/utils/Dimension.java | 33 ++ .../isxander/yacl3/api/utils/MutableDimension.java | 11 + .../dev/isxander/yacl3/api/utils/OptionUtils.java | 39 ++ .../dev/isxander/yacl3/config/ConfigEntry.java | 15 + .../dev/isxander/yacl3/config/ConfigInstance.java | 50 ++ .../isxander/yacl3/config/GsonConfigInstance.java | 259 +++++++++ .../yacl3/config/v2/api/ConfigClassHandler.java | 107 ++++ .../isxander/yacl3/config/v2/api/ConfigField.java | 40 ++ .../yacl3/config/v2/api/ConfigSerializer.java | 64 +++ .../isxander/yacl3/config/v2/api/FieldAccess.java | 14 + .../yacl3/config/v2/api/ReadOnlyFieldAccess.java | 36 ++ .../isxander/yacl3/config/v2/api/SerialEntry.java | 39 ++ .../isxander/yacl3/config/v2/api/SerialField.java | 16 + .../yacl3/config/v2/api/autogen/AutoGen.java | 32 ++ .../yacl3/config/v2/api/autogen/AutoGenField.java | 12 + .../yacl3/config/v2/api/autogen/Boolean.java | 41 ++ .../yacl3/config/v2/api/autogen/ColorField.java | 21 + .../config/v2/api/autogen/CustomDescription.java | 12 + .../yacl3/config/v2/api/autogen/CustomFormat.java | 17 + .../yacl3/config/v2/api/autogen/CustomImage.java | 69 +++ .../yacl3/config/v2/api/autogen/CustomName.java | 18 + .../yacl3/config/v2/api/autogen/DoubleField.java | 46 ++ .../yacl3/config/v2/api/autogen/DoubleSlider.java | 48 ++ .../yacl3/config/v2/api/autogen/Dropdown.java | 43 ++ .../yacl3/config/v2/api/autogen/EnumCycler.java | 35 ++ .../yacl3/config/v2/api/autogen/FloatField.java | 46 ++ .../yacl3/config/v2/api/autogen/FloatSlider.java | 48 ++ .../config/v2/api/autogen/FormatTranslation.java | 25 + .../yacl3/config/v2/api/autogen/IntField.java | 41 ++ .../yacl3/config/v2/api/autogen/IntSlider.java | 35 ++ .../yacl3/config/v2/api/autogen/ItemField.java | 17 + .../yacl3/config/v2/api/autogen/Label.java | 18 + .../yacl3/config/v2/api/autogen/ListGroup.java | 60 +++ .../yacl3/config/v2/api/autogen/LongField.java | 41 ++ .../yacl3/config/v2/api/autogen/LongSlider.java | 35 ++ .../yacl3/config/v2/api/autogen/MasterTickBox.java | 26 + .../yacl3/config/v2/api/autogen/OptionAccess.java | 35 ++ .../yacl3/config/v2/api/autogen/OptionFactory.java | 40 ++ .../config/v2/api/autogen/SimpleOptionFactory.java | 138 +++++ .../yacl3/config/v2/api/autogen/StringField.java | 17 + .../yacl3/config/v2/api/autogen/TickBox.java | 17 + .../serializer/GsonConfigSerializerBuilder.java | 98 ++++ .../config/v2/impl/ConfigClassHandlerImpl.java | 274 ++++++++++ .../yacl3/config/v2/impl/ConfigFieldImpl.java | 75 +++ .../yacl3/config/v2/impl/FieldBackedBinding.java | 22 + .../config/v2/impl/ReflectionFieldAccess.java | 49 ++ .../yacl3/config/v2/impl/autogen/AutoGenUtils.java | 54 ++ .../yacl3/config/v2/impl/autogen/BooleanImpl.java | 25 + .../config/v2/impl/autogen/ColorFieldImpl.java | 19 + .../config/v2/impl/autogen/DoubleFieldImpl.java | 32 ++ .../config/v2/impl/autogen/DoubleSliderImpl.java | 33 ++ .../yacl3/config/v2/impl/autogen/DropdownImpl.java | 19 + .../v2/impl/autogen/EmptyCustomImageFactory.java | 17 + .../config/v2/impl/autogen/EnumCyclerImpl.java | 42 ++ .../config/v2/impl/autogen/FloatFieldImpl.java | 32 ++ .../config/v2/impl/autogen/FloatSliderImpl.java | 33 ++ .../yacl3/config/v2/impl/autogen/IntFieldImpl.java | 28 + .../config/v2/impl/autogen/IntSliderImpl.java | 29 ++ .../config/v2/impl/autogen/ItemFieldImpl.java | 17 + .../yacl3/config/v2/impl/autogen/LabelImpl.java | 16 + .../config/v2/impl/autogen/ListGroupImpl.java | 102 ++++ .../config/v2/impl/autogen/LongFieldImpl.java | 28 + .../config/v2/impl/autogen/LongSliderImpl.java | 29 ++ .../config/v2/impl/autogen/MasterTickBoxImpl.java | 25 + .../config/v2/impl/autogen/OptionAccessImpl.java | 44 ++ .../v2/impl/autogen/OptionFactoryRegistry.java | 64 +++ .../config/v2/impl/autogen/StringFieldImpl.java | 16 + .../yacl3/config/v2/impl/autogen/TickBoxImpl.java | 16 + .../v2/impl/autogen/YACLAutoGenException.java | 11 + .../v2/impl/serializer/GsonConfigSerializer.java | 275 ++++++++++ .../dev/isxander/yacl3/debug/DebugProperties.java | 13 + .../dev/isxander/yacl3/gui/AbstractWidget.java | 100 ++++ .../isxander/yacl3/gui/DescriptionWithName.java | 11 + .../isxander/yacl3/gui/ElementListWidgetExt.java | 274 ++++++++++ .../isxander/yacl3/gui/LowProfileButtonWidget.java | 28 + .../yacl3/gui/OptionDescriptionWidget.java | 222 ++++++++ .../dev/isxander/yacl3/gui/OptionListWidget.java | 578 +++++++++++++++++++++ .../isxander/yacl3/gui/RequireRestartScreen.java | 21 + .../dev/isxander/yacl3/gui/SearchFieldWidget.java | 61 +++ .../isxander/yacl3/gui/TextScaledButtonWidget.java | 34 ++ .../isxander/yacl3/gui/TooltipButtonWidget.java | 21 + .../dev/isxander/yacl3/gui/ValueFormatters.java | 21 + .../java/dev/isxander/yacl3/gui/YACLScreen.java | 426 +++++++++++++++ .../java/dev/isxander/yacl3/gui/YACLTooltip.java | 23 + .../isxander/yacl3/gui/YACLTooltipPositioner.java | 48 ++ .../yacl3/gui/controllers/ActionController.java | 120 +++++ .../yacl3/gui/controllers/BooleanController.java | 164 ++++++ .../yacl3/gui/controllers/ColorController.java | 220 ++++++++ .../yacl3/gui/controllers/ControllerWidget.java | 148 ++++++ .../yacl3/gui/controllers/LabelController.java | 193 +++++++ .../yacl3/gui/controllers/ListEntryWidget.java | 128 +++++ .../yacl3/gui/controllers/TickBoxController.java | 119 +++++ .../cycling/CyclingControllerElement.java | 60 +++ .../controllers/cycling/CyclingListController.java | 86 +++ .../gui/controllers/cycling/EnumController.java | 48 ++ .../controllers/cycling/ICyclingController.java | 38 ++ .../dropdown/AbstractDropdownController.java | 87 ++++ .../AbstractDropdownControllerElement.java | 248 +++++++++ .../dropdown/DropdownStringController.java | 34 ++ .../dropdown/DropdownStringControllerElement.java | 31 ++ .../dropdown/EnumDropdownController.java | 92 ++++ .../dropdown/EnumDropdownControllerElement.java | 25 + .../gui/controllers/dropdown/ItemController.java | 68 +++ .../dropdown/ItemControllerElement.java | 87 ++++ .../yacl3/gui/controllers/package-info.java | 12 + .../controllers/slider/DoubleSliderController.java | 119 +++++ .../controllers/slider/FloatSliderController.java | 119 +++++ .../gui/controllers/slider/ISliderController.java | 54 ++ .../slider/IntegerSliderController.java | 116 +++++ .../controllers/slider/LongSliderController.java | 116 +++++ .../slider/SliderControllerElement.java | 157 ++++++ .../yacl3/gui/controllers/slider/package-info.java | 10 + .../gui/controllers/string/IStringController.java | 44 ++ .../gui/controllers/string/StringController.java | 37 ++ .../string/StringControllerElement.java | 466 +++++++++++++++++ .../string/number/DoubleFieldController.java | 111 ++++ .../string/number/FloatFieldController.java | 111 ++++ .../string/number/IntegerFieldController.java | 111 ++++ .../string/number/LongFieldController.java | 111 ++++ .../string/number/NumberFieldController.java | 80 +++ .../controllers/string/number/package-info.java | 10 + .../isxander/yacl3/gui/image/ImageRenderer.java | 11 + .../yacl3/gui/image/ImageRendererFactory.java | 24 + .../yacl3/gui/image/ImageRendererManager.java | 120 +++++ .../yacl3/gui/image/YACLImageReloadListener.java | 110 ++++ .../image/impl/AnimatedDynamicTextureImage.java | 286 ++++++++++ .../yacl3/gui/image/impl/DynamicTextureImage.java | 72 +++ .../yacl3/gui/image/impl/ResourceTextureImage.java | 56 ++ .../isxander/yacl3/gui/tab/ListHolderWidget.java | 116 +++++ .../yacl3/gui/tab/ScrollableNavigationBar.java | 120 +++++ .../java/dev/isxander/yacl3/gui/tab/TabExt.java | 14 + .../yacl3/gui/utils/ButtonTextureRenderer.java | 34 ++ .../dev/isxander/yacl3/gui/utils/GuiUtils.java | 32 ++ .../yacl3/gui/utils/ItemRegistryHelper.java | 116 +++++ .../isxander/yacl3/gui/utils/UndoRedoHelper.java | 42 ++ .../dev/isxander/yacl3/impl/ButtonOptionImpl.java | 205 ++++++++ .../isxander/yacl3/impl/ConfigCategoryImpl.java | 134 +++++ .../isxander/yacl3/impl/GenericBindingImpl.java | 35 ++ .../yacl3/impl/HiddenNameListOptionEntry.java | 109 ++++ .../dev/isxander/yacl3/impl/LabelOptionImpl.java | 160 ++++++ .../isxander/yacl3/impl/ListOptionEntryImpl.java | 154 ++++++ .../dev/isxander/yacl3/impl/ListOptionImpl.java | 402 ++++++++++++++ .../isxander/yacl3/impl/OptionDescriptionImpl.java | 133 +++++ .../dev/isxander/yacl3/impl/OptionGroupImpl.java | 121 +++++ .../java/dev/isxander/yacl3/impl/OptionImpl.java | 295 +++++++++++ .../yacl3/impl/PlaceholderCategoryImpl.java | 99 ++++ .../java/dev/isxander/yacl3/impl/SafeBinding.java | 29 ++ .../yacl3/impl/YetAnotherConfigLibImpl.java | 122 +++++ .../controller/AbstractControllerBuilderImpl.java | 12 + .../controller/BooleanControllerBuilderImpl.java | 57 ++ .../controller/ColorControllerBuilderImpl.java | 27 + .../CyclingListControllerBuilderImpl.java | 41 ++ .../DoubleFieldControllerBuilderImpl.java | 51 ++ .../DoubleSliderControllerBuilderImpl.java | 44 ++ .../DropdownStringControllerBuilderImpl.java | 49 ++ .../impl/controller/EnumControllerBuilderImpl.java | 42 ++ .../EnumDropdownControllerBuilderImpl.java | 27 + .../FloatFieldControllerBuilderImpl.java | 51 ++ .../FloatSliderControllerBuilderImpl.java | 44 ++ .../IntegerFieldControllerBuilderImpl.java | 51 ++ .../IntegerSliderControllerBuilderImpl.java | 44 ++ .../impl/controller/ItemControllerBuilderImpl.java | 18 + .../controller/LongFieldControllerBuilderImpl.java | 51 ++ .../LongSliderControllerBuilderImpl.java | 44 ++ .../controller/StringControllerBuilderImpl.java | 17 + .../controller/TickBoxControllerBuilderImpl.java | 17 + .../yacl3/impl/utils/DimensionIntegerImpl.java | 115 ++++ .../isxander/yacl3/impl/utils/YACLConstants.java | 8 + .../yacl3/mixin/AbstractSelectionListMixin.java | 25 + .../yacl3/mixin/ContainerEventHandlerMixin.java | 37 ++ .../dev/isxander/yacl3/mixin/MinecraftMixin.java | 16 + .../yacl3/mixin/OptionInstanceAccessor.java | 13 + .../yacl3/mixin/TabNavigationBarAccessor.java | 16 + src/main/java/dev/isxander/yacl3/platform/Env.java | 10 + .../yacl3/platform/PlatformEntrypoint.java | 42 ++ .../dev/isxander/yacl3/platform/YACLPlatform.java | 45 ++ src/main/resources/META-INF/mods.toml | 31 ++ .../assets/yet_another_config_lib/lang/be_by.json | 29 ++ .../assets/yet_another_config_lib/lang/el_gr.json | 23 + .../assets/yet_another_config_lib/lang/en_us.json | 31 ++ .../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/it_it.json | 31 ++ .../assets/yet_another_config_lib/lang/nl_nl.json | 31 ++ .../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/tt_ru.json | 34 ++ .../assets/yet_another_config_lib/lang/zh_cn.json | 29 ++ .../assets/yet_another_config_lib/lang/zh_tw.json | 29 ++ src/main/resources/fabric.mod.json | 38 ++ src/main/resources/pack.mcmeta | 6 + src/main/resources/yacl-128x.png | Bin 0 -> 13813 bytes src/main/resources/yacl-fabric.mixins.json | 11 + src/main/resources/yacl.accesswidener | 12 + src/main/resources/yacl.mixins.json | 14 + 234 files changed, 15118 insertions(+) create mode 100644 src/main/java/dev/isxander/yacl3/api/Binding.java create mode 100644 src/main/java/dev/isxander/yacl3/api/ButtonOption.java create mode 100644 src/main/java/dev/isxander/yacl3/api/ConfigCategory.java create mode 100644 src/main/java/dev/isxander/yacl3/api/Controller.java create mode 100644 src/main/java/dev/isxander/yacl3/api/LabelOption.java create mode 100644 src/main/java/dev/isxander/yacl3/api/ListOption.java create mode 100644 src/main/java/dev/isxander/yacl3/api/ListOptionEntry.java create mode 100644 src/main/java/dev/isxander/yacl3/api/NameableEnum.java create mode 100644 src/main/java/dev/isxander/yacl3/api/Option.java create mode 100644 src/main/java/dev/isxander/yacl3/api/OptionAddable.java create mode 100644 src/main/java/dev/isxander/yacl3/api/OptionDescription.java create mode 100644 src/main/java/dev/isxander/yacl3/api/OptionFlag.java create mode 100644 src/main/java/dev/isxander/yacl3/api/OptionGroup.java create mode 100644 src/main/java/dev/isxander/yacl3/api/PlaceholderCategory.java create mode 100644 src/main/java/dev/isxander/yacl3/api/YetAnotherConfigLib.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/BooleanControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/ColorControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/ControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/CyclingListControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/DoubleFieldControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/DoubleSliderControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/DropdownStringControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/EnumControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/EnumDropdownControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/FloatFieldControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/FloatSliderControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/IntegerFieldControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/IntegerSliderControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/ItemControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/LongFieldControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/LongSliderControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/NumberFieldControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/SliderControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/StringControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/TickBoxControllerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/ValueFormattableController.java create mode 100644 src/main/java/dev/isxander/yacl3/api/controller/ValueFormatter.java create mode 100644 src/main/java/dev/isxander/yacl3/api/utils/Dimension.java create mode 100644 src/main/java/dev/isxander/yacl3/api/utils/MutableDimension.java create mode 100644 src/main/java/dev/isxander/yacl3/api/utils/OptionUtils.java create mode 100644 src/main/java/dev/isxander/yacl3/config/ConfigEntry.java create mode 100644 src/main/java/dev/isxander/yacl3/config/ConfigInstance.java create mode 100644 src/main/java/dev/isxander/yacl3/config/GsonConfigInstance.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/ConfigClassHandler.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/ConfigField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/ConfigSerializer.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/FieldAccess.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/ReadOnlyFieldAccess.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/SerialEntry.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/SerialField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/AutoGen.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/AutoGenField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/Boolean.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/ColorField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/CustomDescription.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/CustomFormat.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/CustomImage.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/CustomName.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/DoubleField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/DoubleSlider.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/Dropdown.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/EnumCycler.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FloatField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FloatSlider.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FormatTranslation.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/IntField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/IntSlider.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/ItemField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/Label.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/ListGroup.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/LongField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/LongSlider.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/MasterTickBox.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/OptionAccess.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/OptionFactory.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/SimpleOptionFactory.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/StringField.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/autogen/TickBox.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/api/serializer/GsonConfigSerializerBuilder.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigClassHandlerImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/FieldBackedBinding.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/ReflectionFieldAccess.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/AutoGenUtils.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/BooleanImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/ColorFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DoubleFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DoubleSliderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DropdownImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/EmptyCustomImageFactory.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/EnumCyclerImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/FloatFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/FloatSliderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/IntFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/IntSliderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/ItemFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LabelImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/ListGroupImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LongFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LongSliderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/MasterTickBoxImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionAccessImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionFactoryRegistry.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/StringFieldImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/TickBoxImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/YACLAutoGenException.java create mode 100644 src/main/java/dev/isxander/yacl3/config/v2/impl/serializer/GsonConfigSerializer.java create mode 100644 src/main/java/dev/isxander/yacl3/debug/DebugProperties.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/AbstractWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/DescriptionWithName.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/ElementListWidgetExt.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/LowProfileButtonWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/OptionDescriptionWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/OptionListWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/RequireRestartScreen.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/SearchFieldWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/TextScaledButtonWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/TooltipButtonWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/ValueFormatters.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/YACLScreen.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/YACLTooltip.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/YACLTooltipPositioner.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/ActionController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/BooleanController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/ColorController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/ControllerWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/LabelController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/ListEntryWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/TickBoxController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/cycling/CyclingControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/cycling/CyclingListController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/cycling/EnumController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/cycling/ICyclingController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/AbstractDropdownController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/AbstractDropdownControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/DropdownStringController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/DropdownStringControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/EnumDropdownController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/EnumDropdownControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/ItemController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/dropdown/ItemControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/package-info.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/DoubleSliderController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/FloatSliderController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/ISliderController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/IntegerSliderController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/LongSliderController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/SliderControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/slider/package-info.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/IStringController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/StringController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/StringControllerElement.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/number/DoubleFieldController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/number/FloatFieldController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/number/IntegerFieldController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/number/LongFieldController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/number/NumberFieldController.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/controllers/string/number/package-info.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/ImageRenderer.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/ImageRendererFactory.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/ImageRendererManager.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/YACLImageReloadListener.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/impl/AnimatedDynamicTextureImage.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/impl/DynamicTextureImage.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/image/impl/ResourceTextureImage.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/tab/ListHolderWidget.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/tab/ScrollableNavigationBar.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/tab/TabExt.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/utils/ButtonTextureRenderer.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/utils/GuiUtils.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/utils/ItemRegistryHelper.java create mode 100644 src/main/java/dev/isxander/yacl3/gui/utils/UndoRedoHelper.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/ButtonOptionImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/ConfigCategoryImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/GenericBindingImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/HiddenNameListOptionEntry.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/LabelOptionImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/ListOptionEntryImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/ListOptionImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/OptionDescriptionImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/OptionGroupImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/OptionImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/PlaceholderCategoryImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/SafeBinding.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/YetAnotherConfigLibImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/AbstractControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/BooleanControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/ColorControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/CyclingListControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/DoubleFieldControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/DoubleSliderControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/DropdownStringControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/EnumControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/EnumDropdownControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/FloatFieldControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/FloatSliderControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/IntegerFieldControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/IntegerSliderControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/ItemControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/LongFieldControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/LongSliderControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/StringControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/controller/TickBoxControllerBuilderImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/utils/DimensionIntegerImpl.java create mode 100644 src/main/java/dev/isxander/yacl3/impl/utils/YACLConstants.java create mode 100644 src/main/java/dev/isxander/yacl3/mixin/AbstractSelectionListMixin.java create mode 100644 src/main/java/dev/isxander/yacl3/mixin/ContainerEventHandlerMixin.java create mode 100644 src/main/java/dev/isxander/yacl3/mixin/MinecraftMixin.java create mode 100644 src/main/java/dev/isxander/yacl3/mixin/OptionInstanceAccessor.java create mode 100644 src/main/java/dev/isxander/yacl3/mixin/TabNavigationBarAccessor.java create mode 100644 src/main/java/dev/isxander/yacl3/platform/Env.java create mode 100644 src/main/java/dev/isxander/yacl3/platform/PlatformEntrypoint.java create mode 100644 src/main/java/dev/isxander/yacl3/platform/YACLPlatform.java create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/be_by.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/el_gr.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/en_us.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/et_ee.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/fr_fr.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/it_it.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/nl_nl.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/pl_pl.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/pt_br.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/ru_ru.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/sl_si.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/tt_ru.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/zh_cn.json create mode 100644 src/main/resources/assets/yet_another_config_lib/lang/zh_tw.json create mode 100644 src/main/resources/fabric.mod.json create mode 100644 src/main/resources/pack.mcmeta create mode 100644 src/main/resources/yacl-128x.png create mode 100644 src/main/resources/yacl-fabric.mixins.json create mode 100644 src/main/resources/yacl.accesswidener create mode 100644 src/main/resources/yacl.mixins.json (limited to 'src/main') diff --git a/src/main/java/dev/isxander/yacl3/api/Binding.java b/src/main/java/dev/isxander/yacl3/api/Binding.java new file mode 100644 index 0000000..f41b78b --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/Binding.java @@ -0,0 +1,64 @@ +package dev.isxander.yacl3.api; + +import dev.isxander.yacl3.impl.GenericBindingImpl; +import dev.isxander.yacl3.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/src/main/java/dev/isxander/yacl3/api/ButtonOption.java b/src/main/java/dev/isxander/yacl3/api/ButtonOption.java new file mode 100644 index 0000000..4f53dd4 --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/ButtonOption.java @@ -0,0 +1,55 @@ +package dev.isxander.yacl3.api; + +import dev.isxander.yacl3.gui.YACLScreen; +import dev.isxander.yacl3.impl.ButtonOptionImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public interface ButtonOption extends Option> { + /** + * Action to be executed upon button press + */ + BiConsumer action(); + + static Builder createBuilder() { + return new ButtonOptionImpl.BuilderImpl(); + } + + interface Builder { + /** + * Sets the name to be used by the option. + * + * @see Option#name() + */ + Builder name(@NotNull Component name); + + /** + * Sets the button text to be displayed next to the name. + */ + Builder text(@NotNull Component text); + + Builder description(@NotNull OptionDescription description); + + Builder action(@NotNull BiConsumer action); + + /** + * Action to be executed upon button press + * + * @see ButtonOption#action() + */ + @Deprecated + Builder action(@NotNull Consumer action); + + /** + * Sets if the option can be configured + * + * @see Option#available() + */ + Builder available(boolean available); + + ButtonOption build(); + } +} diff --git a/src/main/java/dev/isxander/yacl3/api/ConfigCategory.java b/src/main/java/dev/isxander/yacl3/api/ConfigCategory.java new file mode 100644 index 0000000..b3d68fc --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/ConfigCategory.java @@ -0,0 +1,138 @@ +package dev.isxander.yacl3.api; + +import com.google.common.collect.ImmutableList; +import dev.isxander.yacl3.impl.ConfigCategoryImpl; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.function.Supplier; + +/** + * 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()} + * + * @see ConfigCategory#groups() + * @see OptionGroup#isRoot() + */ + @Override + Builder option(@NotNull Option option); + + /** + * 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()} + * + * @param optionSupplier to be called to initialise the option. called immediately + * @return this + */ + @Override + default Builder option(@NotNull Supplier<@NotNull Option> optionSupplier) { + OptionAddable.super.option(optionSupplier); + return this; + } + + /** + * Adds an option to the root group of the category if a condition is met. + * To add to another group, use {@link Builder#group(OptionGroup)}. + * To construct an option, use {@link Option#createBuilder()} + * + * @param condition only if true is the option added + * @return this + */ + @Override + default Builder optionIf(boolean condition, @NotNull Option option) { + OptionAddable.super.optionIf(condition, option); + return this; + } + + /** + * Adds an option to the root group of the category if a condition is met. + * To add to another group, use {@link Builder#group(OptionGroup)}. + * To construct an option, use {@link Option#createBuilder()} + * + * @param condition only if true is the option added + * @param optionSupplier to be called to initialise the option. called immediately only if condition is true + * @return this + */ + @Override + default Builder optionIf(boolean condition, @NotNull Supplier<@NotNull Option> optionSupplier) { + OptionAddable.super.optionIf(condition, optionSupplier); + return this; + } + + /** + * 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()} + * + * @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/src/main/java/dev/isxander/yacl3/api/Controller.java b/src/main/java/dev/isxander/yacl3/api/Controller.java new file mode 100644 index 0000000..25e4465 --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/Controller.java @@ -0,0 +1,28 @@ +package dev.isxander.yacl3.api; + +import dev.isxander.yacl3.api.utils.Dimension; +import dev.isxander.yacl3.gui.AbstractWidget; +import dev.isxander.yacl3.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/src/main/java/dev/isxander/yacl3/api/LabelOption.java b/src/main/java/dev/isxander/yacl3/api/LabelOption.java new file mode 100644 index 0000000..a5f015e --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/LabelOption.java @@ -0,0 +1,41 @@ +package dev.isxander.yacl3.api; + +import dev.isxander.yacl3.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.yacl3.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 Builder createBuilder() { + return new LabelOptionImpl.BuilderImpl(); + } + + interface Builder { + /** + * Appends a line to the label + */ + Builder line(@NotNull Component line); + + /** + * Appends multiple lines to the label + */ + Builder lines(@NotNull Collection lines); + + LabelOption build(); + } +} diff --git a/src/main/java/dev/isxander/yacl3/api/ListOption.java b/src/main/java/dev/isxander/yacl3/api/ListOption.java new file mode 100644 index 0000000..1f4adfa --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/ListOption.java @@ -0,0 +1,178 @@ +package dev.isxander.yacl3.api; + +import com.google.common.collect.ImmutableList; +import dev.isxander.yacl3.api.controller.ControllerBuilder; +import dev.isxander.yacl3.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(); + + @ApiStatus.Internal + int numberOfEntries(); + + @ApiStatus.Internal + int maximumNumberOfEntries(); + + @ApiStatus.Internal + int minimumNumberOfEntries(); + + @ApiStatus.Internal + ListOptionEntry insertNewEntry(); + + @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() { + return new ListOptionImpl.BuilderImpl<>(); + } + + @Deprecated + static Builder createBuilder(Class typeClass) { + return createBuilder(); + } + + 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); + + Builder description(@NotNull OptionDescription description); + + /** + * Sets the value that is used when creating new entries + */ + Builder initial(@NotNull Supplier initialValue); + + /** + * Sets the value that is used when creating new entries + */ + Builder initial(@NotNull T initialValue); + + Builder controller(@NotNull Function, ControllerBuilder> controller); + + /** + * Sets the controller for the option. + * This is how you interact and change the options. + * + * @see dev.isxander.yacl3.gui.controllers + */ + Builder customController(@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); + + /** + * Sets a minimum size for the list. Once this size is reached, + * no further entries may be removed. + */ + Builder minimumNumberOfEntries(int number); + + /** + * Sets a maximum size for the list. Once this size is reached, + * no further entries may be added. + */ + Builder maximumNumberOfEntries(int number); + + /** + * Dictates if new entries should be added to the end of the list + * rather than the top. + */ + Builder insertEntriesAtEnd(boolean insertAtEnd); + + /** + * 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/src/main/java/dev/isxander/yacl3/api/ListOptionEntry.java b/src/main/java/dev/isxander/yacl3/api/ListOptionEntry.java new file mode 100644 index 0000000..23ec657 --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/ListOptionEntry.java @@ -0,0 +1,18 @@ +package dev.isxander.yacl3.api; + +import com.google.common.collect.ImmutableSet; +import org.jetbrains.annotations.NotNull; + +public interface ListOptionEntry extends Option { + ListOption parentGroup(); + + @Override + default @NotNull ImmutableSet flags() { + return parentGroup().flags(); + } + + @Override + default boolean available() { + return parentGroup().available(); + } +} diff --git a/src/main/java/dev/isxander/yacl3/api/NameableEnum.java b/src/main/java/dev/isxander/yacl3/api/NameableEnum.java new file mode 100644 index 0000000..425623f --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/NameableEnum.java @@ -0,0 +1,10 @@ +package dev.isxander.yacl3.api; + +import net.minecraft.network.chat.Component; + +/** + * Used for the default value formatter of {@link dev.isxander.yacl3.gui.controllers.cycling.EnumController} and {@link dev.isxander.yacl3.gui.controllers.dropdown.EnumDropdownController} + */ +public interface NameableEnum { + Component getDisplayName(); +} diff --git a/src/main/java/dev/isxander/yacl3/api/Option.java b/src/main/java/dev/isxander/yacl3/api/Option.java new file mode 100644 index 0000000..38bd8ca --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/Option.java @@ -0,0 +1,223 @@ +package dev.isxander.yacl3.api; + +import com.google.common.collect.ImmutableSet; +import dev.isxander.yacl3.api.controller.ControllerBuilder; +import dev.isxander.yacl3.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(); + + @NotNull OptionDescription description(); + + /** + * Tooltip (or description) of the option. + * Rendered on hover. + */ + @Deprecated + @NotNull Component tooltip(); + + /** + * Widget provider for a type of option. + * + * @see dev.isxander.yacl3.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); + + /** + * 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(@NotNull 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() { + return true; + } + + /** + * Adds a listener for when the pending value changes + */ + void addListener(BiConsumer, T> changedListener); + + static Builder createBuilder() { + return new OptionImpl.BuilderImpl<>(); + } + + /** + * Creates a builder to construct an {@link Option} + * + * @param type of the option's value + * @param typeClass used to capture the type + */ + @Deprecated + static Builder createBuilder(Class typeClass) { + return createBuilder(); + } + + interface Builder { + /** + * Sets the name to be used by the option. + * + * @see Option#name() + */ + Builder name(@NotNull Component name); + + /** + * Sets the description to be used by the option. + * @see OptionDescription + * @param description the static description. + * @return this builder + */ + Builder description(@NotNull OptionDescription description); + + /** + * Sets the function to get the description by the option's current value. + * + * @see OptionDescription + * @param descriptionFunction the function to get the description by the option's current value. + * @return this builder + */ + Builder description(@NotNull Function descriptionFunction); + + Builder controller(@NotNull Function, ControllerBuilder> controllerBuilder); + + /** + * Sets the controller for the option. + * This is how you interact and change the options. + * + * @see dev.isxander.yacl3.gui.controllers + */ + Builder customController(@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 T def, @NotNull Supplier<@NotNull T> getter, @NotNull Consumer<@NotNull T> 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); + + /** + * Instantly invokes the binder's setter when modified in the GUI. + * Prevents the user from undoing the change + *

+ * Does not support {@link Option#flags()}! + */ + Builder instant(boolean instant); + + /** + * Adds a listener to the option. Invoked upon changing the pending value. + * + * @see Option#addListener(BiConsumer) + */ + Builder listener(@NotNull BiConsumer, T> listener); + + /** + * Adds multiple listeners to the option. Invoked upon changing the pending value. + * + * @see Option#addListener(BiConsumer) + */ + Builder listeners(@NotNull Collection, T>> listeners); + + Option build(); + } +} diff --git a/src/main/java/dev/isxander/yacl3/api/OptionAddable.java b/src/main/java/dev/isxander/yacl3/api/OptionAddable.java new file mode 100644 index 0000000..606e8ca --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/OptionAddable.java @@ -0,0 +1,51 @@ +package dev.isxander.yacl3.api; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.function.Supplier; + +public interface OptionAddable { + /** + * Adds an option to an abstract builder. + * To construct an option, use {@link Option#createBuilder()} + */ + OptionAddable option(@NotNull Option option); + + /** + * Adds an option to an abstract builder. + * To construct an option, use {@link Option#createBuilder()} + * @param optionSupplier to be called to initialise the option. called immediately + */ + default OptionAddable option(@NotNull Supplier<@NotNull Option> optionSupplier) { + return option(optionSupplier.get()); + } + + /** + * Adds an option to an abstract builder if a condition is met. + * To construct an option, use {@link Option#createBuilder()} + * @param condition only if true is the option added + * @param option the option to add + * @return this + */ + default OptionAddable optionIf(boolean condition, @NotNull Option option) { + return condition ? option(option) : this; + } + + /** + * Adds an option to an abstract builder if a condition is met. + * To construct an option, use {@link Option#createBuilder()} + * @param condition only if true is the option added + * @param optionSupplier to be called to initialise the option. called immediately only if condition is true + * @return this + */ + default OptionAddable optionIf(boolean condition, @NotNull Supplier<@NotNull Option> optionSupplier) { + return condition ? option(optionSupplier) : this; + } + + /** + * Adds multiple options to an abstract builder. + * To construct an option, use {@link Option#createBuilder()} + */ + OptionAddable options(@NotNull Collection> options); +} diff --git a/src/main/java/dev/isxander/yacl3/api/OptionDescription.java b/src/main/java/dev/isxander/yacl3/api/OptionDescription.java new file mode 100644 index 0000000..7336379 --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/OptionDescription.java @@ -0,0 +1,161 @@ +package dev.isxander.yacl3.api; + +import dev.isxander.yacl3.gui.image.ImageRenderer; +import dev.isxander.yacl3.impl.OptionDescriptionImpl; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import java.nio.file.Path; +import java.util.Collection; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * Provides all information for the description panel in the GUI. + * This provides no functional benefit, and is purely for UX. + */ +public interface OptionDescription { +