button element for html-defined menus
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2025-05-05 19:44:07 -04:00
parent 72673ba08c
commit cbdfb63663
6 changed files with 63 additions and 2 deletions

View File

@ -5,3 +5,4 @@ testClass {
} }
</style> </style>
<p class="testClass">Hello!</p> <p class="testClass">Hello!</p>
<button onclick="testButton()">Test button!</button>

View File

@ -1,3 +1,4 @@
import { clientUIButtonHook } from "/Scripts/client/uihooks";
import { Engine } from "/Scripts/types/engine"; import { Engine } from "/Scripts/types/engine";
import { Hook } from "/Scripts/types/hook"; import { Hook } from "/Scripts/types/hook";
@ -64,5 +65,6 @@ export const clientHooks: Hook[] = [
callback: (engine: Engine) => { callback: (engine: Engine) => {
engine.classes.areaUtils.static.selectAreaRectangular() engine.classes.areaUtils.static.selectAreaRectangular()
} }
} },
clientUIButtonHook,
] ]

View File

@ -0,0 +1,13 @@
import { Engine } from "/Scripts/types/engine";
import { Hook } from "/Scripts/types/hook";
/**
* The hook that fires every time a dynamic button in the ui is clicked
*/
export const clientUIButtonHook: Hook =
{
signal: "uiButton",
callback: (engine: Engine, data: string) => {
console.log("button clicked " + data)
}
}

View File

@ -1683,6 +1683,7 @@ Scaffolding for structure scanning service
Add JSoup dependency Add JSoup dependency
Proof of concept of loading html to define ui Proof of concept of loading html to define ui
Styling support for html-defined menus Styling support for html-defined menus
Dynamic html-defined menus support button elements that call a client hook when clicked

View File

@ -7,6 +7,9 @@ import java.util.stream.Collectors;
import org.jsoup.nodes.Node; import org.jsoup.nodes.Node;
import electrosphere.client.script.ClientScriptUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.Div;
import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elementtypes.ContainerElement; import electrosphere.renderer.ui.elementtypes.ContainerElement;
@ -69,6 +72,25 @@ public class HtmlParser {
} }
} }
} break; } break;
case "button": {
String onClick = jsoupNode.attr("onclick");
Runnable callback = null;
if(onClick == null){
LoggerInterface.loggerUI.WARNING("Button with undefined onclick " + jsoupNode);
callback = () -> {};
} else {
callback = () -> {
ClientScriptUtils.fireSignal("uiButton", onClick);
};
}
rVal = Button.createEmptyButton(callback);
for(Node child : jsoupNode.childNodes()){
Element childEl = HtmlParser.recursivelyParseChildren(child, styleAccumulator);
if(childEl != null){
((Button)rVal).addChild(childEl);
}
}
} break;
case "style": case "style":
//silently ignore //silently ignore
break; break;

View File

@ -200,6 +200,28 @@ public class Button extends StandardContainerElement implements DrawableElement,
return rVal; return rVal;
} }
/**
* Creates a button with no label inside
* @param callback The callback to fire when the button is clicked
* @return The button
*/
public static Button createEmptyButton(Runnable callback){
Button rVal = new Button();
rVal.setPaddingTop(DEFAULT_PADDING);
rVal.setPaddingRight(DEFAULT_PADDING);
rVal.setPaddingLeft(DEFAULT_PADDING);
rVal.setPaddingBottom(DEFAULT_PADDING);
rVal.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
callback.run();
if(Globals.virtualAudioSourceManager != null && rVal.audioPathOnClick != null){
Globals.virtualAudioSourceManager.createUI(rVal.audioPathOnClick);
}
return false;
}});
rVal.setAlignSelf(YogaAlignment.Start);
return rVal;
}
public boolean getVisible() { public boolean getVisible() {
return visible; return visible;
} }