Cleaned up component hierarchy

v5stable
ondra 11 years ago
parent 086a630fb9
commit 7ee201a6f7
  1. 3
      src/mightypork/gamecore/control/BaseApp.java
  2. 11
      src/mightypork/gamecore/control/bus/events/LayoutChangeEvent.java
  3. 55
      src/mightypork/gamecore/gui/components/AbstractLayoutComponent.java
  4. 92
      src/mightypork/gamecore/gui/components/AbstractVisualComponent.java
  5. 28
      src/mightypork/gamecore/gui/components/Component.java
  6. 11
      src/mightypork/gamecore/gui/components/InputComponent.java
  7. 9
      src/mightypork/gamecore/gui/components/LayoutComponent.java
  8. 55
      src/mightypork/gamecore/gui/components/SimplePainter.java
  9. 75
      src/mightypork/gamecore/gui/components/layout/AbstractLayout.java
  10. 7
      src/mightypork/gamecore/gui/components/layout/ColumnHolder.java
  11. 7
      src/mightypork/gamecore/gui/components/layout/RowHolder.java
  12. 14
      src/mightypork/gamecore/gui/components/painters/ImagePainter.java
  13. 34
      src/mightypork/gamecore/gui/components/painters/QuadPainter.java
  14. 6
      src/mightypork/gamecore/gui/components/painters/TextPainter.java
  15. 8
      src/mightypork/rogue/screens/test_bouncyboxes/BouncyBox.java
  16. 2
      src/mightypork/utils/math/constraints/rect/caching/AbstractRectCache.java

@ -20,7 +20,6 @@ import mightypork.utils.annotations.DefaultImpl;
import mightypork.utils.files.InstanceLock; import mightypork.utils.files.InstanceLock;
import mightypork.utils.logging.Log; import mightypork.utils.logging.Log;
import mightypork.utils.logging.LogWriter; import mightypork.utils.logging.LogWriter;
import mightypork.utils.math.constraints.Pollable;
/** /**
@ -256,7 +255,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
// framework events // framework events
bus.addChannel(DestroyEvent.class, Destroyable.class); bus.addChannel(DestroyEvent.class, Destroyable.class);
bus.addChannel(UpdateEvent.class, Updateable.class); bus.addChannel(UpdateEvent.class, Updateable.class);
bus.addChannel(LayoutChangeEvent.class, Pollable.class); bus.addChannel(LayoutChangeEvent.class, LayoutChangeEvent.Listener.class);
// input events // input events
bus.addChannel(ScreenChangeEvent.class, ScreenChangeEvent.Listener.class); bus.addChannel(ScreenChangeEvent.class, ScreenChangeEvent.Listener.class);

@ -2,7 +2,6 @@ package mightypork.gamecore.control.bus.events;
import mightypork.gamecore.control.bus.events.types.ImmediateEvent; import mightypork.gamecore.control.bus.events.types.ImmediateEvent;
import mightypork.utils.math.constraints.Pollable;
/** /**
@ -12,15 +11,19 @@ import mightypork.utils.math.constraints.Pollable;
* @author MightyPork * @author MightyPork
*/ */
@ImmediateEvent @ImmediateEvent
public class LayoutChangeEvent implements Event<Pollable> { public class LayoutChangeEvent implements Event<LayoutChangeEvent.Listener> {
public LayoutChangeEvent() { public LayoutChangeEvent() {
} }
@Override @Override
public void handleBy(Pollable handler) public void handleBy(Listener handler)
{ {
handler.poll(); handler.onLayoutChanged();
}
public interface Listener {
public void onLayoutChanged();
} }
} }

