diff --git a/.project b/.project
index 0be527d..15f798f 100644
--- a/.project
+++ b/.project
@@ -1,23 +1,22 @@
SimpleJavaEngine
- Project SimpleJavaEngine created by Buildship.
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.buildship.core.gradleprojectbuilder
-
-
-
-
+
+
org.eclipse.jdt.core.javanature
org.eclipse.buildship.core.gradleprojectnature
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+ org.eclipse.buildship.core.gradleprojectbuilder
+
+
+
+
+
diff --git a/gradle.properties b/gradle.properties
index 096849f..8d3d08f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
org.gradle.jvmargs=-Xmx2G
-lwjglVersion = 3.3.0-SNAPSHOT
+lwjglVersion = 3.2.4-SNAPSHOT
lwjglNatives = natives-windows
\ No newline at end of file
diff --git a/src/main/java/speiger/src/coreengine/assets/AssetLocation.java b/src/main/java/speiger/src/coreengine/assets/AssetLocation.java
index 07d3d6d..c8c7c05 100644
--- a/src/main/java/speiger/src/coreengine/assets/AssetLocation.java
+++ b/src/main/java/speiger/src/coreengine/assets/AssetLocation.java
@@ -42,6 +42,11 @@ public final class AssetLocation
return of(domain+":"+location + "/" + subPath);
}
+ public AssetLocation alternate(String alterversion)
+ {
+ return of(domain+":"+location+"."+alterversion);
+ }
+
@Override
public String toString()
{
diff --git a/src/main/java/speiger/src/coreengine/assets/AssetManager.java b/src/main/java/speiger/src/coreengine/assets/AssetManager.java
index 0aaf702..f95010b 100644
--- a/src/main/java/speiger/src/coreengine/assets/AssetManager.java
+++ b/src/main/java/speiger/src/coreengine/assets/AssetManager.java
@@ -3,6 +3,8 @@ package speiger.src.coreengine.assets;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -16,36 +18,40 @@ import speiger.src.coreengine.assets.reloader.IReloadableResource;
public class AssetManager implements IReloadableResource
{
- Map domains = new Object2ObjectLinkedOpenHashMap();
- File file;
+ Map domains = new Object2ObjectLinkedOpenHashMap<>();
+ Path path;
public AssetManager(File file)
{
- this.file = file;
+ this(file.toPath());
}
- public File getMainAsset()
+ public AssetManager(Path path)
{
- return file;
+ this.path = path;
}
+ public Path getMainAsset()
+ {
+ return path;
+ }
@Override
public void reload()
{
domains.clear();
- loadAssetPackage(file);
+ loadAssetPackage(path);
}
public void loadAssetPackage(File file)
{
- if(file.isDirectory())
- {
- loadAssets(new FolderAssetPackage(file));
- }
- else if(isZipFile(file))
- {
- loadAssets(new ZipAssetPackage(file));
- }
+ loadAssetPackage(file.toPath());
+ }
+
+ public void loadAssetPackage(Path path)
+ {
+ if(Files.notExists(path)) return;
+ if(Files.isDirectory(path)) loadAssets(new FolderAssetPackage(path));
+ else if(isZipFile(path)) loadAssets(new ZipAssetPackage(path));
}
public void loadAssets(IAssetPackage packages)
@@ -72,7 +78,7 @@ public class AssetManager implements IReloadableResource
DomainAssets asset = domains.get(location.getDomain());
if(asset == null)
{
- throw new FileNotFoundException("File["+location.toString()+"] not found");
+ throw new FileNotFoundException("Domain & File["+location.toString()+"] not found");
}
return asset.getAsset(location);
}
@@ -96,7 +102,7 @@ public class AssetManager implements IReloadableResource
DomainAssets asset = domains.get(location.getDomain());
if(asset == null)
{
- throw new FileNotFoundException("File["+location.toString()+"] not found");
+ throw new FileNotFoundException("Domain & File["+location.toString()+"] not found");
}
return asset.getMultiAsset(location, subLocations);
}
@@ -111,16 +117,10 @@ public class AssetManager implements IReloadableResource
return asset.getAllAssets(location);
}
- protected boolean isZipFile(File file)
+ protected boolean isZipFile(Path file)
{
- try(ZipFile zip = new ZipFile(file))
- {
- return true;
- }
- catch(Exception e)
- {
- }
- return false;
+ try(ZipFile zip = new ZipFile(file.toFile())) { return true; }
+ catch(Exception e) { return false; }
}
static class DomainAssets
@@ -137,15 +137,12 @@ public class AssetManager implements IReloadableResource
for(int i = packages.size() - 1;i>=0;i--)
{
IAsset asset = packages.get(i).getAsset(location);
- if(asset != null)
- {
- return asset;
- }
+ if(asset != null) return asset;
}
throw new FileNotFoundException("File["+location.toString()+"] not found");
}
- public MultiAsset getMultiAsset(AssetLocation location, AssetLocation[] subLocations)
+ public MultiAsset getMultiAsset(AssetLocation location, AssetLocation... subLocations)
{
for(int i = packages.size() - 1;i>=0;i--)
{
@@ -171,10 +168,7 @@ public class AssetManager implements IReloadableResource
for(IAssetPackage entry : packages)
{
IAsset asset = entry.getAsset(location);
- if(asset != null)
- {
- assets.add(asset);
- }
+ if(asset != null) assets.add(asset);
}
if(assets.isEmpty())
{
diff --git a/src/main/java/speiger/src/coreengine/assets/IAsset.java b/src/main/java/speiger/src/coreengine/assets/IAsset.java
index aa0ea29..f2a753d 100644
--- a/src/main/java/speiger/src/coreengine/assets/IAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/IAsset.java
@@ -12,6 +12,8 @@ public interface IAsset extends Closeable
{
public AssetLocation getLocation();
+ public IAsset subAsset(String alternative);
+
public InputStream getStream() throws IOException;
public BufferedImage getTexture() throws Exception;
diff --git a/src/main/java/speiger/src/coreengine/assets/MultiAsset.java b/src/main/java/speiger/src/coreengine/assets/MultiAsset.java
index a89d7b2..294ae4b 100644
--- a/src/main/java/speiger/src/coreengine/assets/MultiAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/MultiAsset.java
@@ -19,10 +19,7 @@ public class MultiAsset implements Closeable
{
for(int i = 0,m=assets.length;i toClose = new ArrayList();
+ Path path;
+ List closeable;
- public FileAsset(File file, AssetLocation location)
+ public FolderAsset(AssetLocation location, Path path)
+ {
+ this(location, path, new ObjectArrayList<>());
+ }
+
+ public FolderAsset(AssetLocation location, Path path, List closeable)
{
- this.file = file;
this.location = location;
+ this.path = path;
+ this.closeable = closeable;
}
@Override
public void close() throws IOException
{
- for(Closeable close : toClose)
+ for(Closeable close : closeable)
{
try
{
@@ -46,7 +50,14 @@ public class FileAsset implements IAsset
e.printStackTrace();
}
}
- toClose.clear();
+ closeable.clear();
+ }
+
+ @Override
+ public IAsset subAsset(String alternative)
+ {
+ Path newPath = path.resolveSibling(path.getFileName().toString()+"."+alternative);
+ return Files.exists(newPath) ? new FolderAsset(location.alternate(alternative), newPath, closeable) : null;
}
@Override
@@ -58,30 +69,30 @@ public class FileAsset implements IAsset
@Override
public InputStream getStream() throws IOException
{
- return new BufferedInputStream(markClosed(new FileInputStream(file)));
- }
-
- @Override
- public BufferedReader getStringReader() throws IOException
- {
- return new BufferedReader(markClosed(new FileReader(file)));
+ return markClosed(Files.newInputStream(path));
}
@Override
public BufferedImage getTexture() throws Exception
{
- return ImageIO.read(file);
+ return ImageIO.read(getStream());
+ }
+
+ @Override
+ public BufferedReader getStringReader() throws IOException
+ {
+ return markClosed(Files.newBufferedReader(path));
}
@Override
public JsonObject getJsonObject() throws IOException
{
- return JsonUtil.loadFile(file);
+ return JsonUtil.loadFile(path);
}
protected T markClosed(T value)
{
- toClose.add(value);
+ closeable.add(value);
return value;
}
}
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java
index f7efdf4..a08c3fe 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/FolderAssetPackage.java
@@ -1,47 +1,54 @@
package speiger.src.coreengine.assets.impl;
import java.io.File;
-import java.io.FileFilter;
-import java.util.ArrayList;
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
+import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.IAsset;
import speiger.src.coreengine.assets.IAssetPackage;
+import speiger.src.coreengine.assets.impl.FolderAsset;
public class FolderAssetPackage implements IAssetPackage
{
- static final FileFilter FOLDER_FILTER = new FileFilter(){
- @Override
- public boolean accept(File f)
- {
- return f.isDirectory();
- }
- };
- File file;
+ Path baseFolder;
- public FolderAssetPackage(File file)
+ public FolderAssetPackage(File baseFolder)
{
- this.file = file;
+ this(baseFolder.toPath());
+ }
+
+ public FolderAssetPackage(Path baseFolder)
+ {
+ this.baseFolder = baseFolder;
}
@Override
public List getDomains()
{
- List result = new ArrayList();
- File asset = new File(file, "assets/");
- for(File file : asset.listFiles(FOLDER_FILTER))
+ List domains = new ObjectArrayList<>();
+ try(DirectoryStream dirs = Files.newDirectoryStream(baseFolder.resolve("assets")))
{
- result.add(file.getAbsolutePath().substring(asset.getAbsolutePath().length() + 1).replace("\\", "/").replace("\"", "/"));
+ for(Path path : dirs)
+ {
+ domains.add(path.getFileName().toString());
+ }
}
- return result;
+ catch(IOException e)
+ {
+ e.printStackTrace();
+ }
+ return domains;
}
@Override
public IAsset getAsset(AssetLocation location)
{
- File asset = new File(file, location.getActualLocation());
- return asset.isFile() ? new FileAsset(asset, location) : null;
+ Path path = baseFolder.resolve(location.getActualLocation());
+ return Files.exists(path) ? new FolderAsset(location, path) : null;
}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java b/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java
index c0d7e32..a1accec 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/ZipAsset.java
@@ -1,13 +1,11 @@
package speiger.src.coreengine.assets.impl;
import java.awt.image.BufferedImage;
-import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
+import java.nio.file.Files;
+import java.nio.file.Path;
import javax.imageio.ImageIO;
@@ -19,29 +17,44 @@ import speiger.src.coreengine.utils.helpers.JsonUtil;
public class ZipAsset implements IAsset
{
- ZipFile file;
- ZipEntry entry;
+ Runnable closer;
AssetLocation location;
- Runnable runnable;
+ Path path;
- public ZipAsset(ZipFile file, ZipEntry entry, AssetLocation location, Runnable runnable)
+ public ZipAsset(Runnable closer, AssetLocation location, Path path)
{
- this.file = file;
- this.entry = entry;
+ this.closer = closer;
this.location = location;
- this.runnable = runnable;
+ this.path = path;
}
@Override
public void close() throws IOException
{
- if(runnable != null)
+ if(closer != null)
{
- runnable.run();
- runnable = null;
+ closer.run();
+ closer = null;
}
}
+ private void closeInternal()
+ {
+ if(closer != null)
+ {
+ closer.run();
+ closer = null;
+ }
+ }
+
+ @Override
+ public IAsset subAsset(String alternative)
+ {
+ if(closer == null) return null;
+ Path newPath = path.resolveSibling(path.getFileName().toString()+"."+alternative);
+ return Files.exists(newPath) ? new ZipAsset(this::closeInternal, location.alternate(alternative), newPath) : null;
+ }
+
@Override
public AssetLocation getLocation()
{
@@ -51,25 +64,24 @@ public class ZipAsset implements IAsset
@Override
public InputStream getStream() throws IOException
{
- return new BufferedInputStream(file.getInputStream(entry));
+ return Files.newInputStream(path);
}
@Override
public BufferedImage getTexture() throws Exception
{
- return ImageIO.read(file.getInputStream(entry));
+ return ImageIO.read(getStream());
}
@Override
public BufferedReader getStringReader() throws IOException
{
- return new BufferedReader(new InputStreamReader(file.getInputStream(entry)));
+ return Files.newBufferedReader(path);
}
@Override
public JsonObject getJsonObject() throws IOException
{
- return JsonUtil.loadFile(file.getInputStream(entry));
+ return JsonUtil.loadFile(path);
}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java b/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java
index 98e6b8a..f550b2e 100644
--- a/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java
+++ b/src/main/java/speiger/src/coreengine/assets/impl/ZipAssetPackage.java
@@ -2,91 +2,73 @@ package speiger.src.coreengine.assets.impl;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
+import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.coreengine.assets.AssetLocation;
import speiger.src.coreengine.assets.IAsset;
import speiger.src.coreengine.assets.IAssetPackage;
-import speiger.src.coreengine.utils.collections.iterators.IterableWrapper;
public class ZipAssetPackage implements IAssetPackage
{
- public static final int ASSET_OFFSET = "assets/".length();
- File file;
- ZipFile cache = null;
+ Path baseFolder;
+ FileSystem cache;
AtomicInteger usedReferences = new AtomicInteger();
+ Runnable referenceCleaner = this::cleanReference;
public ZipAssetPackage(File file)
{
- this.file = file;
+ this(file.toPath());
}
- protected ZipFile getReference() throws IOException
+ public ZipAssetPackage(Path baseFolder)
{
- usedReferences.getAndIncrement();
- if(cache == null) cache = new ZipFile(file);
- return cache;
+ this.baseFolder = baseFolder;
}
- protected void onReferenceClosed()
+ private void cleanReference()
{
int left = usedReferences.decrementAndGet();
if(left == 0 && cache != null)
{
- try
- {
- cache.close();
- }
+ try { cache.close(); }
catch(Exception e) {e.printStackTrace();}
cache = null;
}
- else if(left < 0)
- {
- usedReferences.set(0);
- }
+ else if(left < 0) usedReferences.set(0);
+ }
+
+ protected FileSystem getReference() throws IOException
+ {
+ usedReferences.getAndIncrement();
+ if(cache == null) cache = FileSystems.newFileSystem(baseFolder, null);
+ return cache;
}
@Override
public List getDomains()
{
- try
+ List domains = new ObjectArrayList<>();
+ try(FileSystem system = FileSystems.newFileSystem(baseFolder, null))
{
- List result = new ArrayList();
- ZipFile zip = new ZipFile(file);
- for(ZipEntry entry : IterableWrapper.wrap(zip.entries()))
+ try(DirectoryStream dirs = Files.newDirectoryStream(system.getPath("assets")))
{
- String name = entry.getName();
- if(isPathValid(name))
+ for(Path path : dirs)
{
- result.add(name.substring(ASSET_OFFSET, name.length() - 1));
+ String s = path.getFileName().toString();
+ domains.add(s.substring(0, s.length()-1));
}
}
- zip.close();
- return result;
+ catch(Exception e) { e.printStackTrace(); }
}
- catch(IOException e)
- {
- e.printStackTrace();
- return Collections.emptyList();
- }
- }
-
- private boolean isPathValid(String input)
- {
- if(input.startsWith("assets/"))
- {
- int index = input.indexOf("/", ASSET_OFFSET);
- if(index != -1 && input.length() - index <= 1)
- {
- return true;
- }
- }
- return false;
+ catch(Exception e) { e.printStackTrace(); }
+ return domains;
}
@Override
@@ -94,18 +76,9 @@ public class ZipAssetPackage implements IAssetPackage
{
try
{
- ZipFile zip = getReference();
- ZipEntry entry = zip.getEntry(location.getActualLocation());
- if(entry != null)
- {
- return new ZipAsset(zip, entry, location, this::onReferenceClosed);
- }
+ Path path = getReference().getPath(location.getActualLocation());
+ return Files.exists(path) ? new ZipAsset(referenceCleaner, location, path) : null;
}
- catch(Exception e)
- {
- e.printStackTrace();
- }
- onReferenceClosed();
- return null;
+ catch(Exception e) { return null; }
}
}
diff --git a/src/main/java/speiger/src/coreengine/assets/reloader/ResourceReloader.java b/src/main/java/speiger/src/coreengine/assets/reloader/ResourceReloader.java
index 1725b45..349f7ab 100644
--- a/src/main/java/speiger/src/coreengine/assets/reloader/ResourceReloader.java
+++ b/src/main/java/speiger/src/coreengine/assets/reloader/ResourceReloader.java
@@ -6,7 +6,6 @@ import speiger.src.collections.objects.sets.ObjectLinkedOpenHashSet;
public class ResourceReloader
{
-// public static ResourceReloader INSTANCE = new ResourceReloader();
Set resources = new ObjectLinkedOpenHashSet();
boolean globalRemoval = false;
boolean reloading = false;
diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/GuiComponent.java b/src/main/java/speiger/src/coreengine/rendering/gui/GuiComponent.java
index 5896268..3603ab8 100644
--- a/src/main/java/speiger/src/coreengine/rendering/gui/GuiComponent.java
+++ b/src/main/java/speiger/src/coreengine/rendering/gui/GuiComponent.java
@@ -23,6 +23,7 @@ import speiger.src.coreengine.rendering.gui.helper.box.GuiBox;
import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox;
import speiger.src.coreengine.rendering.gui.helper.constrains.ComponentConstrains;
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrain;
+import speiger.src.coreengine.rendering.gui.renderer.IComponentRenderer;
import speiger.src.coreengine.rendering.gui.renderer.UIRenderer;
import speiger.src.coreengine.rendering.input.Keyboard;
import speiger.src.coreengine.rendering.input.bindings.utils.BindingType;
@@ -60,6 +61,7 @@ public abstract class GuiComponent extends FlagHolder
ComponentConstrains constraints = null;
Animator animation = null;
KeyBindAction binding = null;
+ IComponentRenderer customRenderer;
Set>[] listeners = CollectionUtils.createSets(3, true);
Set children = new ObjectLinkedOpenHashSet<>();
Set popupChildren = new ObjectLinkedOpenHashSet<>();
@@ -429,6 +431,12 @@ public abstract class GuiComponent extends FlagHolder
return this;
}
+ public GuiComponent setCustomRenderer(IComponentRenderer renderer)
+ {
+ customRenderer = (IComponentRenderer)renderer;
+ return this;
+ }
+
private void addBindingTooltip()
{
tooltips.addComponent(binding.getTooltip(), new TextComponent(0F, 0F, 200F, 0F, "Key: "+ModType.getMods(binding.mod)+BindingType.KEYBOARD.getName(binding.key)).setLimitedHeight(false).setAlignment(Align.LEFT_TOP, Align.LEFT_TOP).setScale(0.5F));
@@ -790,11 +798,22 @@ public abstract class GuiComponent extends FlagHolder
public final void onRender(int mouseX, int mouseY, float particalTicks)
{
- onPreRender();
- getRenderer().setVisibility(totalVisibility).setBrightness(brightness);
- if(renderSelf(mouseX, mouseY, particalTicks)) renderChildren(mouseX, mouseY, particalTicks);
- onPostRender();
- getRenderer().resetEffects();
+ if(customRenderer != null)
+ {
+ customRenderer.onPreRender(this);
+ getRenderer().setVisibility(totalVisibility).setBrightness(brightness);
+ if(customRenderer.render(this)) renderChildren(mouseX, mouseY, particalTicks);
+ customRenderer.onPostRender(this);
+ getRenderer().resetEffects();
+ }
+ else
+ {
+ onPreRender();
+ getRenderer().setVisibility(totalVisibility).setBrightness(brightness);
+ if(renderSelf(mouseX, mouseY, particalTicks)) renderChildren(mouseX, mouseY, particalTicks);
+ onPostRender();
+ getRenderer().resetEffects();
+ }
if(getGui() instanceof GuiScreenBase)
{
((GuiScreenBase)getGui()).drawBox(this);
diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/components/TextFieldComponent.java b/src/main/java/speiger/src/coreengine/rendering/gui/components/TextFieldComponent.java
index 9d48d2e..56b0247 100644
--- a/src/main/java/speiger/src/coreengine/rendering/gui/components/TextFieldComponent.java
+++ b/src/main/java/speiger/src/coreengine/rendering/gui/components/TextFieldComponent.java
@@ -581,11 +581,14 @@ public class TextFieldComponent extends GuiComponent
@Override
public void onFocusLost()
{
- if(isFlagSet(FLAG_FOCUS))
+ if(isFlagSet(FLAG_CAN_LOSE_FOCUS))
{
- notifyListeners(LISTENER_USER_ACTION);
+ if(isFlagSet(FLAG_FOCUS))
+ {
+ notifyListeners(LISTENER_USER_ACTION);
+ }
+ setFocused(false);
}
- setFocused(false);
}
protected void handleDoubleClick(int position)
diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/components/layouts/VerticalLayout.java b/src/main/java/speiger/src/coreengine/rendering/gui/components/layouts/VerticalLayout.java
index adeab1a..eceb030 100644
--- a/src/main/java/speiger/src/coreengine/rendering/gui/components/layouts/VerticalLayout.java
+++ b/src/main/java/speiger/src/coreengine/rendering/gui/components/layouts/VerticalLayout.java
@@ -20,7 +20,7 @@ public class VerticalLayout implements Consumer
this.components.addAll(components);
for(int i = 0;i notifyListeners(LISTENER_USER_ACTION)).addUserActionListener(closeListener), new ComponentConstrains(new RelativeConstrain(0F), new ParentConstrain(10F).invert(), new RelativeConstrain(0.5F), new PixelConstrain(10F)));
- addChild(cancel.addChangeListener(minimizedListener).addUserActionListener(closeListener), new ComponentConstrains(new RelativeConstrain(0.5F), new ParentConstrain(10F).invert(), new RelativeConstrain(0.5F), new PixelConstrain(10F)));
- addChild(message, new ComponentConstrains(new PixelConstrain(10F), new PixelConstrain(11F), new ParentConstrain(10F), TextConstrain.height(message)));
- addChild(input, new ComponentConstrains(new PixelConstrain(10F), TextConstrain.height(message).setPadding(15F), new ParentConstrain(10F), new PixelConstrain(12F)));
+ addChild(confirm.addChangeListener(minimizedListener).addUserActionListener(this::onListen), new RelativeConstrain(0F), new ParentConstrain(10F).invert(), new RelativeConstrain(0.5F), new PixelConstrain(10F));
+ addChild(cancel.addChangeListener(minimizedListener).addUserActionListener(closeListener), new RelativeConstrain(0.5F), new ParentConstrain(10F).invert(), new RelativeConstrain(0.5F), new PixelConstrain(10F));
+ addChild(message.addChangeListener(minimizedListener), new PixelConstrain(10F), new PixelConstrain(11F), new ParentConstrain(10F), TextConstrain.height(message));
+ addChild(input.addChangeListener(minimizedListener).addUserActionListener(this::onListen), new PixelConstrain(10F), TextConstrain.height(message).setPadding(15F), new ParentConstrain(10F), new PixelConstrain(12F));
getBox().setHeight(45F + message.getMetadata().getMaxHeight());
}
+ private void onListen()
+ {
+ notifyListeners(LISTENER_USER_ACTION);
+ closeListener.accept(this);
+ }
+
@Override
public boolean isPopup()
{
diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IComponentRenderer.java b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IComponentRenderer.java
new file mode 100644
index 0000000..3b7cdf4
--- /dev/null
+++ b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/IComponentRenderer.java
@@ -0,0 +1,10 @@
+package speiger.src.coreengine.rendering.gui.renderer;
+
+import speiger.src.coreengine.rendering.gui.GuiComponent;
+
+public interface IComponentRenderer
+{
+ public void onPreRender(T component);
+ public boolean render(T component);
+ public void onPostRender(T component);
+}
diff --git a/src/main/java/speiger/src/coreengine/rendering/input/Keyboard.java b/src/main/java/speiger/src/coreengine/rendering/input/Keyboard.java
index 05c1f07..37ddf16 100644
--- a/src/main/java/speiger/src/coreengine/rendering/input/Keyboard.java
+++ b/src/main/java/speiger/src/coreengine/rendering/input/Keyboard.java
@@ -15,6 +15,7 @@ public class Keyboard
{
public static final Keyboard INSTANCE = new Keyboard();
boolean[] pressedKeys = new boolean[350];
+ boolean[] nonConsumedKeys = new boolean[350];
EventBus bus;
BiPredicate filter;
@@ -49,6 +50,7 @@ public class Keyboard
else
{
pressedKeys[key] = false;
+ nonConsumedKeys[key] = false;
InputBinding.BINDINGS.updatePressing(BindingType.KEYBOARD, key, false);
}
}
@@ -63,6 +65,7 @@ public class Keyboard
{
return;
}
+ nonConsumedKeys[key] = true;
InputBinding.BINDINGS.updatePressing(BindingType.KEYBOARD, key, true);
}
}
@@ -92,6 +95,11 @@ public class Keyboard
return key <= 162;
}
+ public static boolean isKeyFullyPressed(int key)
+ {
+ return INSTANCE.isPressed(key) && !INSTANCE.isConsumed(key);
+ }
+
public static boolean isKeyPressed(int key)
{
return INSTANCE.isPressed(key);
@@ -101,4 +109,9 @@ public class Keyboard
{
return pressedKeys[key];
}
+
+ public boolean isConsumed(int key)
+ {
+ return !nonConsumedKeys[key];
+ }
}
diff --git a/src/main/java/speiger/src/coreengine/rendering/input/bindings/utils/BindingType.java b/src/main/java/speiger/src/coreengine/rendering/input/bindings/utils/BindingType.java
index 7a9a0b7..91a7f9e 100644
--- a/src/main/java/speiger/src/coreengine/rendering/input/bindings/utils/BindingType.java
+++ b/src/main/java/speiger/src/coreengine/rendering/input/bindings/utils/BindingType.java
@@ -21,7 +21,7 @@ public enum BindingType
@Override
public boolean isPressed(int key)
{
- return Keyboard.isKeyPressed(key);
+ return Keyboard.isKeyFullyPressed(key);
}
},
MOUSE