Better Interactables
Created Interactable class Introduced dependency of Button and Checkbox on Interactable Created Checkbox class
This commit is contained in:
parent
a0acd16008
commit
af7b39d8e9
@ -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.KeyEvent;
|
||||
|
||||
public class Button extends Component {
|
||||
public class Button extends Interactable {
|
||||
|
||||
private Vec2i currentSize;
|
||||
private boolean isDisabled;
|
||||
@ -28,70 +28,25 @@ public class Button extends Component {
|
||||
private LayoutAlign align;
|
||||
|
||||
public <T extends InputEvent> Button(String name, Label textLabel, Consumer<Button> onClick) {//, InputListener<T> onClick, Class<? extends T> onClickClass) {
|
||||
super(name);
|
||||
label = textLabel;
|
||||
align = new LayoutAlign();
|
||||
addChild(textLabel);
|
||||
super(name, textLabel);
|
||||
setPreferredSize(107,34);
|
||||
Button inButton = (Button) setFocusable(true);
|
||||
|
||||
addListener(new Object() {
|
||||
@Subscribe
|
||||
public void onHoverChanged(HoverEvent e) {
|
||||
requestReassembly();
|
||||
}
|
||||
});
|
||||
//Button inButton = (Button) setFocusable(true);
|
||||
|
||||
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();
|
||||
}
|
||||
});
|
||||
|
||||
addListener((Class<KeyEvent>) KeyEvent.class, (InputListener<KeyEvent>) e -> {if (e.isLeftMouseButton() && inButton.containsCursor())
|
||||
addListener((Class<KeyEvent>) KeyEvent.class, (InputListener<KeyEvent>) e -> {if ((e.isLeftMouseButton() && containsCursor()) || (e.getKey()==GLFW.GLFW_KEY_ENTER && isFocused()) )
|
||||
{
|
||||
isClicked = e.isPress();
|
||||
if (!inButton.isDisabled())
|
||||
if (!isDisabled())
|
||||
{
|
||||
onClick.accept(inButton);
|
||||
onClick.accept(this);
|
||||
takeFocus();
|
||||
}
|
||||
requestReassembly();
|
||||
return true;
|
||||
}
|
||||
else if (e.isLeftMouseButton())
|
||||
{
|
||||
setFocused(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
|
||||
protected void assembleSelf(RenderTarget target) {
|
||||
//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.font.Font;
|
||||
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.GUILayer;
|
||||
import ru.windcorp.progressia.client.graphics.gui.Button;
|
||||
@ -59,11 +60,33 @@ public class LayerTestGUI extends GUILayer {
|
||||
|
||||
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(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(
|
||||
new Label(
|
||||
|
Reference in New Issue
Block a user