///
///
import Feature from "../../featureClass/class";
import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement";
import BoxWithToggleAndDescription from "../../../guimanager/GuiElement/BoxWithToggleAndDescription";
import ButtonWithArrowAndDescription from "../../../guimanager/GuiElement/ButtonWithArrowAndDescription";
import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
import SoopyContentChangeEvent from "../../../guimanager/EventListener/SoopyContentChangeEvent";
import settingsCommunicator from "./settingsCommunicator";
import GuiPage from "../soopyGui/GuiPage"
import { SoopyGui, SoopyRenderEvent } from "../../../guimanager";
import TextBox from "../../../guimanager/GuiElement/TextBox";
import locationSettingHolder from "./locationSettingHolder";
class SettingsRenderer extends Feature {
constructor() {
super()
}
onEnable() {
this.SettingPage = new SettingPage()
this.EditLocationsPage = new EditLocationsPage()
this.SettingPage.FeatureManager = this.FeatureManager
this.registerStep(true, 1, () => {
if (!this.EditLocationsPage) return
if (this.EditLocationsPage.needsExitPage) {
this.EditLocationsPage.goToPage(0, 500)
this.EditLocationsPage.needsExitPage = false
}
})
this.registerCommand("soopytogglesetting", (category, setting) => {
settingsCommunicator.settings?.[category]?.[setting]?.setValue(!settingsCommunicator.settings?.[category]?.[setting]?.getValue())
})
}
onDisable() {
this.EditLocationsPage = undefined
this.SettingPage = undefined
}
}
class EditLocationsPage extends GuiPage {
constructor() {
super(9)
this.name = "Edit GUI Locations"
this.needsExitPage = false
this.soopyGui = new SoopyGui()
this.soopyGui._renderBackground = () => { } //remove background darkening
this.soopyGui.ctGui.registerDraw((mouseX, mouseY, partialTicks) => {
this.renderGui(mouseX, mouseY)
this.soopyGui._render(mouseX, mouseY, partialTicks)
})
this.soopyGui.ctGui.registerClicked((mouseX, mouseY, button) => {
this.clicked(mouseX, mouseY)
this.soopyGui._onClick(mouseX, mouseY, button)
})
this.soopyGui.ctGui.registerMouseReleased((mouseX, mouseY) => {
this.released(mouseX, mouseY)
})
this.finaliseLoading()
}
renderGui(mouseX, mouseY) {
for (let setting of locationSettingHolder.getData()) {
if (setting.parent) {
if (setting.parent.isEnabled()) {
setting.renderGui(mouseX, mouseY)
}
} else {
setting.renderGui(mouseX, mouseY)
}
}
}
clicked(mouseX, mouseY) {
for (let setting of locationSettingHolder.getData()) {
if (setting.clicked(mouseX, mouseY)) return //dont allow the user to drag 2 locations at once
}
}
released(mouseX, mouseY) {
for (let setting of locationSettingHolder.getData()) {
setting.released(mouseX, mouseY)
}
}
onOpen() {
this.needsExitPage = true
this.soopyGui.open()
}
}
class SettingPage extends GuiPage {
constructor() {
super(10)
this.name = "Settings"
this.pages = [this.newPage(), this.newPage()]
this.settingsCategoryArea = undefined
this.settingsTitle = undefined
this.settingsArea = undefined
this.modifyingFeature = false
this.featureLoadedTextBox = undefined
this.SettingPage = undefined
this.pages[0].addEvent(new SoopyRenderEvent().setHandler(() => { this.updateLocs() }))
//###############################################################################################
// Settings Category Page
//###############################################################################################
let settingsCategoryTitle = new SoopyTextElement().setText("ยง0Settings").setMaxTextScale(3).setLocation(0.1, 0.05, 0.5, 0.1)
this.pages[0].addChild(settingsCategoryTitle)
this.settingsCategorySearch = new TextBox().setPlaceholder("Search...").setLocation(0.6, 0.05, 0.3, 0.1)
this.pages[0].addChild(this.settingsCategorySearch)
this.settingsCategorySearch.text.addEvent(new SoopyContentChangeEvent().setHandler(() => {
this.updateSettingCategories()
}))
this.settingsCategoryArea = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true)
this.pages[0].addChild(this.settingsCategoryArea)
//###############################################################################################
// Settings Page
//###############################################################################################
this.settingsTitle = new SoopyTextElement().setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
this.pages[1].addChild(this.settingsTitle)
this.settingsArea = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true)
this.pages[1].addChild(this.settingsArea)
this.finaliseLoading()
}
onOpen() {
this.updateSettingCategories()
this.settingsCategoryArea.location.scroll.x.set(0, 0)
this.settingsCategoryArea.location.scroll.y.set(0, 0)
this.settingsCategoryArea._scrollAmount = 0
this.settingsCategorySearch.setText("")
this.updateSettingCategories()
}
onOpenPage(p) {
if (p === 1) this.updateSettingCategories()
this.closeSidebarPage()
}
updateSettingCategories() {
let search = this.settingsCategorySearch.text.text
this.settingsCategoryArea.children = []
let height = 0
Object.keys(this.FeatureManager.featureMetas).sort((a, b) => { return a.sortA - b.sortA }).forEach((f) => {
let meta = this.FeatureManager.featureMetas[f]
let showing = search.length === 0
if (!showing) {
showing = meta.name.toLowerCase().includes(search.toLowerCase()) || meta.description.toLowerCase().includes(search.toLowerCase())
}
if (!showing) {
settingsCommunicator.getModuleSettings(f).forEach(setting => {
if (setting && (setting.name.toLowerCase().includes(search.toLowerCase()) || setting.description.toLowerCase().includes(search.toLowerCase()))) {
showing = true
}
})
}
if (!showing) return
let isHidden = meta.isHidden
if (typeof isHidden === "string") {
isHidden = require("../" + f + "/" + isHidden).hidden(this.FeatureManager)
}
if (isHidden) return
let category = new ButtonWithArrowAndDescription().setText("&0" + meta.name).setDesc("&0" + meta.description).setLocation(0, height, 1, 0.2)
category.addEvent(new SoopyMouseClickEvent().setHandler(() => { this.clickedOpenCategory(f) }))
this.settingsCategoryArea.addChild(category)
height += 0.225
if (search.length > 0) {
settingsCommunicator.getModuleSettings(f).forEach(setting => {
if (setting && (setting.name.toLowerCase().includes(search.toLowerCase()) || setting.description.toLowerCase().includes(search.toLowerCase()))) {
setting.getGuiObject().location.location.y.set(height, 0)
this.settingsCategoryArea.addChild(setting.getGuiObject())
height += 0.025 + setting.getGuiObject().location.size.y.get()
setting.update()
}
})
}
})
// this.FeatureManager.features = {}; enabled features
}
updateSettings(category) {
let meta = this.FeatureManager.featureMetas[category]
this.settingsArea.children = []
this.settingsTitle.setText("&0" + this.FeatureManager.featureMetas[category].name)
let height = 0
if (meta.isTogglable) {
let toggle = new BoxWithToggleAndDescription().setLocation(0, height, 1, 0.2).setText("&0Main toggle").setDesc("&0This is the main toggle for the whole category")
this.settingsArea.addChild(toggle)
toggle.toggle.setValue(this.FeatureManager.isFeatureLoaded(category), 0)
toggle.toggle.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun) => {
//dont allow editing if currenately loading/unloading it
if (this.modifyingFeature) {
resetFun()
return
}
//toggle the feature
this.modifyingFeature = true
this.FeatureManager.featureSettingsData[category].enabled = newVal
this.FeatureManager.featureSettingsDataLastUpdated = true
if (!newVal && this.FeatureManager.isFeatureLoaded(category)) {
this.FeatureManager.unloadFeature(category)
}
if (newVal && !this.FeatureManager.isFeatureLoaded(category)) {
this.FeatureManager.loadFeature(category)
}
this.modifyingFeature = false
this.updateSettings(category)
}))
height += toggle.location.size.y.get() + 0.045
}
if (!this.FeatureManager.isFeatureLoaded(category)) {
//only show if feature issnt loaded
let textBox = new SoopyBoxElement().setLocation(0, height, 1, 0.2)
.addChild(new SoopyTextElement().setText("&0Feature not loaded").setLocation(0, 0, 1, 0.5))
.addChild(new SoopyTextElement().setText("&0Load feature to access settings").setLocation(0, 0.5, 1, 0.5))
this.settingsArea.addChild(textBox)
return;
}
settingsCommunicator.getModuleSettings(category).forEach(setting => {
setting.getGuiObject().location.location.y.set(height, 0)
this.settingsArea.addChild(setting.getGuiObject())
height += 0.045 + setting.getGuiObject().location.size.y.get()
setting.update()
})
}
updateLocs() {
let totalHeight = 0
this.settingsArea.children.forEach(e => {
e.location.location.y.set(totalHeight, 0)
totalHeight += e.location.size.y.get() + Math.min(0.045, e.location.size.y.get())
})
totalHeight = 0
this.settingsCategoryArea.children.forEach(e => {
e.location.location.y.set(totalHeight, 0)
totalHeight += e.location.size.y.get() + Math.min(0.025, e.location.size.y.get())
})
}
clickedOpenCategory(category) {
this.updateSettings(category)
this.goToPage(2)
this.settingsArea.location.scroll.x.set(0, 0)
this.settingsArea.location.scroll.y.set(0, 0)
this.settingsArea._scrollAmount = 0
}
}
module.exports = {
class: new SettingsRenderer()
}