@ -2,28 +2,36 @@ package mightypork.gamecore.gui.components;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList;
import mightypork.gamecore.audio.SoundSystem; import mightypork.gamecore.audio.SoundSystem;
import mightypork.gamecore.control.AppAccess; import mightypork.gamecore.control.AppAccess;
import mightypork.gamecore.control.AppSubModule; import mightypork.gamecore.control.AppSubModule;
import mightypork.gamecore.control.bus.EventBus; import mightypork.gamecore.control.bus.EventBus;
import mightypork.gamecore.control.bus.clients.ClientHub;
import mightypork.gamecore.input.InputSystem; import mightypork.gamecore.input.InputSystem;
import mightypork.gamecore.render.DisplaySystem; import mightypork.gamecore.render.DisplaySystem;
import mightypork.utils.math.constraints.rect.proxy.RectBound;
public abstract class BusEnabledPainter extends SimplePainter implements ClientHub, Component, AppAccess { public abstract class AbstractLayoutComponent extends AbstractVisualComponent implements LayoutComponent, AppAccess {
private boolean enabled; private boolean enabled;
private boolean visible = true;
private final AppSubModule subModule; private final AppSubModule subModule;
final LinkedList<Component> elements = new LinkedList<>();
public BusEnabledPainter(AppAccess app) { public AbstractLayoutComponent(AppAccess app, RectBound context) {
this.subModule = new AppSubModule(app); this.subModule = new AppSubModule(app);
setRect(context);
} }
public AbstractLayoutComponent(AppAccess app) {
this(app, null);
}
@Override @Override
public EventBus getEventBus() public EventBus getEventBus()
{ {
@ -110,28 +118,43 @@ public abstract class BusEnabledPainter extends SimplePainter implements ClientH
} }
@Override /**
public void setVisible(boolean visible) * Add element to the holder, setting it's context.<br>
* Element must then be then attached using the <code>attach</code> method.
*
* @param elem element
*/
public abstract void add(Component elem);
/**
* Connect to bus and add to element list
*
* @param elem element; it's context will be set to the constraint.
*/
public final void attach(Component elem)
{ {
this.visible = visible; if (elem == null) return;
}
elements.add(elem);
addChildClient(elem);
}
@Override @Override
public boolean isVisible() public void renderComponent()
{ {
return visible; for (final Component element : elements) {
element.render();
}
} }
@Override @Override
public final void render() public void updateLayout()
{ {
if (!visible) return; for (final Component element : elements) {
paint(); element.render();
}
} }
protected abstract void paint();
} }

@ -0,0 +1,92 @@
package mightypork.gamecore.gui.components;
import mightypork.gamecore.control.bus.events.LayoutChangeEvent;
import mightypork.utils.annotations.DefaultImpl;
import mightypork.utils.math.constraints.rect.Rect;
import mightypork.utils.math.constraints.rect.caching.AbstractRectCache;
import mightypork.utils.math.constraints.rect.proxy.RectBound;
import mightypork.utils.math.constraints.rect.proxy.RectBoundAdapter;
/**
* {@link Renderable} with pluggable context
*
* @author MightyPork
*/
public abstract class AbstractVisualComponent extends AbstractRectCache implements Component, LayoutChangeEvent.Listener {
private Rect source;
private boolean visible = true;
@Override
public final Rect getRect()
{
return super.getRect();
}
@Override
public final void setRect(RectBound rect)
{
this.source = new RectBoundAdapter(rect);
}
@Override
public final boolean isVisible()
{
return visible;
}
@Override
public final void setVisible(boolean visible)
{
this.visible = visible;
}
@Override
public final Rect getCacheSource()
{
return source;
}
@Override
public final void render()
{
if (!visible) return;
renderComponent();
};
@Override
public final void onLayoutChanged()
{
poll();
}
@Override
public final void onChange()
{
updateLayout();
}
/**
* Draw the component (it's visible)
*/
public abstract void renderComponent();
@Override
@DefaultImpl
public void updateLayout()
{
}
}

@ -1,31 +1,17 @@
package mightypork.gamecore.gui.components; package mightypork.gamecore.gui.components;
import mightypork.gamecore.control.bus.clients.ToggleableClient;
import mightypork.gamecore.control.interf.Enableable;
import mightypork.gamecore.gui.Hideable; import mightypork.gamecore.gui.Hideable;
import mightypork.utils.math.constraints.rect.Rect; import mightypork.utils.math.constraints.rect.Rect;
import mightypork.utils.math.constraints.rect.proxy.RectBound; import mightypork.utils.math.constraints.rect.proxy.RectBound;
/** /**
* UI component interface * Basic UI component interface
* *
* @author MightyPork * @author MightyPork
*/ */
public interface Component extends Hideable, PluggableRenderable, Enableable, ToggleableClient { public interface Component extends Hideable, PluggableRenderable {
/**
* Enable the component. This includes listening to event bus, and any
* event-related actions.
*/
@Override
void enable(boolean yes);
@Override
boolean isEnabled();
/** /**
* Set visible. When not visible, the component should not render. * Set visible. When not visible, the component should not render.
@ -46,10 +32,16 @@ public interface Component extends Hideable, PluggableRenderable, Enableable, To
void setRect(RectBound rect); void setRect(RectBound rect);
/**
* Render the component, if it is visible.
*/
@Override @Override
void render(); void render();
@Override /**
public boolean isListening(); * The bounding rect was changed. The component should now update any cached
* constraints derived from it.
*/
void updateLayout();
} }

