Renderer/src/main/java/electrosphere/menu/ingame/MenuGeneratorsTerrainEditing.java
austin d438fc5484
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
rename package
2024-08-29 20:15:27 -04:00

150 lines
6.2 KiB
Java

package electrosphere.menu.ingame;
import java.util.List;
import electrosphere.engine.Globals;
import electrosphere.engine.signal.Signal.SignalType;
import electrosphere.game.data.voxel.VoxelData;
import electrosphere.game.data.voxel.VoxelType;
import electrosphere.menu.WindowStrings;
import electrosphere.menu.WindowUtils;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.ImagePanel;
import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.TextInput;
import electrosphere.renderer.ui.elements.VirtualScrollable;
import electrosphere.renderer.ui.elements.Window;
import electrosphere.renderer.ui.elementtypes.ClickableElement.ClickEventCallback;
import electrosphere.renderer.ui.elementtypes.ContainerElement.YogaAlignment;
import electrosphere.renderer.ui.elementtypes.ContainerElement.YogaFlexDirection;
import electrosphere.renderer.ui.elementtypes.ContainerElement.YogaJustification;
import electrosphere.renderer.ui.elementtypes.KeyEventElement.KeyboardEventCallback;
import electrosphere.renderer.ui.elementtypes.NavigableElement.NavigationEventCallback;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.KeyboardEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
/**
* Menu generators for terrain editing controls
*/
public class MenuGeneratorsTerrainEditing {
static Window rVal;
//text input
static final int TEXT_INPUT_HEIGHT = 50;
static final int TEXT_INPUT_WIDTH = 200;
//single voxel button
static final int VOXEL_BUTTON_WIDTH = 90;
static final int VOXEL_BUTTON_HEIGHT = 90;
static final int VOXEL_BUTTON_TEXTURE_DIM = 70;
static final int MARGIN_EACH_SIDE = 5;
//voxel selection
static final int VOXEL_SCROLLABLE_WIDTH = VOXEL_BUTTON_WIDTH * 5;
static final int VOXEL_SCROLLABLE_HEIGHT = VOXEL_BUTTON_HEIGHT * 5;
//width of the side panel
static final int WINDOW_WIDTH = VOXEL_SCROLLABLE_WIDTH;
static final int WINDOW_HEIGHT = VOXEL_SCROLLABLE_HEIGHT + TEXT_INPUT_HEIGHT;
/**
* Creates the level editor side panel top view
* @return
*/
public static Window createVoxelTypeSelectionPanel(){
//setup window
rVal = new Window(Globals.renderingEngine.getOpenGLState(),0,0,WINDOW_WIDTH,WINDOW_HEIGHT,true);
rVal.setParentAlignContent(YogaAlignment.Center);
rVal.setParentJustifyContent(YogaJustification.Center);
rVal.setParentAlignItem(YogaAlignment.Center);
rVal.setAlignContent(YogaAlignment.Center);
rVal.setAlignItems(YogaAlignment.Center);
rVal.setJustifyContent(YogaJustification.Center);
rVal.setFlexDirection(YogaFlexDirection.Column);
//scrollable that contains all the voxel types
VirtualScrollable scrollable = new VirtualScrollable(VOXEL_SCROLLABLE_WIDTH, VOXEL_SCROLLABLE_HEIGHT);
scrollable.setFlexDirection(YogaFlexDirection.Row);
scrollable.setAlignItems(YogaAlignment.Start);
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.closeWindow(WindowStrings.LEVEL_EDTIOR_SIDE_PANEL);
return false;
}});
//search input
TextInput searchInput = TextInput.createTextInput();
searchInput.setWidth(TEXT_INPUT_WIDTH);
searchInput.setMinWidth(TEXT_INPUT_WIDTH);
searchInput.setMinHeight(20);
searchInput.setOnPress(new KeyboardEventCallback() {public boolean execute(KeyboardEvent event){
boolean rVal = searchInput.defaultKeyHandling(event);
fillInVoxelSelectors(scrollable, searchInput.getText());
return rVal;
}});
rVal.addChild(searchInput);
//attach scrollable after search input for organzation purposes
rVal.addChild(scrollable);
//final step
fillInVoxelSelectors(scrollable, searchInput.getText());
Globals.signalSystem.post(SignalType.APPLY_YOGA,rVal);
return rVal;
}
/**
* Fills in the voxels to display based on the contents of the search string
* @param scrollable the scrollable to drop selection buttons in to
* @param searchString the string to search based on
*/
static void fillInVoxelSelectors(VirtualScrollable scrollable, String searchString){
scrollable.clearChildren();
VoxelData voxelData = Globals.gameConfigCurrent.getVoxelData();
List<VoxelType> matchingVoxels = voxelData.getTypes().stream().filter((type)->type.getName().toLowerCase().contains(searchString.toLowerCase())).toList();
//generate voxel buttons
for(VoxelType type : matchingVoxels){
Button newButton = new Button();
newButton.setAlignItems(YogaAlignment.Center);
//dimensions
newButton.setWidth(VOXEL_BUTTON_WIDTH);
newButton.setMinWidth(VOXEL_BUTTON_WIDTH);
newButton.setHeight(VOXEL_BUTTON_HEIGHT);
newButton.setMinHeight(VOXEL_BUTTON_HEIGHT);
//margin
newButton.setMarginBottom(MARGIN_EACH_SIDE);
newButton.setMarginLeft(MARGIN_EACH_SIDE);
newButton.setMarginRight(MARGIN_EACH_SIDE);
newButton.setMarginTop(MARGIN_EACH_SIDE);
//label
Label voxelLabel = new Label(1.0f);
voxelLabel.setText(type.getName());
//icon/model
ImagePanel texturePanel = ImagePanel.createImagePanel(type.getTexture());
if(type.getTexture() != null){
Globals.assetManager.addTexturePathtoQueue(type.getTexture());
}
texturePanel.setWidth(VOXEL_BUTTON_TEXTURE_DIM);
texturePanel.setHeight(VOXEL_BUTTON_TEXTURE_DIM);
newButton.addChild(texturePanel);
//button handling
newButton.addChild(voxelLabel);
newButton.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){
//set voxel type to this type
Globals.clientSelectedVoxelType = type;
return false;
}});
scrollable.addChild(newButton);
}
Globals.signalSystem.post(SignalType.APPLY_YOGA,rVal);
}
}