From 0b75244b3acaae523a54bb223cc9effb0d107785 Mon Sep 17 00:00:00 2001 From: LabyStudio Date: Sun, 25 Apr 2021 18:51:59 +0200 Subject: [PATCH] init --- .github/images/anchor.png | Bin 0 -> 37559 bytes .github/images/example.png | Bin 0 -> 27388 bytes .gitignore | 131 +++++++++++++ README.md | 36 ++++ build.gradle | 14 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle | 2 + .../serverapi/common/widgets/EnumWidget.java | 59 ++++++ .../common/widgets/WidgetSerialization.java | 67 +++++++ .../widgets/components/ContainerWidget.java | 51 +++++ .../components/ValueContainerWidget.java | 41 ++++ .../common/widgets/components/Widget.java | 78 ++++++++ .../components/widgets/ButtonWidget.java | 42 ++++ .../components/widgets/ColorPickerWidget.java | 72 +++++++ .../components/widgets/ImageWidget.java | 106 ++++++++++ .../components/widgets/LabelWidget.java | 109 +++++++++++ .../components/widgets/TextFieldWidget.java | 74 +++++++ .../serverapi/common/widgets/util/Anchor.java | 49 +++++ .../common/widgets/util/EnumResponse.java | 11 ++ .../common/widgets/util/EnumScreenAction.java | 12 ++ 23 files changed, 1233 insertions(+) create mode 100644 .github/images/anchor.png create mode 100644 .github/images/example.png create mode 100644 .gitignore create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/EnumWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/WidgetSerialization.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/ContainerWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/ValueContainerWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/Widget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ButtonWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ColorPickerWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ImageWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/widgets/LabelWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/components/widgets/TextFieldWidget.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/util/Anchor.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/util/EnumResponse.java create mode 100644 src/main/java/net/labymod/serverapi/common/widgets/util/EnumScreenAction.java diff --git a/.github/images/anchor.png b/.github/images/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e0822b51570fb94751911579441da25c4ca9d6 GIT binary patch literal 37559 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 literal 0 HcmV?d00001 diff --git a/.github/images/example.png b/.github/images/example.png new file mode 100644 index 0000000000000000000000000000000000000000..8057a2197c56d0aad71bae33d3ce2835ea1b9b7b GIT binary patch literal 27388 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 widgets = new ArrayList<>(); + +// Add button to widget list +widgets.add(new ButtonWidget(0, anchor, -50, 20, "Apply", 100, 20)); + +// Serialize widgets +screen.add("widgets", WidgetSerialization.toJsonArray(widgets)); +``` + +### Anchor explanation image +![example](.github/images/anchor.png) \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7bf0d84 --- /dev/null +++ b/build.gradle @@ -0,0 +1,14 @@ +plugins { + id 'java' +} + +group 'net.labymod.serverapi.common' +version '1.0.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.code.gson:gson:2.8.6' +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..be52383 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..6b584e7 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'widgets' + diff --git a/src/main/java/net/labymod/serverapi/common/widgets/EnumWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/EnumWidget.java new file mode 100644 index 0000000..8eff4b9 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/EnumWidget.java @@ -0,0 +1,59 @@ +package net.labymod.serverapi.common.widgets; + +import net.labymod.serverapi.common.widgets.components.Widget; +import net.labymod.serverapi.common.widgets.components.widgets.ButtonWidget; +import net.labymod.serverapi.common.widgets.components.widgets.ColorPickerWidget; +import net.labymod.serverapi.common.widgets.components.widgets.ImageWidget; +import net.labymod.serverapi.common.widgets.components.widgets.LabelWidget; +import net.labymod.serverapi.common.widgets.components.widgets.TextFieldWidget; + +/** + * Enum with all widget components + * + * @author LabyStudio + */ +public enum EnumWidget { + BUTTON(ButtonWidget.class), + TEXT_FIELD(TextFieldWidget.class), + LABEL(LabelWidget.class), + COLOR_PICKER(ColorPickerWidget.class), + IMAGE(ImageWidget.class); + + /** + * The class of the widget + */ + private final Class clazz; + + /** + * Create a widget type + * + * @param clazz The class of the widget + */ + EnumWidget(Class clazz) { + this.clazz = clazz; + } + + /** + * Get widget class + * + * @return Widget class + */ + public Class getClazz() { + return this.clazz; + } + + /** + * Get widget type by widget class + * + * @param clazz The class of the widget + * @return The type of the given class. (Can be null) + */ + public static EnumWidget getTypeOf(Class clazz) { + for (EnumWidget type : values()) { + if (type.clazz == clazz) { + return type; + } + } + return null; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/WidgetSerialization.java b/src/main/java/net/labymod/serverapi/common/widgets/WidgetSerialization.java new file mode 100644 index 0000000..ff5067a --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/WidgetSerialization.java @@ -0,0 +1,67 @@ +package net.labymod.serverapi.common.widgets; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.labymod.serverapi.common.widgets.components.Widget; + +import java.util.List; + +/** + * Widget serialization utils. Used to convert the widget model to json and back. + * + * @author LabyStudio + */ +public class WidgetSerialization { + + private static final Gson GSON = new Gson(); + + /** + * Create a widget from a json object + * + * @param object The json serialized widget + * @return Widget instance + */ + public static Widget createWidget(JsonObject object) { + int id = object.get("id").getAsInt(); + JsonObject attributes = object.get("attributes").getAsJsonObject(); + return GSON.fromJson(attributes, EnumWidget.values()[id].getClazz()); + } + + /** + * Serialize a widget model list to a json array + * + * @param widgets Widget model list + * @return Serialized widget model list as json array + */ + public static JsonArray toJsonArray(List widgets) { + JsonArray widgetArray = new JsonArray(); + for (Widget widget : widgets) { + widgetArray.add(toJsonObject(widget)); + } + return widgetArray; + } + + /** + * @param widget + * @return + */ + public static JsonObject toJsonObject(Widget widget) { + EnumWidget type = EnumWidget.getTypeOf(widget.getClass()); + if (type == null) { + return null; + } + + // Get id + int id = type.ordinal(); + + // Convert to json object + JsonObject attributes = GSON.toJsonTree(widget).getAsJsonObject(); + + // Create object + JsonObject object = new JsonObject(); + object.addProperty("id", id); + object.add("attributes", attributes); + return object; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/ContainerWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/ContainerWidget.java new file mode 100644 index 0000000..3d24b4a --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/ContainerWidget.java @@ -0,0 +1,51 @@ +package net.labymod.serverapi.common.widgets.components; + +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Abstract container widget. Used to handle with and height values of a widget. + * + * @author LabyStudio + */ +public abstract class ContainerWidget extends Widget { + + /** + * Container width in pixels + */ + protected int width; + + /** + * Container height in pixels + */ + protected int height; + + /** + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param width The width of the container in pixels + * @param height The height of the container in pixels + */ + public ContainerWidget(int id, Anchor anchor, double offsetX, double offsetY, int width, int height) { + super(id, anchor, offsetX, offsetY); + this.width = width; + this.height = height; + } + + public void setWidth(int width) { + this.width = width; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/ValueContainerWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/ValueContainerWidget.java new file mode 100644 index 0000000..95a9b29 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/ValueContainerWidget.java @@ -0,0 +1,41 @@ +package net.labymod.serverapi.common.widgets.components; + +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Abstract container with a string value to display + * + * @author LabyStudio + */ +public abstract class ValueContainerWidget extends ContainerWidget { + + /** + * The display value of the container + */ + protected String value; + + /** + * Abstract container with a string value + * + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param value The display value of the container + * @param width The width of the container in pixels + * @param height The height of the container in pixels + */ + public ValueContainerWidget(int id, Anchor anchor, double offsetX, double offsetY, String value, int width, int height) { + super(id, anchor, offsetX, offsetY, width, height); + + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/Widget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/Widget.java new file mode 100644 index 0000000..8cb4f08 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/Widget.java @@ -0,0 +1,78 @@ +package net.labymod.serverapi.common.widgets.components; + +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Abstract widget component + * + * @author LabyStudio + */ +public abstract class Widget { + + /** + * The unique widget id to track interactions + */ + protected int id; + + /** + * Anchor orientation position + */ + private Anchor anchor; + + /** + * Anchor x offset position in pixel + */ + private double offsetX; + + /** + * Anchor y offset position in pixel + */ + private double offsetY; + + /** + * Abstract widget + * + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + */ + public Widget(int id, Anchor anchor, double offsetX, double offsetY) { + this.id = id; + this.anchor = anchor; + this.offsetX = offsetX; + this.offsetY = offsetY; + } + + public void setId(int id) { + this.id = id; + } + + public void setAnchor(Anchor anchor) { + this.anchor = anchor; + } + + public void setOffsetX(double offsetX) { + this.offsetX = offsetX; + } + + public void setOffsetY(double offsetY) { + this.offsetY = offsetY; + } + + public int getId() { + return id; + } + + public Anchor getAnchor() { + return anchor; + } + + public double getOffsetX() { + return offsetX; + } + + public double getOffsetY() { + return offsetY; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ButtonWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ButtonWidget.java new file mode 100644 index 0000000..2266bc3 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ButtonWidget.java @@ -0,0 +1,42 @@ +package net.labymod.serverapi.common.widgets.components.widgets; + +import com.google.gson.annotations.SerializedName; +import net.labymod.serverapi.common.widgets.components.ValueContainerWidget; +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Widget to add a button to the screen + * + * @author LabyStudio + */ +public class ButtonWidget extends ValueContainerWidget { + + /** + * Close the screen on an interaction with the button + */ + @SerializedName("close_screen_on_click") + private boolean closeScreenOnClick; + + /** + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param value The display value of the container + * @param width The width of the container in pixels + * @param height The height of the container in pixels + */ + public ButtonWidget(int id, Anchor anchor, double offsetX, double offsetY, String value, int width, int height) { + super(id, anchor, offsetX, offsetY, value, width, height); + + this.value = value; + } + + public void setCloseScreenOnClick(boolean closeScreenOnClick) { + this.closeScreenOnClick = closeScreenOnClick; + } + + public boolean isCloseScreenOnClick() { + return closeScreenOnClick; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ColorPickerWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ColorPickerWidget.java new file mode 100644 index 0000000..edfab17 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ColorPickerWidget.java @@ -0,0 +1,72 @@ +package net.labymod.serverapi.common.widgets.components.widgets; + +import com.google.gson.annotations.SerializedName; +import net.labymod.serverapi.common.widgets.components.ContainerWidget; +import net.labymod.serverapi.common.widgets.util.Anchor; + +import java.awt.Color; + +/** + * Color picker widget to choose a rgb color + * + * @author LabyStudio + */ +public class ColorPickerWidget extends ContainerWidget { + + /** + * The title of the color picker + */ + private String title; + + /** + * The selected color of the color picker + */ + @SerializedName("selected_color") + private Color selectedColor; + + /** + * Allow more than the default 15 minecraft colors + */ + private boolean rgb; + + /** + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param width The width of the container in pixels + * @param height The height of the container in pixels + * @param title The title of the color picker + * @param selectedColor The selected color of the color picker + */ + public ColorPickerWidget(int id, Anchor anchor, double offsetX, double offsetY, int width, int height, String title, Color selectedColor) { + super(id, anchor, offsetX, offsetY, width, height); + + this.title = title; + this.selectedColor = selectedColor; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Color getSelectedColor() { + return selectedColor; + } + + public void setSelectedColor(Color selectedColor) { + this.selectedColor = selectedColor; + } + + public boolean isRgb() { + return rgb; + } + + public void setRgb(boolean rgb) { + this.rgb = rgb; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ImageWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ImageWidget.java new file mode 100644 index 0000000..681abc4 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/ImageWidget.java @@ -0,0 +1,106 @@ +package net.labymod.serverapi.common.widgets.components.widgets; + + +import com.google.gson.annotations.SerializedName; +import net.labymod.serverapi.common.widgets.components.ContainerWidget; +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Widget to render a custom image + * + * @author LabyStudio + */ +public class ImageWidget extends ContainerWidget { + + /** + * Remote url of the image to render + */ + private String url; + + /** + * The left cut value of the image texture (Default 0) + */ + @SerializedName("cut_x") + private int cutX; + + /** + * The top cut value of the image texture (Default 0) + */ + @SerializedName("cut_y") + private int cutY; + + /** + * The right cut value of the image texture (Default 256) + */ + @SerializedName("cut_width") + private int cutWidth = 256; + + /** + * The bottom cut value of the image texture (Default 256) + */ + @SerializedName("cut_height") + private int cutHeight = 256; + + /** + * Create a custom texture to render + * + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param width The width of the container in pixels + * @param height The height of the container in pixels + * @param url Remote url of the image to render + */ + public ImageWidget(int id, Anchor anchor, double offsetX, double offsetY, int width, int height, String url) { + super(id, anchor, offsetX, offsetY, width, height); + this.url = url; + } + + /** + * Cut the image by the given amount on the left and top side + * + * @param x Amount of pixels to cut off on the left side + * @param y Amount of pixels to cut off on the top side + */ + public void setCutXY(int x, int y) { + this.cutX = x; + this.cutY = y; + } + + /** + * Cut the image by the given amount on the right and bottom side. 256 is the entire image. 256 / 2 would cut off the half of the image on the right + * and bottom side. + * + * @param width 0 - 256 image cut scale on the right side + * @param height 0 - 256 image cut scale on the bottom side + */ + public void setCutWithHeight(int width, int height) { + this.cutWidth = width; + this.cutHeight = height; + } + + public int getCutX() { + return cutX; + } + + public int getCutY() { + return cutY; + } + + public int getCutWidth() { + return cutWidth; + } + + public int getCutHeight() { + return cutHeight; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/LabelWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/LabelWidget.java new file mode 100644 index 0000000..fe8d0ea --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/LabelWidget.java @@ -0,0 +1,109 @@ +package net.labymod.serverapi.common.widgets.components.widgets; + + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import net.labymod.serverapi.common.widgets.components.Widget; +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Widget to display a string + * + * @author LabyStudio + */ +public class LabelWidget extends Widget { + + /** + * The string to display + */ + private JsonElement value; + + /** + * String alignment.
- 0: Left alignment
- 1: Center alignment
- 2: Right alignment + */ + private int alignment; + + /** + * The scale of the string. The default scale is 1.0. To make it smaller by half, 0.5 must be specified. + */ + private double scale; + + /** + * Create a label widget to display a string. + * + * @param sourceWidget Widget as anchor and offset source + * @param value The value of the label as string + * @param alignment String alignment (0:LEFT, 1:CENTER, 2:RIGHT) + * @param scale String scale (Default 1.0) + */ + public LabelWidget(Widget sourceWidget, String value, int alignment, double scale) { + this(sourceWidget.getId(), sourceWidget.getAnchor(), sourceWidget.getOffsetX(), sourceWidget.getOffsetY(), value, alignment, scale); + } + + /** + * Create a label widget to display a string. + * + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param value The value of the label (It is possible to change the color of the string by using the ยง character.) + * @param alignment String alignment (0:LEFT, 1:CENTER, 2:RIGHT) + * @param scale String scale (Default 1.0) + */ + public LabelWidget(int id, Anchor anchor, double offsetX, double offsetY, String value, int alignment, double scale) { + this(id, anchor, offsetX, offsetY, new JsonPrimitive(value), alignment, scale); + } + + /** + * Create a label widget to display a string. + * + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param value The value of the label as raw text + * @param alignment String alignment (0:LEFT, 1:CENTER, 2:RIGHT) + * @param scale String scale (Default 1.0) + */ + public LabelWidget(int id, Anchor anchor, double offsetX, double offsetY, JsonElement value, int alignment, double scale) { + super(id, anchor, offsetX, offsetY); + + this.value = value; + this.alignment = alignment; + this.scale = scale; + } + + /** + * Get label value as raw text + * + * @return Serialized raw text label + */ + public JsonElement getValue() { + return value; + } + + public void setValue(JsonElement value) { + this.value = value; + } + + public void setValue(String value) { + this.value = new JsonPrimitive(value); + } + + public void setAlignment(int alignment) { + this.alignment = alignment; + } + + public void setScale(double scale) { + this.scale = scale; + } + + public int getAlignment() { + return alignment; + } + + public double getScale() { + return scale; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/TextFieldWidget.java b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/TextFieldWidget.java new file mode 100644 index 0000000..59177f3 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/components/widgets/TextFieldWidget.java @@ -0,0 +1,74 @@ +package net.labymod.serverapi.common.widgets.components.widgets; + +import com.google.gson.annotations.SerializedName; +import net.labymod.serverapi.common.widgets.components.ValueContainerWidget; +import net.labymod.serverapi.common.widgets.util.Anchor; + +/** + * Text field widget for user text input + * + * @author LabyStudio + */ +public class TextFieldWidget extends ValueContainerWidget { + + /** + * The placeholder that will be displayed when the field is not in focus and the value of the field is empty. + */ + protected String placeholder; + + /** + * The max length of the text field value + */ + @SerializedName("max_length") + protected int maxLength; + + /** + * Focus the text field on load + */ + protected boolean focused; + + /** + * @param id Unique id of the widget + * @param anchor Anchor point for orientation + * @param offsetX X anchor offset in pixel + * @param offsetY Y anchor offset in pixel + * @param value The display value of the container + * @param width The width of the container in pixels + * @param height The height of the container in pixels + * @param placeholder The placeholder that will be displayed when the field is not in focus and the value of the field is empty. + * @param maxLength The max length of the text field value + * @param focused Focus the text field on load + */ + public TextFieldWidget(int id, Anchor anchor, double offsetX, double offsetY, String value, int width, int height, String placeholder, + int maxLength, boolean focused) { + super(id, anchor, offsetX, offsetY, value, width, height); + + this.placeholder = placeholder; + this.maxLength = maxLength; + this.focused = focused; + } + + public void setPlaceholder(String placeholder) { + this.placeholder = placeholder; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + public void setFocused(boolean focused) { + this.focused = focused; + } + + public String getPlaceholder() { + return placeholder; + } + + public int getMaxLength() { + return maxLength; + } + + public boolean isFocused() { + return focused; + } +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/util/Anchor.java b/src/main/java/net/labymod/serverapi/common/widgets/util/Anchor.java new file mode 100644 index 0000000..53b7127 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/util/Anchor.java @@ -0,0 +1,49 @@ +package net.labymod.serverapi.common.widgets.util; + +/** + * Anchor position on the screen for component orientation + * + * @author LabyStudio + */ +public class Anchor { + + /** + * Anchor x position in percent.

Examples:
0% would be on the left side of the screen.
50% is in the middle of the screen. + */ + private final double x; + + /** + * Anchor y position in percent

Examples:
0% would be on the top side of the screen.
50% is in the middle of the screen. + */ + private final double y; + + /** + * Create anchor for orientation + * + * @param x Anchor x percentage (0 - 100) + * @param y Anchor y percentage (0 - 100) + */ + public Anchor(double x, double y) { + this.x = x; + this.y = y; + } + + /** + * Get the anchor x percentage + * + * @return Anchor x percentage + */ + public double getX() { + return x; + } + + /** + * Get the anchor y percentage + * + * @return Anchor y percentage + */ + public double getY() { + return y; + } + +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/util/EnumResponse.java b/src/main/java/net/labymod/serverapi/common/widgets/util/EnumResponse.java new file mode 100644 index 0000000..65f3487 --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/util/EnumResponse.java @@ -0,0 +1,11 @@ +package net.labymod.serverapi.common.widgets.util; + +/** + * Response sent by the client when closing or interacting with the screen. + * + * @author LabyStudio + */ +public enum EnumResponse { + CLOSE, // Type id 0 - Sent when the player closes the GUI + INTERACT // Type id 1 - Sent when the players interact with a widget +} diff --git a/src/main/java/net/labymod/serverapi/common/widgets/util/EnumScreenAction.java b/src/main/java/net/labymod/serverapi/common/widgets/util/EnumScreenAction.java new file mode 100644 index 0000000..1a7d1de --- /dev/null +++ b/src/main/java/net/labymod/serverapi/common/widgets/util/EnumScreenAction.java @@ -0,0 +1,12 @@ +package net.labymod.serverapi.common.widgets.util; + +/** + * Screen action sent by the server to tell the client what to do with the provided widgets. + * + * @author LabyStudio + */ +public enum EnumScreenAction { + OPEN, // Action id 0 - Open a new screen + UPDATE, // Action id 1 - Update the current screen + CLOSE // Action id 2 - Force close the current screen and display the previous screen of the user +}