@ -0,0 +1,11 @@
package mightypork.gamecore.gui.components;
import mightypork.gamecore.control.bus.clients.ToggleableClient;
import mightypork.gamecore.control.interf.Enableable;
import mightypork.gamecore.gui.ActionTrigger;
public interface InputComponent extends Component, Enableable, ActionTrigger, ToggleableClient {
}

@ -0,0 +1,9 @@
package mightypork.gamecore.gui.components;
import mightypork.gamecore.control.bus.clients.ClientHub;
import mightypork.gamecore.control.interf.Enableable;
public interface LayoutComponent extends Component, Enableable, ClientHub {
}

@ -1,55 +0,0 @@
package mightypork.gamecore.gui.components;
import mightypork.utils.annotations.DefaultImpl;
import mightypork.utils.math.constraints.rect.*;
import mightypork.utils.math.constraints.rect.caching.AbstractRectCache;
import mightypork.utils.math.constraints.rect.caching.RectCache;
import mightypork.utils.math.constraints.rect.proxy.RectBound;
import mightypork.utils.math.constraints.rect.proxy.RectBoundAdapter;
/**
* {@link Renderable} with pluggable context
*
* @author MightyPork
*/
public abstract class SimplePainter extends AbstractRectCache implements PluggableRenderable {
private RectCache source;
@Override
public Rect getRect()
{
return super.getRect();
}
@Override
public void setRect(RectBound rect)
{
this.source = new RectBoundAdapter(rect).cached();
}
@Override
public Rect getCacheSource()
{
return source;
}
@Override
public abstract void render();
/**
* Called after constraint was changed; contained constraints can now poll too.
*/
@Override
@DefaultImpl
public void onChange()
{
}
}

@ -1,75 +0,0 @@
package mightypork.gamecore.gui.components.layout;
import java.util.LinkedList;
import mightypork.gamecore.control.AppAccess;
import mightypork.gamecore.control.bus.EventBus;
import mightypork.gamecore.gui.components.BusEnabledPainter;
import mightypork.gamecore.gui.components.PluggableRenderable;
import mightypork.gamecore.gui.components.Renderable;
import mightypork.gamecore.gui.components.SimplePainter;
import mightypork.utils.math.constraints.rect.proxy.RectBound;
/**
* Bag for {@link SimplePainter} elements with constraints.<br>
* Elements are exposed to {@link EventBus}.
*
* @author MightyPork
*/
public abstract class AbstractLayout extends BusEnabledPainter {
final LinkedList<PluggableRenderable> elements = new LinkedList<>();
/**
* @param app app access
*/
public AbstractLayout(AppAccess app) {
super(app);
}
/**
* @param app app access
* @param context boudning context
*/
public AbstractLayout(AppAccess app, RectBound context) {
super(app);
setRect(context);
}
/**
* Add element to the holder, setting it's context.<br>
* Element must then be attached using the <code>attach</code> method.
*
* @param elem element
*/
public abstract void add(PluggableRenderable elem);
/**
* Connect to bus and add to element list
*
* @param elem element; it's context will be set to the constraint.
*/
public void attach(PluggableRenderable elem)
{
if (elem == null) return;
elements.add(elem);
addChildClient(elem);
}
@Override
public void paint()
{
for (final Renderable element : elements) {
element.render();
}
}
}

