From 29d6ebc4433318fb72d4587d7a67b522fd744619 Mon Sep 17 00:00:00 2001 From: syeyoung Date: Sat, 4 Feb 2023 02:24:07 +0900 Subject: - add guiv2 to dg loader Signed-off-by: syeyoung --- .../launcher/guiv2/BindableAttribute.java | 101 +++++ .../dungeonsguide/launcher/guiv2/Context.java | 31 ++ .../dungeonsguide/launcher/guiv2/DomElement.java | 255 ++++++++++++ .../launcher/guiv2/ElementTreeWalkIterator.java | 48 +++ .../launcher/guiv2/GuiScreenAdapter.java | 303 ++++++++++++++ .../dungeonsguide/launcher/guiv2/RootDom.java | 71 ++++ .../dungeonsguide/launcher/guiv2/Widget.java | 93 +++++ .../launcher/guiv2/elements/AbsXY.java | 80 ++++ .../launcher/guiv2/elements/Align.java | 77 ++++ .../launcher/guiv2/elements/AspectRatioFitter.java | 102 +++++ .../launcher/guiv2/elements/Background.java | 63 +++ .../launcher/guiv2/elements/Border.java | 172 ++++++++ .../launcher/guiv2/elements/Button.java | 128 ++++++ .../launcher/guiv2/elements/CircularRect.java | 75 ++++ .../launcher/guiv2/elements/Clip.java | 72 ++++ .../launcher/guiv2/elements/Column.java | 255 ++++++++++++ .../launcher/guiv2/elements/CompatLayer.java | 169 ++++++++ .../launcher/guiv2/elements/ConstrainedBox.java | 104 +++++ .../launcher/guiv2/elements/Flexible.java | 92 +++++ .../launcher/guiv2/elements/GlobalHUDScale.java | 119 ++++++ .../launcher/guiv2/elements/IntrinsicHeight.java | 65 +++ .../launcher/guiv2/elements/IntrinsicWidth.java | 65 +++ .../launcher/guiv2/elements/Line.java | 139 +++++++ .../launcher/guiv2/elements/Measure.java | 69 ++++ .../launcher/guiv2/elements/Navigator.java | 79 ++++ .../launcher/guiv2/elements/NegativeStencil.java | 112 ++++++ .../launcher/guiv2/elements/Padding.java | 97 +++++ .../launcher/guiv2/elements/Placeholder.java | 66 +++ .../launcher/guiv2/elements/RoundRect.java | 73 ++++ .../dungeonsguide/launcher/guiv2/elements/Row.java | 263 ++++++++++++ .../launcher/guiv2/elements/Scaler.java | 113 ++++++ .../launcher/guiv2/elements/ScrollablePanel.java | 136 +++++++ .../launcher/guiv2/elements/Scrollbar.java | 165 ++++++++ .../guiv2/elements/SelectiveContainer.java | 72 ++++ .../launcher/guiv2/elements/Slot.java | 60 +++ .../launcher/guiv2/elements/Stack.java | 113 ++++++ .../launcher/guiv2/elements/Stencil.java | 112 ++++++ .../launcher/guiv2/elements/Text.java | 205 ++++++++++ .../launcher/guiv2/elements/TextField.java | 445 +++++++++++++++++++++ .../launcher/guiv2/elements/ToggleButton.java | 104 +++++ .../launcher/guiv2/elements/UnconstrainedBox.java | 71 ++++ .../launcher/guiv2/elements/Wrap.java | 130 ++++++ .../launcher/guiv2/elements/image/Image.java | 60 +++ .../guiv2/elements/image/ImageTexture.java | 171 ++++++++ .../guiv2/elements/image/ResourceImage.java | 54 +++ .../launcher/guiv2/elements/image/URLImage.java | 87 ++++ .../guiv2/elements/popups/AbsLocationPopup.java | 98 +++++ .../guiv2/elements/popups/MinecraftTooltip.java | 58 +++ .../guiv2/elements/popups/MouseTooltip.java | 56 +++ .../launcher/guiv2/elements/popups/PopupMgr.java | 92 +++++ .../guiv2/elements/richtext/BreakWord.java | 23 ++ .../guiv2/elements/richtext/BrokenWordData.java | 31 ++ .../guiv2/elements/richtext/FlatTextSpan.java | 202 ++++++++++ .../launcher/guiv2/elements/richtext/RichLine.java | 33 ++ .../launcher/guiv2/elements/richtext/RichText.java | 224 +++++++++++ .../launcher/guiv2/elements/richtext/TextSpan.java | 48 +++ .../richtext/fonts/DefaultFontRenderer.java | 310 ++++++++++++++ .../elements/richtext/fonts/FontRenderer.java | 30 ++ .../elements/richtext/shaders/ChromaShader.java | 41 ++ .../guiv2/elements/richtext/shaders/Shader.java | 24 ++ .../richtext/shaders/SingleColorShader.java | 40 ++ .../richtext/styles/CompiledTextStyle.java | 146 +++++++ .../guiv2/elements/richtext/styles/ITextStyle.java | 52 +++ .../richtext/styles/ParentDelegatingTextStyle.java | 158 ++++++++ .../launcher/guiv2/layouter/Layouter.java | 43 ++ .../launcher/guiv2/layouter/NullLayouter.java | 33 ++ .../guiv2/layouter/SingleChildPassingLayouter.java | 53 +++ .../launcher/guiv2/primitive/Animation.java | 38 ++ .../launcher/guiv2/primitive/ConstraintBox.java | 40 ++ .../launcher/guiv2/primitive/IPosition.java | 25 ++ .../launcher/guiv2/primitive/IRect.java | 34 ++ .../launcher/guiv2/primitive/ISize.java | 29 ++ .../launcher/guiv2/primitive/Position.java | 28 ++ .../launcher/guiv2/primitive/Rect.java | 32 ++ .../launcher/guiv2/primitive/Size.java | 28 ++ .../guiv2/renderer/DrawNothingRenderer.java | 29 ++ .../guiv2/renderer/OnlyChildrenRenderer.java | 52 +++ .../launcher/guiv2/renderer/Renderer.java | 36 ++ .../launcher/guiv2/renderer/RenderingContext.java | 142 +++++++ .../guiv2/renderer/SingleChildRenderer.java | 52 +++ .../launcher/guiv2/view/TestPopup.java | 35 ++ .../launcher/guiv2/view/TestView.java | 50 +++ .../guiv2/xml/AnnotatedExportOnlyWidget.java | 88 ++++ .../guiv2/xml/AnnotatedImportOnlyWidget.java | 125 ++++++ .../launcher/guiv2/xml/AnnotatedWidget.java | 151 +++++++ .../launcher/guiv2/xml/DelegatingWidget.java | 99 +++++ .../guiv2/xml/DelegatingWidgetConverter.java | 40 ++ .../launcher/guiv2/xml/DomElementRegistry.java | 107 +++++ .../launcher/guiv2/xml/ExportedWidget.java | 25 ++ .../guiv2/xml/ExportedWidgetConverter.java | 42 ++ .../launcher/guiv2/xml/ImportingWidget.java | 29 ++ .../launcher/guiv2/xml/ParsedWidgetConverter.java | 43 ++ .../guiv2/xml/PropByPropParsedWidgetConverter.java | 140 +++++++ .../launcher/guiv2/xml/StringConversions.java | 49 +++ .../launcher/guiv2/xml/annotations/Bind.java | 30 ++ .../launcher/guiv2/xml/annotations/Export.java | 30 ++ .../launcher/guiv2/xml/annotations/On.java | 30 ++ .../guiv2/xml/annotations/Passthrough.java | 32 ++ .../guiv2/xml/annotations/Passthroughs.java | 30 ++ .../launcher/guiv2/xml/data/Parser.java | 25 ++ .../launcher/guiv2/xml/data/ParserElement.java | 34 ++ .../launcher/guiv2/xml/data/ParserElementList.java | 24 ++ .../launcher/guiv2/xml/data/ParserException.java | 38 ++ .../launcher/guiv2/xml/data/W3CBackedParser.java | 70 ++++ .../guiv2/xml/data/W3CBackedParserElement.java | 74 ++++ .../launcher/guiv2/xml/data/WidgetList.java | 26 ++ .../main/resources/assets/dungeons_guide_loader/fi | 0 .../dungeons_guide_loader/gui/elements/button.gui | 6 + .../gui/elements/dgButton.gui | 52 +++ .../gui/elements/iconButton.gui | 51 +++ .../gui/elements/locationedPopup.gui | 24 ++ .../gui/elements/popupmgr.gui | 3 + .../gui/elements/ratioResourceImage.gui | 26 ++ .../gui/elements/scrollBar.gui | 28 ++ .../gui/elements/scrollablePanel.gui | 46 +++ .../gui/elements/simpleButton.gui | 49 +++ .../gui/elements/simpleHorizontalScrollBar.gui | 38 ++ .../gui/elements/simpleToggleButton.gui | 85 ++++ .../gui/elements/simpleVerticalScrollBar.gui | 38 ++ .../dungeons_guide_loader/gui/elements/size.gui | 23 ++ .../gui/elements/slowlist.gui | 23 ++ .../gui/elements/toggleButton.gui | 6 + .../resources/assets/dungeons_guide_loader/gui/fi | 0 loader/src/main/resources/pack.mcmeta | 6 + 124 files changed, 9866 insertions(+) create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/BindableAttribute.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Context.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/DomElement.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/ElementTreeWalkIterator.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/GuiScreenAdapter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/RootDom.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Widget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AbsXY.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Align.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AspectRatioFitter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Background.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Border.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Button.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/CircularRect.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Clip.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Column.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/CompatLayer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/ConstrainedBox.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Flexible.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/GlobalHUDScale.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/IntrinsicHeight.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/IntrinsicWidth.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Line.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Measure.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Navigator.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/NegativeStencil.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Padding.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Placeholder.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/RoundRect.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Row.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Scaler.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/ScrollablePanel.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Scrollbar.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/SelectiveContainer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Slot.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Stack.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Stencil.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Text.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/TextField.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/ToggleButton.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/UnconstrainedBox.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Wrap.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/image/Image.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/image/ImageTexture.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/image/ResourceImage.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/image/URLImage.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/popups/AbsLocationPopup.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/popups/MinecraftTooltip.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/popups/MouseTooltip.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/popups/PopupMgr.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/BreakWord.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/BrokenWordData.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/FlatTextSpan.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/RichLine.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/RichText.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/TextSpan.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/fonts/DefaultFontRenderer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/fonts/FontRenderer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/shaders/ChromaShader.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/shaders/Shader.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/shaders/SingleColorShader.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/styles/CompiledTextStyle.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/styles/ITextStyle.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/richtext/styles/ParentDelegatingTextStyle.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/layouter/Layouter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/layouter/NullLayouter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/layouter/SingleChildPassingLayouter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/Animation.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/ConstraintBox.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/IPosition.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/IRect.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/ISize.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/Position.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/Rect.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/primitive/Size.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/renderer/DrawNothingRenderer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/renderer/OnlyChildrenRenderer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/renderer/Renderer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/renderer/RenderingContext.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/renderer/SingleChildRenderer.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/view/TestPopup.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/view/TestView.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/AnnotatedExportOnlyWidget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/AnnotatedImportOnlyWidget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/AnnotatedWidget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/DelegatingWidget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/DelegatingWidgetConverter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/DomElementRegistry.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/ExportedWidget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/ExportedWidgetConverter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/ImportingWidget.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/ParsedWidgetConverter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/PropByPropParsedWidgetConverter.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/StringConversions.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/annotations/Bind.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/annotations/Export.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/annotations/On.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/annotations/Passthrough.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/annotations/Passthroughs.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/Parser.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/ParserElement.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/ParserElementList.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/ParserException.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/W3CBackedParser.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/W3CBackedParserElement.java create mode 100644 loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/xml/data/WidgetList.java create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/fi create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/button.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/dgButton.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/iconButton.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/locationedPopup.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/popupmgr.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/ratioResourceImage.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/scrollBar.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/scrollablePanel.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/simpleButton.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/simpleHorizontalScrollBar.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/simpleToggleButton.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/simpleVerticalScrollBar.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/size.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/slowlist.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/elements/toggleButton.gui create mode 100644 loader/src/main/resources/assets/dungeons_guide_loader/gui/fi create mode 100644 loader/src/main/resources/pack.mcmeta (limited to 'loader/src/main') diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/BindableAttribute.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/BindableAttribute.java new file mode 100644 index 00000000..8c09f2cf --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/BindableAttribute.java @@ -0,0 +1,101 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2022 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import lombok.Getter; + +import java.util.*; +import java.util.function.BiConsumer; + +public class BindableAttribute { + public BindableAttribute(Class type) { + this.type = type; + initialized = false; + } + public BindableAttribute(Class type, T defaultValue) { + this.type = type; + value = defaultValue; + initialized = true; + } + + private boolean initialized = false; + @Getter + private final Class type; + private T value; + private List> onUpdates = new ArrayList<>(); + + private boolean updating = false; + public void setValue(T t) { + if (updating) return; + updating = true; + T old = this.value; + this.value = t; + try { + if (!Objects.equals(t, old)) + for (BiConsumer onUpdate : onUpdates) { + onUpdate.accept(old, value); + } + } finally { + updating = false; + initialized = true; + } + } + public T getValue() { + return value; + } + + public void addOnUpdate(BiConsumer onUpdate) { + onUpdates.add(onUpdate); + } + public void removeOnUpdate(BiConsumer onUpdate) { + onUpdates.remove(onUpdate); + } + + private Set> linkedWith = new HashSet<>(); + + private void boundSet(T old, T neu) { + setValue(neu); + } + + public void exportTo(BindableAttribute bindableAttribute) { // This method has to be called by exporting bindable attribute + if (bindableAttribute.type != type) throw new IllegalArgumentException("Different type!!"); + + this.addOnUpdate(bindableAttribute::boundSet); + bindableAttribute.addOnUpdate(this::boundSet); + linkedWith.add(bindableAttribute); + + if (bindableAttribute.initialized) + setValue(bindableAttribute.getValue()); + else + bindableAttribute.setValue(getValue()); + } + + public void unexport(BindableAttribute bindableAttribute) { + bindableAttribute.removeOnUpdate(this::boundSet); + removeOnUpdate(bindableAttribute::boundSet); + linkedWith.remove(bindableAttribute); + } + + public void unexportAll() { + Set> copy = new HashSet<>(linkedWith); + for (BindableAttribute tBindableAttribute : copy) { + unexport(tBindableAttribute); + } + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Context.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Context.java new file mode 100644 index 00000000..b59c2c2b --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Context.java @@ -0,0 +1,31 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2022 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import java.util.HashMap; +import java.util.Map; + +// TODO: get rid of this and change it with tree walking. +public class Context { + public Map CONTEXT = new HashMap<>(); + + public T getValue(Class clazz, String key) { + return (T) CONTEXT.get(key); + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/DomElement.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/DomElement.java new file mode 100644 index 00000000..9487b21c --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/DomElement.java @@ -0,0 +1,255 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2022 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import kr.syeyoung.dungeonsguide.launcher.guiv2.elements.Stack; +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.Layouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.NullLayouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.ConstraintBox; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Position; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Rect; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Size; +import kr.syeyoung.dungeonsguide.launcher.guiv2.renderer.DrawNothingRenderer; +import kr.syeyoung.dungeonsguide.launcher.guiv2.renderer.Renderer; +import kr.syeyoung.dungeonsguide.mod.utils.cursor.EnumCursor; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class DomElement { + @Getter + @Setter(AccessLevel.PACKAGE) + private Widget widget; + @Getter + @Setter(AccessLevel.PACKAGE) + private Renderer renderer = DrawNothingRenderer.INSTANCE; // renders element itself. + @Getter + @Setter(AccessLevel.PACKAGE) + private Layouter layouter = NullLayouter.INSTANCE; // layouts subelements + + @Getter + @Setter + private DomElement parent; + @Getter + private List children = new CopyOnWriteArrayList<>(); + + @Getter + Context context; + + public DomElement() { + } + + @Getter + private boolean isMounted; + + + public void setMounted(boolean mounted) { + if (isMounted == mounted) { + return; + } + isMounted = mounted; + + for (DomElement child : children) { + child.context = context; + child.setMounted(mounted); + } + + if (mounted) widget.onMount(); + else { + if (isFocused()) + context.CONTEXT.put("focus", null); + widget.onUnmount(); + }; + } + + @Getter + private Rect relativeBound; // relative bound from parent, unapplied transformation + + public void setRelativeBound(Rect relativeBound) { + this.relativeBound = relativeBound; + this.size = new Size(relativeBound.getWidth(), relativeBound.getHeight()); + } + + @Getter @Setter + private Size size; + + @Getter @Setter + private Rect absBounds; // absolute bound from screen top left + + + + // event propagation + + + public void requestRelayoutParent() { + if (parent != null) + parent.requestRelayout(); + } + public void requestRelayout() { + if (layouter.canCutRequest() && size != null) { + layouter.layout(this, new ConstraintBox( + size.getWidth(), size.getWidth(), size.getHeight(), size.getHeight() + )); + return; + } + if (parent != null) + parent.requestRelayout(); + } + + public void addElementFirst(DomElement element) { + element.setParent(this); + children.add(0, element); + element.context = context; + element.setMounted(isMounted); + requestRelayout(); + } + public void addElement(DomElement element) { + element.setParent(this); + children.add(element); + element.context = context; + element.setMounted(isMounted); + requestRelayout(); + } + public void removeElement(DomElement element) { + element.setParent(null); + children.remove(element); + element.setMounted(false); + requestRelayout(); + } + + public void keyPressed0(char typedChar, int keyCode) { + for (DomElement childComponent : children) { + childComponent.keyPressed0(typedChar, keyCode); + if (widget instanceof Stack) break; + } + + if (isFocused()) + widget.keyPressed(typedChar, keyCode); + } + public void keyHeld0(char typedChar, int keyCode) { + for (DomElement childComponent : children) { + childComponent.keyHeld0(typedChar, keyCode); + if (widget instanceof Stack) break; + } + + if (isFocused()) + widget.keyHeld(typedChar, keyCode); + } + public void keyReleased0(char typedChar, int keyCode) { + for (DomElement childComponent : children) { + childComponent.keyReleased0(typedChar, keyCode); + if (widget instanceof Stack) break; + } + if (isFocused()) + widget.keyReleased(typedChar, keyCode); + } + + public void obtainFocus() { + context.CONTEXT.put("focus", this); + } + + public boolean isFocused() { + return context.getValue(DomElement.class, "focus") == this; + } + + public boolean mouseClicked0(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, int mouseButton) { + if (absBounds == null) return false; + if (!absBounds.contains(absMouseX, absMouseY)) { + return false; + } + + for (DomElement childComponent : children) { + Position transformed = renderer.transformPoint(childComponent, new Position(relMouseX0, relMouseY0)); + + if (childComponent.mouseClicked0(absMouseX, absMouseY, transformed.x, transformed.y, mouseButton)) { + return true; + } + } + + return widget.mouseClicked(absMouseX, absMouseY, relMouseX0, relMouseY0, mouseButton); + } + + + public void mouseReleased0(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, int state) { + if (absBounds == null) return; + + for (DomElement childComponent : children) { + Position transformed = renderer.transformPoint(childComponent, new Position(relMouseX0, relMouseY0)); + + childComponent.mouseReleased0(absMouseX, absMouseY, transformed.x, transformed.y, state); + } + widget.mouseReleased(absMouseX, absMouseY, relMouseX0, relMouseY0, state); + } + + public void mouseClickMove0(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, int clickedMouseButton, long timeSinceLastClick) { + if (absBounds == null) return; + + for (DomElement childComponent : children) { + Position transformed = renderer.transformPoint(childComponent, new Position(relMouseX0, relMouseY0)); + + childComponent.mouseClickMove0(absMouseX, absMouseY, transformed.x, transformed.y, clickedMouseButton, timeSinceLastClick); + } + if (isFocused()) + widget.mouseClickMove(absMouseX, absMouseY, relMouseX0, relMouseY0, clickedMouseButton, timeSinceLastClick); + } + public boolean mouseScrolled0(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, int scrollAmount) { + if (absBounds == null) return false; + + for (DomElement childComponent : children) { + Position transformed = renderer.transformPoint(childComponent, new Position(relMouseX0, relMouseY0)); + + if (childComponent.mouseScrolled0(absMouseX, absMouseY, transformed.x, transformed.y, scrollAmount)) { + return true; + } + } + if (!absBounds.contains(absMouseX, absMouseY) && !isFocused()) return false; + return widget.mouseScrolled(absMouseX, absMouseY, relMouseX0, relMouseY0, scrollAmount); + } + + + private boolean wasMouseIn = false; + public boolean mouseMoved0(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, boolean withinbound) { + if (absBounds == null) return false; + boolean isIn = absBounds.contains(absMouseX, absMouseY) && withinbound; + if (!isIn) { + if (wasMouseIn) widget.mouseExited(absMouseX, absMouseY, relMouseX0, relMouseY0); + } else { + if (!wasMouseIn) widget.mouseEntered(absMouseX, absMouseY, relMouseX0, relMouseY0); + } + wasMouseIn = isIn; + + for (DomElement childComponent : children) { + Position transformed = renderer.transformPoint(childComponent, new Position(relMouseX0, relMouseY0)); + + if (childComponent.mouseMoved0(absMouseX, absMouseY, transformed.x, transformed.getY(), isIn)) { + return true; + } + } + if (isIn) + return widget.mouseMoved(absMouseX, absMouseY, relMouseX0, relMouseY0); + return false; + } + + public void setCursor(EnumCursor enumCursor) { + parent.setCursor(enumCursor); + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/ElementTreeWalkIterator.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/ElementTreeWalkIterator.java new file mode 100644 index 00000000..65352a14 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/ElementTreeWalkIterator.java @@ -0,0 +1,48 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; + +public class ElementTreeWalkIterator implements Iterator, Iterable { + private DomElement current; + public ElementTreeWalkIterator(DomElement child) { + this.current = child; + } + + @Override + public boolean hasNext() { + return current != null; + } + + @Override + public DomElement next() { + DomElement c1 = current; + current = current.getParent(); + return c1; + } + + @NotNull + @Override + public Iterator iterator() { + return this; + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/GuiScreenAdapter.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/GuiScreenAdapter.java new file mode 100644 index 00000000..03c60397 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/GuiScreenAdapter.java @@ -0,0 +1,303 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.ConstraintBox; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Rect; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Size; +import kr.syeyoung.dungeonsguide.launcher.guiv2.renderer.RenderingContext; +import kr.syeyoung.dungeonsguide.mod.utils.cursor.EnumCursor; +import kr.syeyoung.dungeonsguide.mod.utils.cursor.GLCursors; +import lombok.Getter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import org.lwjgl.LWJGLException; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import java.io.IOException; +import java.util.Stack; + +import static org.lwjgl.opengl.GL11.GL_GREATER; + +public class GuiScreenAdapter extends GuiScreen { + + @Getter + private RootDom view; + private boolean isOpen = false; + + private Stack domStack = new Stack<>(); + + public GuiScreenAdapter(Widget widget) { + view = new RootDom(widget); + view.getContext().CONTEXT.put("screenAdapter", this); + + try { + Mouse.setNativeCursor(GLCursors.getCursor(EnumCursor.DEFAULT)); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + public void open(Widget newRoot) { + domStack.push(view); + view = new RootDom(newRoot); + view.getContext().CONTEXT.put("screenAdapter", this); + initGui(); + } + public void goBack() { + view = domStack.pop(); + view.getContext().CONTEXT.put("screenAdapter", this); + initGui(); + } + + public static GuiScreenAdapter getAdapter(DomElement domElement) { + return domElement.getContext().getValue(GuiScreenAdapter.class, "screenAdapter"); + } + + @Override + public void initGui() { + super.initGui(); + Keyboard.enableRepeatEvents(true); + isOpen = true; + try { + view.setRelativeBound(new Rect(0, 0, Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight)); + view.setAbsBounds(new Rect(0, 0, Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight)); + view.setSize(new Size(Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight)); + view.getLayouter().layout(view, new ConstraintBox( + Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayHeight, + Minecraft.getMinecraft().displayHeight + )); + view.setMounted(true); + }catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + int i = Mouse.getEventX(); + int j = this.mc.displayHeight - Mouse.getEventY(); + + try { + if (view.isRelayoutRequested()) { + + view.setRelayoutRequested(false); + view.getLayouter().layout(view, new ConstraintBox( + Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayHeight, + Minecraft.getMinecraft().displayHeight + )); + } + + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + GlStateManager.pushMatrix(); + GlStateManager.disableDepth(); + GlStateManager.enableBlend(); + GlStateManager.enableAlpha(); + GlStateManager.alphaFunc(GL_GREATER, 0); + GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); + GlStateManager.color(1, 1, 1, 1); + GlStateManager.scale(1.0 / scaledResolution.getScaleFactor(), 1.0 / scaledResolution.getScaleFactor(), 1.0d); + view.getRenderer().doRender(i, j, i, j, partialTicks, new RenderingContext(), view); + GlStateManager.alphaFunc(GL_GREATER, 0.1f); + GlStateManager.popMatrix(); + GlStateManager.enableDepth(); + GL11.glDisable(GL11.GL_SCISSOR_TEST); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void keyTyped(char typedChar, int keyCode) throws IOException { + try { + view.keyPressed0(typedChar, keyCode); + super.keyTyped(typedChar, keyCode); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + public void keyHeld(int keyCode, char typedChar) throws IOException { + try { + view.keyHeld0(typedChar, keyCode); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + public void keyReleased(int keyCode, char typedChar) throws IOException { + try { + view.keyReleased0(typedChar, keyCode); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + try { + super.mouseClicked(mouseX, mouseY, mouseButton); + view.mouseClicked0(mouseX, mouseY + , mouseX, mouseY, mouseButton); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + Keyboard.enableRepeatEvents(false); + isOpen = false; + + try { + Mouse.setNativeCursor(null); + view.setCursor(EnumCursor.DEFAULT); + } catch (LWJGLException e) { + e.printStackTrace(); + } + } + + @Override + public void mouseReleased(int mouseX, int mouseY, int state) { + try { + view.mouseReleased0(mouseX, mouseY + , mouseX, mouseY, state); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + @Override + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + try { + view.mouseClickMove0(mouseX, mouseY + , mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + public void mouseMove(int mouseX, int mouseY) { + try { + view.mouseMoved0(mouseX, mouseY + , mouseX, mouseY, true); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + + private int touchValue; + private int eventButton; + private long lastMouseEvent; + + + private int lastX, lastY; + + + @Override + public void handleMouseInput() throws IOException { + if (!isOpen) return; + try { + int i = Mouse.getEventX(); + int j = this.mc.displayHeight - Mouse.getEventY(); + int k = Mouse.getEventButton(); + + if (Mouse.getEventButtonState()) { + if (this.mc.gameSettings.touchscreen && this.touchValue++ > 0) { + return; + } + + this.eventButton = k; + this.lastMouseEvent = Minecraft.getSystemTime(); + this.mouseClicked(i, j, this.eventButton); + } else if (k != -1) { + if (this.mc.gameSettings.touchscreen && --this.touchValue > 0) { + return; + } + + this.eventButton = -1; + this.mouseReleased(i, j, k); + } else if (this.eventButton != -1 && this.lastMouseEvent > 0L) { + long l = Minecraft.getSystemTime() - this.lastMouseEvent; + this.mouseClickMove(i, j, this.eventButton, l); + } + if (lastX != i || lastY != j) { + try { + EnumCursor prevCursor = view.getCurrentCursor(); + view.setCursor(EnumCursor.DEFAULT); + this.mouseMove(i, j); + EnumCursor newCursor = view.getCurrentCursor(); + if (prevCursor != newCursor) Mouse.setNativeCursor(GLCursors.getCursor(newCursor)); + } catch (Throwable e) { + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); + } + } + + + int wheel = Mouse.getEventDWheel(); + if (wheel != 0) { + view.mouseScrolled0(i, j, i, j, wheel); + } + lastX = i; + lastY = j; + } catch (Throwable e) { + e.printStackTrace(); + } + } + + public void handleKeyboardInput() throws IOException { + if (!isOpen) return; + + if (Keyboard.getEventKeyState()) { + if (Keyboard.isRepeatEvent()) + this.keyHeld(Keyboard.getEventKey(), Keyboard.getEventCharacter()); + else + this.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + } else { + this.keyReleased(Keyboard.getEventKey(), Keyboard.getEventCharacter()); + } + + this.mc.dispatchKeypresses(); + } + + @Override + public void handleInput() throws IOException { + Keyboard.enableRepeatEvents(true); // I hope it's a temporary solution NEU Incompat. ? + super.handleInput(); + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/RootDom.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/RootDom.java new file mode 100644 index 00000000..d7c732f3 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/RootDom.java @@ -0,0 +1,71 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.SingleChildPassingLayouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.renderer.SingleChildRenderer; +import kr.syeyoung.dungeonsguide.mod.utils.cursor.EnumCursor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +public class RootDom extends DomElement { + + private static class DummyWidget extends Widget { + @Override + public List build(DomElement buildContext) { + return null; + } + } + public RootDom(Widget widget) { + context = new Context(); + setLayouter(SingleChildPassingLayouter.INSTANCE); + setRenderer(SingleChildRenderer.INSTANCE); + setWidget(new DummyWidget()); + + DomElement element = widget.createDomElement(this);// and it's mounted! + addElement(element); + } + + @Getter + private EnumCursor currentCursor; + + @Override + public void setCursor(EnumCursor enumCursor) { + currentCursor = enumCursor; + } + + @Getter + @Setter + private boolean relayoutRequested; + + @Override + public void requestRelayout() { + relayoutRequested = true; + } + + + + @Override + public boolean mouseClicked0(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, int mouseButton) { + getContext().CONTEXT.put("focus", null); + return super.mouseClicked0(absMouseX, absMouseY, relMouseX0, relMouseY0, mouseButton); + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Widget.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Widget.java new file mode 100644 index 00000000..3e001f89 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/Widget.java @@ -0,0 +1,93 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2022 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2; + +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.Layouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.SingleChildPassingLayouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.renderer.Renderer; +import kr.syeyoung.dungeonsguide.launcher.guiv2.renderer.SingleChildRenderer; +import lombok.Getter; + +import java.util.List; + +public abstract class Widget { + + @Getter + private DomElement domElement = new DomElement(); + + + private boolean multiAtFirst = false; + public DomElement createDomElement(DomElement parent) { + domElement = new DomElement(); + domElement.setWidget(this); + domElement.setParent(parent); + + domElement.setLayouter(createLayouter()); + domElement.setRenderer(createRenderer()); + + // build + List widgets = build(domElement); + for (Widget widget : widgets) { + DomElement domElement1 = widget.createDomElement(domElement); + domElement.addElement(domElement1); + } + return domElement; + } + + protected Layouter createLayouter() { + if (this instanceof Layouter) return (Layouter) this; + return SingleChildPassingLayouter.INSTANCE; + } + protected Renderer createRenderer() { + if (this instanceof Renderer) return (Renderer) this; + return SingleChildRenderer.INSTANCE; + } + + public abstract List build(DomElement buildContext); + + public Widget() { + // parameters shall be passed through constructor + // or maybe a "builder" + // set bindable props in the builder and yeah + // or maybe set raw props + } + + + public boolean mouseScrolled(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0, int scrollAmount) { + return false; + } + public boolean mouseMoved(int absMouseX, int absMouseY, double relMouseX0, double relMouseY0) { + return false; + } + public void mouseClickMove(int absMouseX, int absMouseY, double relMouseX, double relMouseY, int clickedMouseButton, long timeSinceLastClick) {} + public void mouseReleased(int absMouseX, int absMouseY, double relMouseX, double relMouseY, int state) {} + public boolean mouseClicked(int absMouseX, int absMouseY, double relMouseX, double relMouseY, int mouseButton) { + return false; + } + public void keyReleased(char typedChar, int keyCode) {} + public void keyHeld(char typedChar, int keyCode) {} + public void keyPressed(char typedChar, int keyCode) {} + public void mouseExited(int absMouseX, int absMouseY, double relMouseX, double relMouseY) {} + public void mouseEntered(int absMouseX, int absMouseY, double relMouseX, double relMouseY) {} + + public void onMount() { + } + public void onUnmount() { + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AbsXY.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AbsXY.java new file mode 100644 index 00000000..50ec1d08 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AbsXY.java @@ -0,0 +1,80 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2.elements; + +import kr.syeyoung.dungeonsguide.launcher.guiv2.BindableAttribute; +import kr.syeyoung.dungeonsguide.launcher.guiv2.DomElement; +import kr.syeyoung.dungeonsguide.launcher.guiv2.Widget; +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.Layouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.ConstraintBox; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Rect; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Size; +import kr.syeyoung.dungeonsguide.launcher.guiv2.xml.AnnotatedExportOnlyWidget; +import kr.syeyoung.dungeonsguide.launcher.guiv2.xml.annotations.Export; + +import java.util.Collections; +import java.util.List; + +public class AbsXY extends AnnotatedExportOnlyWidget implements Layouter { + @Export(attributeName = "_") + public final BindableAttribute child = new BindableAttribute<>(Widget.class); + + @Export(attributeName = "x") + public final BindableAttribute x = new BindableAttribute<>(Double.class, 0.0); + + @Export(attributeName = "y") + public final BindableAttribute y = new BindableAttribute<>(Double.class, 0.0); + + public AbsXY() { + x.addOnUpdate(this::setLocations); + y.addOnUpdate(this::setLocations); + } + + private void setLocations(double old, double neu) { + if (getDomElement().getChildren().size() == 0) return; + DomElement child = getDomElement().getChildren().get(0); + if (child.getSize() == null) return; + child.setRelativeBound(new Rect(x.getValue(), y.getValue(), child.getSize().getWidth(), child.getSize().getHeight())); + } + + @Override + public Size layout(DomElement buildContext, ConstraintBox constraintBox) { + DomElement child = buildContext.getChildren().get(0); + Size size = child.getLayouter().layout(child, new ConstraintBox( + 0,constraintBox.getMaxWidth() - x.getValue(), 0, constraintBox.getMaxHeight()-y.getValue() + )); + child.setRelativeBound(new Rect(x.getValue(), y.getValue(), size.getWidth(), size.getHeight())); + return new Size(constraintBox.getMaxWidth(), constraintBox.getMaxHeight()); + } + + + @Override + public double getMaxIntrinsicWidth(DomElement buildContext, double height) { + return buildContext.getChildren().isEmpty() ? 0 : buildContext.getChildren().get(0).getLayouter().getMaxIntrinsicWidth(buildContext.getChildren().get(0), height); + } + + @Override + public double getMaxIntrinsicHeight(DomElement buildContext, double width) { + return buildContext.getChildren().isEmpty() ? 0 : buildContext.getChildren().get(0).getLayouter().getMaxIntrinsicHeight(buildContext.getChildren().get(0), width); + } + @Override + public List build(DomElement buildContext) { + return Collections.singletonList(child.getValue()); + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Align.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Align.java new file mode 100644 index 00000000..b55fe961 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/Align.java @@ -0,0 +1,77 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package kr.syeyoung.dungeonsguide.launcher.guiv2.elements; + +import kr.syeyoung.dungeonsguide.launcher.guiv2.BindableAttribute; +import kr.syeyoung.dungeonsguide.launcher.guiv2.DomElement; +import kr.syeyoung.dungeonsguide.launcher.guiv2.Widget; +import kr.syeyoung.dungeonsguide.launcher.guiv2.layouter.Layouter; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.ConstraintBox; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Rect; +import kr.syeyoung.dungeonsguide.launcher.guiv2.primitive.Size; +import kr.syeyoung.dungeonsguide.launcher.guiv2.xml.AnnotatedExportOnlyWidget; +import kr.syeyoung.dungeonsguide.launcher.guiv2.xml.annotations.Export; + +import java.util.Collections; +import java.util.List; + +public class Align extends AnnotatedExportOnlyWidget implements Layouter { + @Export(attributeName = "hAlign") + public final BindableAttribute hAlign = new BindableAttribute<>(Alignment.class, Alignment.CENTER); + @Export(attributeName = "vAlign") + public final BindableAttribute vAlign = new BindableAttribute<>(Alignment.class, Alignment.CENTER); + + @Export(attributeName = "_") + public final BindableAttribute child = new BindableAttribute<>(Widget.class); + public static enum Alignment { + START, CENTER, END + } + + @Override + public List build(DomElement buildContext) { + return Collections.singletonList(child.getValue()); + } + + @Override + public Size layout(DomElement buildContext, ConstraintBox constraintBox) { + DomElement theOnly = buildContext.getChildren().get(0); + Size size = theOnly.getLayouter().layout(theOnly, new ConstraintBox( + 0, constraintBox.getMaxWidth(), 0, constraintBox.getMaxHeight() + )); + + double x = hAlign.getValue() == Alignment.START ? 0 : hAlign.getValue() == Alignment.CENTER ? (constraintBox.getMaxWidth() - size.getWidth())/2 : constraintBox.getMaxWidth() - size.getWidth(); + double y = vAlign.getValue() == Alignment.START ? 0 : vAlign.getValue() == Alignment.CENTER ? (constraintBox.getMaxHeight() - size.getHeight())/2 : constraintBox.getMaxHeight() - size.getHeight(); + + theOnly.setRelativeBound(new Rect(x, y, + size.getWidth(), size.getHeight() + )); + return new Size(constraintBox.getMaxWidth(), constraintBox.getMaxHeight()); + } + + + @Override + public double getMaxIntrinsicWidth(DomElement buildContext, double height) { + return buildContext.getChildren().isEmpty() ? 0 : buildContext.getChildren().get(0).getLayouter().getMaxIntrinsicWidth(buildContext.getChildren().get(0), height); + } + + @Override + public double getMaxIntrinsicHeight(DomElement buildContext, double width) { + return buildContext.getChildren().isEmpty() ? 0 : buildContext.getChildren().get(0).getLayouter().getMaxIntrinsicHeight(buildContext.getChildren().get(0), width); + } +} diff --git a/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AspectRatioFitter.java b/loader/src/main/java/kr/syeyoung/dungeonsguide/launcher/guiv2/elements/AspectRatioFitter.java new file mode 100644 index 00000000..982c1523 --- /dev/null +++ b/loader/src/main/java/kr/syeyoung/dungeonsguide/launc