Better Interactables
Created Interactable class Introduced dependency of Button and Checkbox on Interactable Created Checkbox class
This commit is contained in:
		@@ -19,7 +19,7 @@ import ru.windcorp.progressia.client.graphics.input.bus.InputListener;
 | 
				
			|||||||
import ru.windcorp.progressia.client.graphics.input.InputEvent;
 | 
					import ru.windcorp.progressia.client.graphics.input.InputEvent;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.input.KeyEvent;
 | 
					import ru.windcorp.progressia.client.graphics.input.KeyEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Button extends Component {
 | 
					public class Button extends Interactable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private Vec2i currentSize;
 | 
						private Vec2i currentSize;
 | 
				
			||||||
	private boolean isDisabled;
 | 
						private boolean isDisabled;
 | 
				
			||||||
@@ -28,70 +28,25 @@ public class Button extends Component {
 | 
				
			|||||||
	private LayoutAlign align;
 | 
						private LayoutAlign align;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public <T extends InputEvent> Button(String name, Label textLabel, Consumer<Button> onClick) {//, InputListener<T> onClick, Class<? extends T> onClickClass) {
 | 
						public <T extends InputEvent> Button(String name, Label textLabel, Consumer<Button> onClick) {//, InputListener<T> onClick, Class<? extends T> onClickClass) {
 | 
				
			||||||
		super(name);
 | 
							super(name, textLabel);
 | 
				
			||||||
		label = textLabel;
 | 
					 | 
				
			||||||
		align = new LayoutAlign();
 | 
					 | 
				
			||||||
		addChild(textLabel);
 | 
					 | 
				
			||||||
		setPreferredSize(107,34);
 | 
							setPreferredSize(107,34);
 | 
				
			||||||
        Button inButton = (Button) setFocusable(true);
 | 
					        //Button inButton = (Button) setFocusable(true);
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
        addListener(new Object() {
 | 
					 | 
				
			||||||
            @Subscribe
 | 
					 | 
				
			||||||
            public void onHoverChanged(HoverEvent e) {
 | 
					 | 
				
			||||||
                requestReassembly();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        addListener(new Object() {
 | 
					        addListener((Class<KeyEvent>) KeyEvent.class, (InputListener<KeyEvent>) e -> {if ((e.isLeftMouseButton() && containsCursor()) || (e.getKey()==GLFW.GLFW_KEY_ENTER && isFocused()) )
 | 
				
			||||||
            @Subscribe
 | 
					 | 
				
			||||||
            public void onFocusChanged(FocusEvent e) {
 | 
					 | 
				
			||||||
            	inButton.setText(new Label("dummy",new Font().withColor(Colors.BLACK),e.getNewState() ? "Is Focused" : "Isn't focused"));
 | 
					 | 
				
			||||||
                requestReassembly();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        addListener((Class<KeyEvent>) KeyEvent.class, (InputListener<KeyEvent>) e -> {if (e.isLeftMouseButton() && inButton.containsCursor())
 | 
					 | 
				
			||||||
        	{
 | 
					        	{
 | 
				
			||||||
        		isClicked = e.isPress();
 | 
					        		isClicked = e.isPress();
 | 
				
			||||||
        		if (!inButton.isDisabled())
 | 
					        		if (!isDisabled())
 | 
				
			||||||
        		{
 | 
					        		{
 | 
				
			||||||
        			onClick.accept(inButton);
 | 
					        			onClick.accept(this);
 | 
				
			||||||
 | 
					        			takeFocus();
 | 
				
			||||||
        		}
 | 
					        		}
 | 
				
			||||||
        		requestReassembly();
 | 
					        		requestReassembly();
 | 
				
			||||||
        		return true;
 | 
					        		return true;
 | 
				
			||||||
        	}
 | 
					 | 
				
			||||||
        	else if (e.isLeftMouseButton())
 | 
					 | 
				
			||||||
        	{
 | 
					 | 
				
			||||||
        		setFocused(false);
 | 
					 | 
				
			||||||
        	}
 | 
					        	}
 | 
				
			||||||
		  	return false;});
 | 
							  	return false;});
 | 
				
			||||||
        							
 | 
					        							
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public boolean isClicked()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		return containsCursor() && isClicked;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setDisable(boolean isDisabled)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		this.isDisabled = isDisabled;
 | 
					 | 
				
			||||||
        setFocusable(isDisabled);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean isDisabled()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		return isDisabled;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public void setText(Label newText)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		removeChild(label);
 | 
					 | 
				
			||||||
		label = newText;
 | 
					 | 
				
			||||||
		addChild(label);
 | 
					 | 
				
			||||||
		requestReassembly();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	protected void assembleSelf(RenderTarget target) {
 | 
						protected void assembleSelf(RenderTarget target) {
 | 
				
			||||||
		//Border
 | 
							//Border
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					package ru.windcorp.progressia.client.graphics.gui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.function.Consumer;
 | 
				
			||||||
 | 
					import java.util.function.Supplier;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.eventbus.Subscribe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import glm.mat._4.Mat4;
 | 
				
			||||||
 | 
					import glm.vec._2.i.Vec2i;
 | 
				
			||||||
 | 
					import org.lwjgl.glfw.GLFW;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.backend.InputTracker;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.flat.RenderTarget;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.font.Font;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.Colors;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.event.FocusEvent;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.event.HoverEvent;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.input.bus.InputListener;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.input.InputEvent;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.input.KeyEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Checkbox extends Interactable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private boolean isActive;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public <T extends InputEvent> Checkbox(String name, Label textLabel, Consumer<Checkbox> onSet, Consumer<Checkbox> onReset) {//, InputListener<T> onClick, Class<? extends T> onClickClass) {
 | 
				
			||||||
 | 
							super(name, textLabel);
 | 
				
			||||||
 | 
							setPreferredSize(44 + textLabel.getPreferredSize().x,textLabel.getPreferredSize().y);
 | 
				
			||||||
 | 
					        //Checkbox inCheck = (Checkbox) setFocusable(true);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        addListener((Class<KeyEvent>) KeyEvent.class, (InputListener<KeyEvent>) e -> {if (e.isLeftMouseButton() && containsCursor()|| (e.getKey()==GLFW.GLFW_KEY_ENTER && isFocused()))
 | 
				
			||||||
 | 
					        	{
 | 
				
			||||||
 | 
					        		isClicked = e.isPress();
 | 
				
			||||||
 | 
					        		if (!isDisabled())
 | 
				
			||||||
 | 
					        		{
 | 
				
			||||||
 | 
					        			if (!isClicked && !isActive)
 | 
				
			||||||
 | 
					        			{
 | 
				
			||||||
 | 
					        				onSet.accept(this);
 | 
				
			||||||
 | 
					            			isActive = !isActive;
 | 
				
			||||||
 | 
					        			}
 | 
				
			||||||
 | 
					        			else if (!isClicked && isActive)
 | 
				
			||||||
 | 
					        			{
 | 
				
			||||||
 | 
					        				onReset.accept(this);
 | 
				
			||||||
 | 
					            			isActive = !isActive;
 | 
				
			||||||
 | 
					        			}
 | 
				
			||||||
 | 
					        			else if (isClicked)
 | 
				
			||||||
 | 
					        			{
 | 
				
			||||||
 | 
					        				takeFocus();
 | 
				
			||||||
 | 
					        			}
 | 
				
			||||||
 | 
					        		}
 | 
				
			||||||
 | 
					        		requestReassembly();
 | 
				
			||||||
 | 
					        		return true;
 | 
				
			||||||
 | 
					        	}
 | 
				
			||||||
 | 
							  	return false;});			
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public boolean isActive()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return isActive;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						protected void assembleSelf(RenderTarget target) {
 | 
				
			||||||
 | 
							//Border
 | 
				
			||||||
 | 
							if (isDisabled())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								target.fill(getX()+label.getPreferredSize().x, getY(), getWidth()-label.getPreferredSize().x, getHeight(), 0xFFE5E5E5);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (isClicked() || isHovered() || isFocused())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								target.fill(getX()+label.getPreferredSize().x, getY(), getWidth()-label.getPreferredSize().x, getHeight(), 0xFF37A2E6); // blue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								target.fill(getX()+label.getPreferredSize().x, getY(), getWidth()-label.getPreferredSize().x, getHeight(), 0xFFCBCBD0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							//Inside area
 | 
				
			||||||
 | 
							if (!isClicked() && isHovered() && !isDisabled())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								target.fill(getX()+2+label.getPreferredSize().x, getY()+2, getWidth()-label.getPreferredSize().x-4, getHeight()-4, 0xFFC3E4F7); // light blue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (!isClicked() || isDisabled())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								target.fill(getX()+2+label.getPreferredSize().x, getY()+2, getWidth()-label.getPreferredSize().x-4, getHeight()-4, Colors.WHITE);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (isActive() && !isClicked())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (isDisabled())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									target.fill(getX()+getWidth()-getHeight()+4, getY()+4, getHeight()-8, getHeight()-8, 0xFFB3D7EF);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									target.fill(getX()+getWidth()-getHeight()+4, getY()+4, getHeight()-8, getHeight()-8, 0xFF37A2E6); // blue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if (!isClicked())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (isDisabled())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									target.fill(getX()+label.getPreferredSize().x+4, getY()+4, getHeight()-8, getHeight()-8, 0xFFE5E5E5);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if (isFocused() || isHovered())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									target.fill(getX()+label.getPreferredSize().x+4, getY()+4, getHeight()-8, getHeight()-8, 0xFF37A2E6); // blue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									target.fill(getX()+label.getPreferredSize().x+4, getY()+4, getHeight()-8, getHeight()-8, 0xFFCBCBD0);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								target.fill(getX()+label.getPreferredSize().x+6, getY()+6, getHeight()-12, getHeight()-12, Colors.WHITE);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							target.pushTransform(new Mat4().identity().translate( getX(), getY(), 0));
 | 
				
			||||||
 | 
							label.assembleSelf(target);
 | 
				
			||||||
 | 
							target.popTransform();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					package ru.windcorp.progressia.client.graphics.gui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.eventbus.Subscribe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.event.FocusEvent;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.event.HoverEvent;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Interactable extends Component {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private Vec2i currentSize;
 | 
				
			||||||
 | 
						protected boolean isDisabled;
 | 
				
			||||||
 | 
						protected boolean isClicked;
 | 
				
			||||||
 | 
						protected Label label;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public Interactable(String name, Label textLabel)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							super(name);
 | 
				
			||||||
 | 
							label = textLabel;
 | 
				
			||||||
 | 
							addChild(textLabel);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							addListener(new Object() {
 | 
				
			||||||
 | 
					            @Subscribe
 | 
				
			||||||
 | 
					            public void onHoverChanged(HoverEvent e) {
 | 
				
			||||||
 | 
					                requestReassembly();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        addListener(new Object() {
 | 
				
			||||||
 | 
					            @Subscribe
 | 
				
			||||||
 | 
					            public void onFocusChanged(FocusEvent e) {
 | 
				
			||||||
 | 
					            	//inButton.setText(new Label("dummy",new Font().withColor(Colors.BLACK),e.getNewState() ? "Is Focused" : "Isn't focused"));
 | 
				
			||||||
 | 
					                requestReassembly();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public boolean isClicked()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return isClicked;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void setDisable(boolean isDisabled)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							this.isDisabled = isDisabled;
 | 
				
			||||||
 | 
					        setFocusable(isDisabled);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public boolean isDisabled()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return isDisabled;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public void setText(Label newText)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							removeChild(label);
 | 
				
			||||||
 | 
							label = newText;
 | 
				
			||||||
 | 
							addChild(label);
 | 
				
			||||||
 | 
							requestReassembly();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -27,6 +27,7 @@ import ru.windcorp.progressia.client.graphics.backend.GraphicsBackend;
 | 
				
			|||||||
import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface;
 | 
					import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.font.Font;
 | 
					import ru.windcorp.progressia.client.graphics.font.Font;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.gui.Button;
 | 
					import ru.windcorp.progressia.client.graphics.gui.Button;
 | 
				
			||||||
 | 
					import ru.windcorp.progressia.client.graphics.gui.Checkbox;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.gui.DynamicLabel;
 | 
					import ru.windcorp.progressia.client.graphics.gui.DynamicLabel;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.gui.GUILayer;
 | 
					import ru.windcorp.progressia.client.graphics.gui.GUILayer;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.gui.Button;
 | 
					import ru.windcorp.progressia.client.graphics.gui.Button;
 | 
				
			||||||
@@ -59,11 +60,33 @@ public class LayerTestGUI extends GUILayer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		TestPlayerControls tpc = TestPlayerControls.getInstance();
 | 
							TestPlayerControls tpc = TestPlayerControls.getInstance();
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		Button disableButton = new Button("TestButton", new Label("TestButtonLabel", new Font().withColor(Colors.BLACK), "I'm in TestGUI"), b -> {b.setDisable(!b.isDisabled());});
 | 
							Button disableButton = new Button("TestButton",
 | 
				
			||||||
 | 
									new Label("TestButtonLabel", new Font().withColor(Colors.BLACK), "I'm in TestGUI"), 
 | 
				
			||||||
 | 
									b -> {b.setDisable(!b.isDisabled());}
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		panel.addChild(disableButton);
 | 
							panel.addChild(disableButton);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		panel.addChild(new Button("TestButton2", new Label("TestButtonLabel2", new Font().withColor(Colors.BLACK), "I enable the above button"), b -> {disableButton.setDisable(false);b.takeFocus();}));
 | 
							panel.addChild(
 | 
				
			||||||
 | 
									new Button(
 | 
				
			||||||
 | 
											"TestButton2",
 | 
				
			||||||
 | 
											new Label("TestButtonLabel2", new Font().withColor(Colors.BLACK), "I enable the above button"), 
 | 
				
			||||||
 | 
											b -> {disableButton.setDisable(false);}
 | 
				
			||||||
 | 
											)
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							panel.addChild(
 | 
				
			||||||
 | 
									new Checkbox(
 | 
				
			||||||
 | 
											"Checkbox1",
 | 
				
			||||||
 | 
											new Label("CheckboxLabel", font,"Reset"),
 | 
				
			||||||
 | 
											c -> {c.setText(
 | 
				
			||||||
 | 
													new Label("CheckboxLabel", font, "Set")
 | 
				
			||||||
 | 
													);},
 | 
				
			||||||
 | 
											c -> {c.setText(
 | 
				
			||||||
 | 
													new Label("CheckboxLabel", font, "Reset")
 | 
				
			||||||
 | 
													);}
 | 
				
			||||||
 | 
											)
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		panel.addChild(
 | 
							panel.addChild(
 | 
				
			||||||
			new Label(
 | 
								new Label(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user