///
///
import Feature from "../../featureClass/class";
import * as GuiManager from "../../../guimanager/index.js"
import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement";
import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement";
import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement";
import TextWithArrow from "../../../guimanager/GuiElement/TextWithArrow";
import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow";
import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent";
import SoopyOpenGuiEvent from "../../../guimanager/EventListener/SoopyOpenGuiEvent";
class SoopyGui extends Feature {
constructor() {
super()
this.gui = undefined
this.pages = []
this.currentPage = 0
this.backButton = undefined
this.categoryPage = undefined
this.currCategory = undefined
this.activePages = []
this.lastClickedOpen = undefined
}
onEnable(){
this.gui = new GuiManager.SoopyGui()
// this.gui.isDebugEnabled = true
this.registerCommand("soopyv2", this.openCommand)
this.mainWindowElement = new SoopyBoxElement().setLocation(0.25, 0.2, 0.5, 0.6)
this.mainWindowElement.addEvent(new SoopyOpenGuiEvent().setHandler(()=>{this.goToPageNum(0, false)}))
//###############################################################################################
// Category Page
//###############################################################################################
this.categoryPage = new SoopyGuiElement().setLocation(0, 0, 1, 1)
let title = new SoopyTextElement().setText("§0Soopy Addons!").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1)
this.categoryPage.addChild(title)
this.buttonListElm = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true)
this.categoryPage.addChild(this.buttonListElm)
//###############################################################################################
// Back button for all second pages
//###############################################################################################
this.backButton = new TextWithArrow().setText("§0Back").setLocation(0.01, -0.2, 0.1, 0.1).setDirectionRight(false)
let backButtonEvent = new SoopyMouseClickEvent().setHandler(()=>{this.clickedBackButton()})
this.backButton.addEvent(backButtonEvent)
this.mainWindowElement.addChild(this.categoryPage)
this.mainWindowElement.addChild(this.backButton)
this.sidebarPage = new SoopyBoxElement().setLocation(0.3, 0.2, 0.3, 0.6)
// this.sidebarPage.visable = false
this.gui.element.addChild(this.sidebarPage)
this.gui.element.addChild(this.mainWindowElement)
this.updateButtons()
}
openCommand(page){
this.gui.open()
if(page){
this.pages.forEach(p=>{
if(p.name.toLowerCase() === page.toLowerCase()){
this.clickedOpen(p)
}
})
}
}
addCategory(category){
this.pages.push(category)
this.sortPages()
this.updateButtons()
}
updateButtons(){
if(!this.buttonListElm) return;
this.buttonListElm.children = []
this.pages.forEach((p, i)=>{
let settingsButton = new ButtonWithArrow().setText("§0" + p.name).setLocation(0, 0.25*i, 1, 0.2)
settingsButton.addEvent(new SoopyMouseClickEvent().setHandler(()=>{this.clickedOpen(p)}))
this.buttonListElm.addChild(settingsButton)
})
}
clickedOpen(category){
if(!this.lastClickedOpen)this.lastClickedOpen = 0
if(Date.now()-this.lastClickedOpen < 100) return //Stopping infinite loop where button getting reset causes click event to get fired again
this.lastClickedOpen = Date.now()
let theParent = this.mainWindowElement.innerObjectPaddingThing || this.mainWindowElement
theParent.children = []
this.mainWindowElement.addChild(this.categoryPage)
this.mainWindowElement.addChild(this.backButton)
this.activePages = category.pages
Object.values(this.activePages).forEach(p=>{
this.mainWindowElement.addChild(p)
})
this.goToPageNum(1, true)
category.onOpen()
}
sortPages(){
this.pages = this.pages.sort((a, b)=>{
return b.priority - a.priority
})
}
onDisable(){
this.gui.delete()
this.gui = undefined
this.pages = []
this.currentPage = 0
this.backButton = undefined
this.activePages = []
this.currCategory = undefined
this.lastClickedOpen = undefined
}
clickedBackButton(){
this.goToPageNum(this.currentPage-1)
}
goToPage(page, animate=true){
let pageNum = page._soopyAddonsPageId
if(pageNum == this.currentPage){
return
}
this.currentPage = pageNum
this.pages.forEach((p)=>{
Object.values(p.pages).forEach((e, i)=>{
e.location.location.x.set(i-pageNum+1, animate?1000:0)
})
})
this.categoryPage.location.location.x.set(-pageNum, animate?1000:0)
this.backButton.location.location.y.set(pageNum === 0?-0.2:0, animate?1000:0)
}
goToPageNum(pageNum, animate=true){
if(pageNum<0) return;
this.currentPage = pageNum
if(pageNum===0){
this.currCategory = undefined
this.closeSidebarPage()
}
this.pages.forEach((p)=>{
Object.values(p.pages).forEach((e, i)=>{
e.location.location.x.set(i-pageNum+1, animate?1000:0)
})
})
this.categoryPage.location.location.x.set(-pageNum, animate?1000:0)
this.backButton.location.location.y.set(pageNum === 0?-0.2:0, animate?1000:0)
}
openSidebarPage(child){
this.sidebarPage.location.location.x.set(0.625, 500)
this.mainWindowElement.location.location.x.set(0.075, 500)
// this.sidebarPage.visable = true
this.sidebarPage.addChild(child)
}
closeSidebarPage(){
this.sidebarPage.location.location.x.set(0.3, 500)
this.mainWindowElement.location.location.x.set(0.25, 500)
this.sidebarPage.clearChildren()
// this.sidebarPage.visable = false
}
}
module.exports = {
class: new SoopyGui()
}