From 48653ec89538f1650106a5e77463412cad4684c2 Mon Sep 17 00:00:00 2001 From: Soopyboo32 <49228220+Soopyboo32@users.noreply.github.com> Date: Sun, 31 Oct 2021 09:49:42 +0800 Subject: first commit --- features/settings/settingThings/button.js | 18 ++ features/settings/settingThings/location.js | 332 +++++++++++++++++++++++++ features/settings/settingThings/settingBase.js | 106 ++++++++ features/settings/settingThings/textSetting.js | 33 +++ features/settings/settingThings/toggle.js | 58 +++++ 5 files changed, 547 insertions(+) create mode 100644 features/settings/settingThings/button.js create mode 100644 features/settings/settingThings/location.js create mode 100644 features/settings/settingThings/settingBase.js create mode 100644 features/settings/settingThings/textSetting.js create mode 100644 features/settings/settingThings/toggle.js (limited to 'features/settings/settingThings') diff --git a/features/settings/settingThings/button.js b/features/settings/settingThings/button.js new file mode 100644 index 0000000..77ba4b8 --- /dev/null +++ b/features/settings/settingThings/button.js @@ -0,0 +1,18 @@ +import SoopyMouseClickEvent from "../../../../guimanager/EventListener/SoopyMouseClickEvent"; +import ButtonWithArrow from "../../../../guimanager/GuiElement/ButtonWithArrow"; +import SettingBase from "./settingBase"; + +class ButtonSetting extends SettingBase { + constructor(name, description, settingId, module, buttonText, buttonFunction, defaultValue=null){ + super(name, description, defaultValue, settingId, module) + + this.buttonObject = new ButtonWithArrow().setLocation(0, 0.3, 0.8, 0.4).setText("§0"+buttonText) + this.settingObject.addChild(this.buttonObject) + + this.buttonObject.addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + buttonFunction.call(this) + })) + } +} + +export default ButtonSetting \ No newline at end of file diff --git a/features/settings/settingThings/location.js b/features/settings/settingThings/location.js new file mode 100644 index 0000000..69d1a43 --- /dev/null +++ b/features/settings/settingThings/location.js @@ -0,0 +1,332 @@ +import { SoopyGui } from "../../../../guimanager" +import SoopyBoxElement from "../../../../guimanager/GuiElement/SoopyBoxElement" +import SoopyTextElement from "../../../../guimanager/GuiElement/SoopyTextElement" +import ButtonSetting from "./button" +import BoxWithText from "../../../../guimanager/GuiElement/BoxWithText" +import ButtonWithArrow from "../../../../guimanager/GuiElement/ButtonWithArrow" +import SoopyMouseClickEvent from "../../../../guimanager/EventListener/SoopyMouseClickEvent" +import NumberTextBox from "../../../../guimanager/GuiElement/NumberTextBox" +import SoopyContentChangeEvent from "../../../../guimanager/EventListener/SoopyContentChangeEvent" + +let allLocations = [] + +class LocationSetting extends ButtonSetting { + constructor(name, description, settingId, module, defaultLocation){ + super(name, description, settingId, module, "Edit Position", this.editPosition, defaultLocation) + + this.x = this.getValue()[0] + this.y = this.getValue()[1] + this.scale = this.getValue()[2] + this.shadowType = this.getValue()[3] //0-none, 1-vanilla, 2-border + + this.editTempTextV = undefined + + this.dragging = false + this.dragOffset = [0, 0] + this.resisizing = false + this.resizePoint = 0 + this.resizeInitialPos=[0, 0, 0, 0, 0, 0] + + this.parent = undefined + + this.soopyGui = new SoopyGui() + this.soopyGui._renderBackground = ()=>{} //remove background darkening + + this.elmSettings = new SoopyBoxElement().setLocation(0, 0, 0.25, 0.25) + + let scaleText = new SoopyTextElement().setText("&0Scale: ").setLocation(3, 0.025, 1, 0.15) + scaleText.location.location.setRelative(false, true) + scaleText.centeredX = false + this.elmSettings.addChild(scaleText) + + this.scaleInput = new NumberTextBox().setText(this.scale.toFixed(2)).setLocation(Renderer.getStringWidth("Scale: ")+3, 0.025, -(Renderer.getStringWidth("Scale: ")+6), 0.15) + this.scaleInput.location.location.setRelative(false, true) + this.scaleInput.location.size.setRelative(false, true) + this.elmSettings.addChild(this.scaleInput) + this.scaleInput.text.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + try{ + newVal = parseFloat(newVal) + if(!isNaN(newVal)){ + this.scale = newVal + this._updateValue() + } + }catch(e){} + })) + this.lastScaleRender = this.scale.toFixed(2) + + let xText = new SoopyTextElement().setText("&0X: ").setLocation(3, 0.225, 1, 0.15) + xText.location.location.setRelative(false, true) + xText.centeredX = false + this.elmSettings.addChild(xText) + this.xInput = new NumberTextBox().setText(this.x.toFixed(0)).setLocation(Renderer.getStringWidth("X: ")+3, 0.225, -(Renderer.getStringWidth("X: ")+6), 0.15) + this.xInput.location.location.setRelative(false, true) + this.xInput.location.size.setRelative(false, true) + this.elmSettings.addChild(this.xInput) + this.xInput.text.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + try{ + newVal = parseFloat(newVal) + if(!isNaN(newVal)){ + this.x = newVal + this._updateValue() + } + }catch(e){} + })) + this.lastXRender = this.x.toFixed(0) + + let yText = new SoopyTextElement().setText("&0Y: ").setLocation(3, 0.425, 1, 0.15) + yText.location.location.setRelative(false, true) + yText.centeredX = false + this.elmSettings.addChild(yText) + this.yInput = new NumberTextBox().setText(this.y.toFixed(0)).setLocation(Renderer.getStringWidth("Y: ")+3, 0.425, -(Renderer.getStringWidth("Y: ")+6), 0.15) + this.yInput.location.location.setRelative(false, true) + this.yInput.location.size.setRelative(false, true) + this.elmSettings.addChild(this.yInput) + this.yInput.text.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + try{ + newVal = parseFloat(newVal) + if(!isNaN(newVal)){ + this.y = newVal + this._updateValue() + } + }catch(e){} + })) + this.lastYRender = this.y.toFixed(0) + + this.soopyGui.element.addChild(this.elmSettings) + + let button = new ButtonWithArrow().setText("&0Reset").setLocation(0.125, 0.625, 0.75, 0.15) + button.addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + this.x = defaultLocation[0] + this.y = defaultLocation[1] + this.scale = defaultLocation[2] + this.shadowType = defaultLocation[3] + })) + this.elmSettings.addChild(button) + + let button2 = new ButtonWithArrow().setText("&0Back").setLocation(0.125, 0.825, 0.75, 0.15) + button2.addEvent(new SoopyMouseClickEvent().setHandler(()=>{ + this.soopyGui.close() + this.guiObject.main.ctGui.open() + })) + this.elmSettings.addChild(button2) + + this.editGui = this.soopyGui.ctGui + + this.editGui.registerDraw((mouseX, mouseY, partialTicks)=>{ + this.renderGui(mouseX, mouseY) + this.soopyGui._render(mouseX, mouseY, partialTicks) + }) + this.editGui.registerClicked((mouseX, mouseY, button)=>{ + this.clicked(mouseX, mouseY) + this.soopyGui._onClick(mouseX, mouseY, button) + }) + this.editGui.registerMouseReleased((mouseX, mouseY)=>{ + this.released(mouseX, mouseY) + }) + + allLocations.push(this) + } + + requires(toggleSetting){ + this.requiresO = toggleSetting + + toggleSetting.toggleObject.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + if(newVal){ + this.guiObject.location.size.y.set(0.2, 500) + }else{ + this.guiObject.location.size.y.set(0, 500) + } + })) + let newVal = this.requiresO.getValue() + if(!newVal){ + this.guiObject.location.size.y.set(0, 0) + } + + return this + } + + _updateValue(){ + this.setValue([this.x, this.y, this.scale, this.shadowType]) + } + + editTempText(text){ + this.editTempTextV = text + return this; + } + + setParent(parent){ + this.parent = parent + } + + editPosition(){ + this.guiObject.main.ctGui.close() + + this.soopyGui.open() + } + + clicked(mouseX, mouseY){ + let width = this.getWidth() + let height = 9*this.parent.getText()[0].length + + let locations = [[this.x, this.y], [this.x+width*this.scale, this.y], [this.x, this.y+height*this.scale], [this.x+width*this.scale, this.y+height*this.scale]] + + locations.forEach((loc, i)=>{ + if(mouseX >= loc[0]-1*Math.max(1, this.scale) && mouseX <= loc[0]+1*Math.max(1, this.scale) + && mouseY >= loc[1]-1*Math.max(1, this.scale) && mouseY <= loc[1]+1*Math.max(1, this.scale)){ + this.resisizing= true + this.resizePoint = i + this.resizeInitialPos = [mouseX, mouseY, this.x, this.y, width*this.scale, height*this.scale] + } + }) + if(this.resisizing) return; + + if(mouseX > this.x && mouseX < this.x+width*this.scale + && mouseY>this.y && mouseYRenderer.getStringWidth(ChatLib.removeFormatting(a))))) + } + + updateLocation(mouseX, mouseY, drawCollidingBox){ + let width = this.getWidth() + let height = 9*this.parent.getText()[0].length + + if(this.dragging){ + this.x = mouseX+this.dragOffset[0] + this.y = mouseY+this.dragOffset[1] + + let snapPoints = [] + allLocations.forEach(loc=>{ + if(loc === this) return; + snapPoints.push([loc.x, loc.y]) + snapPoints.push([loc.x+loc.getWidth()*loc.scale, loc.y]) + snapPoints.push([loc.x+loc.getWidth()*loc.scale, loc.y+height*loc.scale]) + snapPoints.push([loc.x, loc.y+height*loc.scale]) + }) + + snapPoints.forEach(point=>{ + //top left + if(Math.abs(this.x-point[0]) < 5 && Math.abs(this.y-point[1]) < 5){ + this.x = point[0] + this.y = point[1] + } + + //top right + if(Math.abs(this.x+width*this.scale-point[0]) < 5 && Math.abs(this.y-point[1]) < 5){ + this.x = point[0]-width*this.scale + this.y = point[1] + } + + //bottom left + if(Math.abs(this.x-point[0]) < 5 && Math.abs(this.y+height*this.scale-point[1]) < 5){ + this.x = point[0] + this.y = point[1]-height*this.scale + } + + //bottom right + if(Math.abs(this.x+width*this.scale-point[0]) < 5 && Math.abs(this.y+height*this.scale-point[1]) < 5){ + this.x = point[0]-width*this.scale + this.y = point[1]-height*this.scale + } + }) + } + if(this.resisizing){ + if(this.resizePoint === 3){ + this.scale=(mouseX-this.x)/width + this.scale = Math.max(0.25, this.scale) + } + if(this.resizePoint === 1){ + + let [oMouseX, oMouseY, oX, oY, ow, oh] = this.resizeInitialPos + + this.scale=(mouseX-this.x)/width + this.scale = Math.max(0.25, this.scale) + this.y=oY+oh-height*this.scale + } + if(this.resizePoint===0){ + let [oMouseX, oMouseY, oX, oY, ow, oh] = this.resizeInitialPos + + this.scale=(oX+ow-mouseX)/width + this.scale = Math.max(0.25, this.scale) + this.x=oX+ow-width*this.scale + this.y=oY+oh-height*this.scale + } + if(this.resizePoint === 2){ + let [oMouseX, oMouseY, oX, oY, ow, oh] = this.resizeInitialPos + + this.scale=(oX+ow-mouseX)/width + this.scale = Math.max(0.25, this.scale) + this.x=oX+ow-width*this.scale + } + } + } + + renderGui(mouseX, mouseY){ + + if(this.parent){ + this.parent.editTempTextV = this.editTempTextV + this.parent.editTempTimeV = Date.now() + + this.parent.tempDisableTime = Date.now() + this.parent.renderRaw() + } + + let width = this.getWidth() + let height = 9*this.parent.getText()[0].length + + this.updateLocation(mouseX, mouseY, true) + + this.renderBox(true) + + if(this.x+width*this.scale/2 > Renderer.screen.getWidth()/2){ + this.elmSettings.location.location.x.set(Math.min(Math.max(this.x/Renderer.screen.getWidth()-0.25-0.03, 0.02), 0.73)) + }else{ + this.elmSettings.location.location.x.set(Math.min(Math.max((this.x+width*this.scale)/Renderer.screen.getWidth()+0.03, 0.02), 0.73)) + } + this.elmSettings.location.location.y.set(Math.min(Math.max((this.y+height*this.scale/2)/Renderer.screen.getHeight() - this.elmSettings.location.size.y.get()/2, 0.02), 0.73)) + + + if(this.lastScaleRender !== this.scale.toFixed(2) && !this.scaleInput.text.selected){ + this.lastScaleRender = this.scale.toFixed(2) + this.scaleInput.setText(this.scale.toFixed(2)) + } + if(this.lastXRender !== this.x.toFixed(0) && !this.xInput.text.selected){ + this.lastXRender = this.x.toFixed(0) + this.xInput.setText(this.x.toFixed(0)) + } + if(this.lastYRender !== this.y.toFixed(0) && !this.yInput.text.selected){ + this.lastYRender = this.y.toFixed(0) + this.yInput.setText(this.y.toFixed(0)) + } + } + + renderBox(drawHandles){ + let width = this.getWidth() + let height = 9*this.parent.getText()[0].length + + Renderer.drawRect(Renderer.color(255, 255, 255), this.x, this.y, width*this.scale, 1) + Renderer.drawRect(Renderer.color(255, 255, 255), this.x, this.y, 1, height*this.scale) + Renderer.drawRect(Renderer.color(255, 255, 255), this.x, this.y+height*this.scale, width*this.scale, 1) + Renderer.drawRect(Renderer.color(255, 255, 255), this.x+width*this.scale, this.y, 1, height*this.scale) + + if(drawHandles){ + Renderer.drawRect(Renderer.color(255, 255, 255), this.x-1*Math.max(1, this.scale)+width*this.scale, this.y-1*Math.max(1, this.scale), 2*Math.max(1, this.scale)+1, 2*Math.max(1, this.scale)+1) + Renderer.drawRect(Renderer.color(255, 255, 255), this.x-1*Math.max(1, this.scale), this.y-1*Math.max(1, this.scale)+height*this.scale, 2*Math.max(1, this.scale)+1, 2*Math.max(1, this.scale)+1) + Renderer.drawRect(Renderer.color(255, 255, 255), this.x-1*Math.max(1, this.scale)+width*this.scale, this.y-1*Math.max(1, this.scale)+height*this.scale, 2*Math.max(1, this.scale)+1, 2*Math.max(1, this.scale)+1) + Renderer.drawRect(Renderer.color(255, 255, 255), this.x-1*Math.max(1, this.scale), this.y-1*Math.max(1, this.scale), 2*Math.max(1, this.scale)+1, 2*Math.max(1, this.scale)+1) + } + } +} + +export default LocationSetting \ No newline at end of file diff --git a/features/settings/settingThings/settingBase.js b/features/settings/settingThings/settingBase.js new file mode 100644 index 0000000..fbee5bf --- /dev/null +++ b/features/settings/settingThings/settingBase.js @@ -0,0 +1,106 @@ +import SoopyContentChangeEvent from "../../../../guimanager/EventListener/SoopyContentChangeEvent"; +import BoxWithTextAndDescription from "../../../../guimanager/GuiElement/BoxWithTextAndDescription" +import SoopyGuiElement from "../../../../guimanager/GuiElement/SoopyGuiElement"; +import settingsCommunicator from "../settingsCommunicator"; + +class SettingBase { + constructor(name, description, defaultVal, settingId, module){ + this.name = name; + this.description = description; + this.defaultVal = defaultVal; + this.settingId = settingId + this.module = module + this.moduleId = module.getId() + + this.val = defaultVal; + + this.guiObject = new BoxWithTextAndDescription().setDesc("§0"+this.description).setText("§0"+this.name).setLocation(0, 0, 1, 0.175) + + this.settingObject = new SoopyGuiElement().setLocation(0.8, 0, 0.2, 1) + + this.guiObject.addChild(this.settingObject) + + settingsCommunicator.addSetting(this.moduleId, settingId, this.getGuiObject()) + + if(!module.FeatureManager.featureSettingsData[this.moduleId]){ + module.FeatureManager.featureSettingsData[this.moduleId] = {} + } + if(!module.FeatureManager.featureSettingsData[this.moduleId].subSettings)module.FeatureManager.featureSettingsData[this.moduleId].subSettings = {} + if(!module.FeatureManager.featureSettingsData[this.moduleId].subSettings[settingId]){ + module.FeatureManager.featureSettingsData[this.moduleId].subSettings[settingId] = { + value: this.getDefaultValue(), + temp_val: this.getDefaultValue() + } + + module.FeatureManager.featureSettingsDataLastUpdated = true + } + let temp_val_temp =module.FeatureManager.featureSettingsData[this.moduleId].subSettings[settingId].temp_val + this.setValue(module.FeatureManager.featureSettingsData[this.moduleId].subSettings[settingId].value) + this.temp_val = temp_val_temp + + this.requiresO = undefined + } + + getValue(){ + return this.val; + } + + setValue(val){ + this.val = val; + + if(!this.requiresO || this.requiresO.getValue()){ + this.temp_val = val + } + + if(this.module.FeatureManager.featureSettingsData[this.moduleId].subSettings[this.settingId].value !== val){ + this.module.FeatureManager.featureSettingsData[this.moduleId].subSettings[this.settingId].value = val + + this.module.FeatureManager.featureSettingsDataLastUpdated = true + } + if(this.module.FeatureManager.featureSettingsData[this.moduleId].subSettings[this.settingId].temp_val !== this.temp_val){ + this.module.FeatureManager.featureSettingsData[this.moduleId].subSettings[this.settingId].temp_val = this.temp_val + + this.module.FeatureManager.featureSettingsDataLastUpdated = true + } + } + + getName(){ + return this.name; + } + + getDescription(){ + return this.description; + } + + getDefaultValue(){ + return this.defaultVal; + } + + getGuiObject(){ + return this.guiObject; + } + + requires(toggleSetting){ + this.requiresO = toggleSetting + + toggleSetting.toggleObject.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + if(newVal){ + this.guiObject.location.size.y.set(0.2, 500) + }else{ + this.guiObject.location.size.y.set(0, 500) + } + })) + let newVal = this.requiresO.getValue() + if(!newVal){ + this.guiObject.location.size.y.set(0, 0) + } + + return this + } + + delete(){ + settingsCommunicator.removeSetting(this.module, this.settingId) + } +} + +export default SettingBase \ No newline at end of file diff --git a/features/settings/settingThings/textSetting.js b/features/settings/settingThings/textSetting.js new file mode 100644 index 0000000..4960461 --- /dev/null +++ b/features/settings/settingThings/textSetting.js @@ -0,0 +1,33 @@ + +import SoopyContentChangeEvent from "../../../../guimanager/EventListener/SoopyContentChangeEvent"; +import TextBox from "../../../../guimanager/GuiElement/TextBox"; +import PasswordInput from "../../../../guimanager/GuiElement/PasswordInput" +import SettingBase from "./settingBase"; + +class TextSetting extends SettingBase { + constructor(name, description, defaultVal, settingId, module, placeholder, isSecret){ + super(name, description, defaultVal, settingId, module) + + this.textObject = (isSecret?new PasswordInput():new TextBox()).setLocation(0, 0.2, 0.9, 0.6).setText(this.getValue()).setPlaceholder(placeholder) + this.settingObject.addChild(this.textObject) + + this.settingObject.setLocation(0.6, 0, 0.4, 1) + this.guiObject.text.setLocation(0, 0, 0.6, 0.6) + this.guiObject.description.setLocation(0, 0.6, 0.55, 0.4) + + this.textObject.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + this.setValue(newVal) + })) + + } + + setValue(newVal){ + super.setValue(newVal) + + this.textObject.setText(newVal) + + return this + } +} + +export default TextSetting \ No newline at end of file diff --git a/features/settings/settingThings/toggle.js b/features/settings/settingThings/toggle.js new file mode 100644 index 0000000..d839b8f --- /dev/null +++ b/features/settings/settingThings/toggle.js @@ -0,0 +1,58 @@ +import Enum from "../../../../guimanager/Enum"; +import SoopyContentChangeEvent from "../../../../guimanager/EventListener/SoopyContentChangeEvent"; +import Toggle from "../../../../guimanager/GuiElement/Toggle"; +import SettingBase from "./settingBase"; + +class ToggleSetting extends SettingBase { + constructor(name, description, defaultVal, settingId, module){ + super(name, description, defaultVal, settingId, module) + + this.toggleObject = new Toggle().setLocation(0, 0.3, 0.8, 0.4).setValue(this.getValue()) + this.settingObject.addChild(this.toggleObject) + + this.toggleObject.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + this.setValue(newVal) + })) + + } + + setValue(newVal){ + super.setValue(newVal) + + this.toggleObject.setValue(newVal) + + return this + } + + requires(toggleSetting){ + this.requiresO = toggleSetting + + toggleSetting.toggleObject.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + if(newVal){ + this.setValue(this.temp_val) + + this.toggleObject.triggerEvent(Enum.EVENT.CONTENT_CHANGE, [this.temp_val, false, ()=>{}]) + + this.guiObject.location.size.y.set(0.2, 500) + }else{ + this.temp_val = this.getValue() + this.setValue(false) + + this.toggleObject.triggerEvent(Enum.EVENT.CONTENT_CHANGE, [false, this.temp_val, ()=>{}]) + + this.guiObject.location.size.y.set(0, 500) + } + })) + let newVal = this.requiresO.getValue() + if(!newVal){ + let temp_val = this.temp_val + this.setValue(false) + this.temp_val = temp_val + this.guiObject.location.size.y.set(0, 0) + } + + return this + } +} + +export default ToggleSetting \ No newline at end of file -- cgit