@ -2,7 +2,8 @@ package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.control.AppAccess; import mightypork.gamecore.control.AppAccess;
import mightypork.gamecore.gui.components.PluggableRenderable; import mightypork.gamecore.gui.components.AbstractLayoutComponent;
import mightypork.gamecore.gui.components.Component;
import mightypork.utils.math.constraints.rect.builders.TiledRect; import mightypork.utils.math.constraints.rect.builders.TiledRect;
import mightypork.utils.math.constraints.rect.proxy.RectBound; import mightypork.utils.math.constraints.rect.proxy.RectBound;
@ -12,7 +13,7 @@ import mightypork.utils.math.constraints.rect.proxy.RectBound;
* *
* @author MightyPork * @author MightyPork
*/ */
public class ColumnHolder extends AbstractLayout { public class ColumnHolder extends AbstractLayoutComponent {
private final TiledRect tiler; private final TiledRect tiler;
private int col = 0; private int col = 0;
@ -47,7 +48,7 @@ public class ColumnHolder extends AbstractLayout {
* @param elem * @param elem
*/ */
@Override @Override
public void add(final PluggableRenderable elem) public void add(final Component elem)
{ {
if (elem == null) return; if (elem == null) return;

@ -2,7 +2,8 @@ package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.control.AppAccess; import mightypork.gamecore.control.AppAccess;
import mightypork.gamecore.gui.components.PluggableRenderable; import mightypork.gamecore.gui.components.AbstractLayoutComponent;
import mightypork.gamecore.gui.components.Component;
import mightypork.utils.math.constraints.rect.builders.TiledRect; import mightypork.utils.math.constraints.rect.builders.TiledRect;
import mightypork.utils.math.constraints.rect.proxy.RectBound; import mightypork.utils.math.constraints.rect.proxy.RectBound;
@ -12,7 +13,7 @@ import mightypork.utils.math.constraints.rect.proxy.RectBound;
* *
* @author MightyPork * @author MightyPork
*/ */
public class RowHolder extends AbstractLayout { public class RowHolder extends AbstractLayoutComponent {
private final TiledRect tiler; private final TiledRect tiler;
private int row = 0; private int row = 0;
@ -47,7 +48,7 @@ public class RowHolder extends AbstractLayout {
* @param elem * @param elem
*/ */
@Override @Override
public void add(final PluggableRenderable elem) public void add(final Component elem)
{ {
if (elem == null) return; if (elem == null) return;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.painters; package mightypork.gamecore.gui.components.painters;
import mightypork.gamecore.gui.components.SimplePainter; import mightypork.gamecore.gui.components.AbstractVisualComponent;
import mightypork.gamecore.render.Render; import mightypork.gamecore.render.Render;
import mightypork.gamecore.render.textures.TxQuad; import mightypork.gamecore.render.textures.TxQuad;
@ -11,7 +11,7 @@ import mightypork.gamecore.render.textures.TxQuad;
* *
* @author MightyPork * @author MightyPork
*/ */
public class ImagePainter extends SimplePainter { public class ImagePainter extends AbstractVisualComponent {
private TxQuad texture; private TxQuad texture;
@ -34,9 +34,17 @@ public class ImagePainter extends SimplePainter {
@Override @Override
public void render() public void updateLayout()
{ {
Render.quadTextured(getRect(), texture); Render.quadTextured(getRect(), texture);
} }
@Override
public void renderComponent()
{
// TODO Auto-generated method stub
}
} }

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.painters; package mightypork.gamecore.gui.components.painters;
import mightypork.gamecore.gui.components.SimplePainter; import mightypork.gamecore.gui.components.AbstractVisualComponent;
import mightypork.gamecore.render.Render; import mightypork.gamecore.render.Render;
import mightypork.utils.annotations.FactoryMethod; import mightypork.utils.annotations.FactoryMethod;
import mightypork.utils.math.color.RGB; import mightypork.utils.math.color.RGB;
@ -12,7 +12,20 @@ import mightypork.utils.math.color.RGB;
* *
* @author MightyPork * @author MightyPork
*/ */
public class QuadPainter extends SimplePainter { public class QuadPainter extends AbstractVisualComponent {
@FactoryMethod
public static QuadPainter gradH(RGB colorLeft, RGB colorRight)
{
return new QuadPainter(colorLeft, colorRight, colorRight, colorLeft);
}
@FactoryMethod
public static QuadPainter gradV(RGB colorTop, RGB colorBottom)
{
return new QuadPainter(colorTop, colorTop, colorBottom, colorBottom);
}
private final RGB colorHMinVMin; private final RGB colorHMinVMin;
private final RGB colorHMaxVMin; private final RGB colorHMaxVMin;
@ -50,23 +63,8 @@ public class QuadPainter extends SimplePainter {
@Override @Override
public void render() public void renderComponent()
{ {
Render.quadColor(getRect(), colorHMinVMin, colorHMaxVMin, colorHMaxVMax, colorHMinVMax); Render.quadColor(getRect(), colorHMinVMin, colorHMaxVMin, colorHMaxVMax, colorHMinVMax);
} }
@FactoryMethod
public static QuadPainter gradH(RGB colorLeft, RGB colorRight)
{
return new QuadPainter(colorLeft, colorRight, colorRight, colorLeft);
}
@FactoryMethod
public static QuadPainter gradV(RGB colorTop, RGB colorBottom)
{
return new QuadPainter(colorTop, colorTop, colorBottom, colorBottom);
}
} }

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.painters; package mightypork.gamecore.gui.components.painters;
import mightypork.gamecore.gui.components.SimplePainter; import mightypork.gamecore.gui.components.AbstractVisualComponent;
import mightypork.gamecore.render.fonts.FontRenderer; import mightypork.gamecore.render.fonts.FontRenderer;
import mightypork.gamecore.render.fonts.FontRenderer.Align; import mightypork.gamecore.render.fonts.FontRenderer.Align;
import mightypork.gamecore.render.fonts.GLFont; import mightypork.gamecore.render.fonts.GLFont;
@ -19,7 +19,7 @@ import mightypork.utils.string.StringProvider.StringWrapper;
* *
* @author MightyPork * @author MightyPork
*/ */
public class TextPainter extends SimplePainter { public class TextPainter extends AbstractVisualComponent {
private final FontRenderer font; private final FontRenderer font;
private RGB color; private RGB color;
@ -79,7 +79,7 @@ public class TextPainter extends SimplePainter {
@Override @Override
public void render() public void renderComponent()
{ {
if (text == null) return; if (text == null) return;

@ -4,7 +4,7 @@ package mightypork.rogue.screens.test_bouncyboxes;
import java.util.Random; import java.util.Random;
import mightypork.gamecore.control.timing.Updateable; import mightypork.gamecore.control.timing.Updateable;
import mightypork.gamecore.gui.components.SimplePainter; import mightypork.gamecore.gui.components.AbstractVisualComponent;
import mightypork.gamecore.render.Render; import mightypork.gamecore.render.Render;
import mightypork.utils.math.Easing; import mightypork.utils.math.Easing;
import mightypork.utils.math.color.RGB; import mightypork.utils.math.color.RGB;
@ -14,7 +14,7 @@ import mightypork.utils.math.constraints.rect.Rect;
import mightypork.utils.math.constraints.rect.caching.RectCache; import mightypork.utils.math.constraints.rect.caching.RectCache;
public class BouncyBox extends SimplePainter implements Updateable { public class BouncyBox extends AbstractVisualComponent implements Updateable {
private final Random rand = new Random(); private final Random rand = new Random();
@ -35,7 +35,7 @@ public class BouncyBox extends SimplePainter implements Updateable {
@Override @Override
public void render() public void renderComponent()
{ {
Render.quad(box, RGB.GREEN); Render.quad(box, RGB.GREEN);
} }
@ -64,7 +64,7 @@ public class BouncyBox extends SimplePainter implements Updateable {
@Override @Override
public void onChange() public void updateLayout()
{ {
box.poll(); box.poll();
} }

@ -32,7 +32,7 @@ public abstract class AbstractRectCache extends RectAdapter implements Constrain
@Override @Override
protected final Rect getSource() protected final Rect getSource()
{ {
if (!inited) markDigestDirty(); if (!inited) poll();
return (cachingEnabled ? cache : getCacheSource()); return (cachingEnabled ? cache : getCacheSource());
} }

Loading…
Cancel
Save