From a218c13b44e4323be87da49c45adbc86e91547c5 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Fri, 10 Jul 2015 14:26:44 +0200 Subject: [PATCH] GuiElement interface's mouseClick method returns a boolean which is handled by ComposedElement to prevent mouse clicks on multiple elements at once ComposedElement's entries are sorted so that GuiDropdown are always drawn on top Modified thrown UnsupportedOperationExceptions in CustomImageObject to not be thrown if asset is null --- .../replaymod/assets/CustomImageObject.java | 10 +--- .../replaymod/gui/GuiObjectManager.java | 59 ++++++++++++++++--- .../replaymod/gui/GuiReplaySpeedSlider.java | 4 +- .../gui/elements/ComposedElement.java | 45 ++++++++++---- .../gui/elements/DelegatingElement.java | 4 +- .../gui/elements/GuiAdvancedButton.java | 4 +- .../gui/elements/GuiAdvancedCheckBox.java | 4 +- .../gui/elements/GuiAdvancedTextField.java | 3 +- .../gui/elements/GuiDraggingNumberInput.java | 4 +- .../replaymod/gui/elements/GuiDropdown.java | 16 +++-- .../replaymod/gui/elements/GuiElement.java | 2 +- .../replaymod/gui/elements/GuiScrollbar.java | 6 +- .../replaymod/gui/elements/GuiString.java | 4 +- .../replaymod/gui/elements/GuiTextArea.java | 3 +- .../timelines/GuiKeyframeTimeline.java | 8 ++- .../elements/timelines/GuiMarkerTimeline.java | 10 ++-- .../gui/elements/timelines/GuiTimeline.java | 4 +- 17 files changed, 135 insertions(+), 55 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java b/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java index 1b1db2b7..45ef7c72 100644 --- a/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java +++ b/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java @@ -16,14 +16,10 @@ import java.util.UUID; public class CustomImageObject implements GuiEntryListEntry { - public CustomImageObject(String name, UUID assetUUID) { + public CustomImageObject(String name, UUID assetUUID) throws IOException { this.name = name; - try { - setLinkedAsset(assetUUID); - } catch(Exception e) { - e.printStackTrace(); - } + setLinkedAsset(assetUUID); } @Getter @Setter private String name; @@ -43,7 +39,7 @@ public class CustomImageObject implements GuiEntryListEntry { if(asset instanceof ReplayImageAsset) { setImage(((ReplayImageAsset)asset).getObject()); - } else { + } else if(asset != null) { throw new UnsupportedOperationException("A CustomImageObject requires a ReplayImageAsset"); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java index f47954db..31e0851d 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java @@ -141,8 +141,12 @@ public class GuiObjectManager extends GuiScreen { addButton = new GuiAdvancedButton(0, 0, 0, 20, I18n.format("replaymod.gui.add"), new Runnable() { @Override public void run() { - CustomImageObject customImageObject = new CustomImageObject(I18n.format("replaymod.gui.objects.defaultname"), null); - objectList.addElement(customImageObject); + try { + CustomImageObject customImageObject = new CustomImageObject(I18n.format("replaymod.gui.objects.defaultname"), null); + objectList.addElement(customImageObject); + } catch(IOException e) { + e.printStackTrace(); + } } }, null); @@ -165,11 +169,44 @@ public class GuiObjectManager extends GuiScreen { CustomImageObject selectedObject = objectList.getElement(selectionIndex); if(selectedObject != null) { disableElements.setEnabled(true); + + nameInput.setText(selectedObject.getName()); + + //setting the dropdown value + int sel = 0; + if(selectedObject.getLinkedAsset() != null) { + int i = 0; + for(GuiEntryListValueEntry entry : assetDropdown.getAllElements()) { + if(selectedObject.getLinkedAsset().equals(entry.getValue())) { + sel = i; + break; + } + i++; + } + } + + assetDropdown.setSelectionIndexQuietly(sel); + } else { disableElements.setEnabled(false); } } }); + + assetDropdown.addSelectionListener(new SelectionListener() { + @Override + public void onSelectionChanged(int selectionIndex) { + CustomImageObject selectedObject = objectList.getElement(objectList.getSelectionIndex()); + GuiEntryListValueEntry entry = assetDropdown.getElement(selectionIndex); + if(selectedObject != null && entry != null) { + try { + selectedObject.setLinkedAsset(entry.getValue()); + } catch(IOException e) { + e.printStackTrace(); + } + } + } + }); } String[] labelStrings = new String[] { @@ -200,12 +237,12 @@ public class GuiObjectManager extends GuiScreen { opacityInputs = new ComposedElement(opacityInput); numberInputs = new ComposedElement(anchorInputs, positionInputs, scaleInputs, orientationInputs, opacityInputs); - for(int i = numberInputs.getParts().length-1; i >= 0; i--) { - int yPos = this.height-5-10-(25*(numberInputs.getParts().length-i)); + for(int i = numberInputs.getParts().size()-1; i >= 0; i--) { + int yPos = this.height-5-10-(25*(numberInputs.getParts().size()-i)); DelegatingElement button = keyframeButton(10, yPos, i); GuiString label = new GuiString(35, yPos + 6, Color.WHITE, labelStrings[i]); - ComposedElement child = (ComposedElement)numberInputs.getParts()[i]; + ComposedElement child = (ComposedElement)numberInputs.getParts().get(i); int x = 0; for(GuiElement el : child.getParts()) { GuiDraggingNumberInput dni = (GuiDraggingNumberInput)el; @@ -318,6 +355,11 @@ public class GuiObjectManager extends GuiScreen { Point mousePos = MouseUtils.getMousePos(); allElements.buttonPressed(mc, mousePos.getX(), mousePos.getY(), typedChar, keyCode); + CustomImageObject selectedObject = objectList.getElement(objectList.getSelectionIndex()); + if(selectedObject != null) { + selectedObject.setName(nameInput.getText().trim()); + } + super.keyTyped(typedChar, keyCode); } @@ -364,14 +406,17 @@ public class GuiObjectManager extends GuiScreen { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - if(!enabled) return; + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + if(!enabled) return false; super.mouseClick(mc, mouseX, mouseY, button); int time = (int) getTimeAt(mouseX, mouseY); if(time != -1) { cursorPosition = time; dragging = true; + return true; } + + return false; } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySpeedSlider.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySpeedSlider.java index 2e939abf..7a535083 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySpeedSlider.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySpeedSlider.java @@ -179,8 +179,8 @@ public class GuiReplaySpeedSlider extends GuiButton implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - mousePressed(mc, mouseX, mouseY); + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + return mousePressed(mc, mouseX, mouseY); } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/ComposedElement.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/ComposedElement.java index 4dada1d0..7c3316a5 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/ComposedElement.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/ComposedElement.java @@ -3,23 +3,22 @@ package eu.crushedpixel.replaymod.gui.elements; import lombok.Getter; import net.minecraft.client.Minecraft; +import java.util.*; + public class ComposedElement implements GuiElement { + + private static final ComposedElementComparator COMPOSED_ELEMENT_COMPARATOR = new ComposedElementComparator(); + @Getter - private GuiElement[] parts; + private List parts = new ArrayList(); public ComposedElement(GuiElement...parts) { - this.parts = parts; + this.parts = new ArrayList(Arrays.asList(parts)); } public void addPart(GuiElement part) { - GuiElement[] newParts = new GuiElement[parts.length+1]; - int i = 0; - for(GuiElement e : parts) { - newParts[i] = e; - i++; - } - newParts[i] = part; - this.parts = newParts; + parts.add(part); + Collections.sort(parts, COMPOSED_ELEMENT_COMPARATOR); } @Override @@ -47,10 +46,14 @@ public class ComposedElement implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - for (GuiElement part : parts) { - part.mouseClick(mc, mouseX, mouseY, button); + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + boolean clicked = false; + //iterate over elements in reverse order to first handle mouse clicks of elements that are drawn on top + for (int i=0; i { + + @Override + public int compare(GuiElement o1, GuiElement o2) { + Boolean d1 = o1 instanceof GuiDropdown; + Boolean d2 = o2 instanceof GuiDropdown; + + return d1.compareTo(d2); + } + + @Override + public boolean equals(Object obj) { + return false; + } + } } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/DelegatingElement.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/DelegatingElement.java index 796fb395..368148f7 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/DelegatingElement.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/DelegatingElement.java @@ -33,8 +33,8 @@ public abstract class DelegatingElement implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - delegate().mouseClick(mc, mouseX, mouseY, button); + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + return delegate().mouseClick(mc, mouseX, mouseY, button); } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedButton.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedButton.java index 137422f0..f47f4c42 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedButton.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedButton.java @@ -52,10 +52,12 @@ public class GuiAdvancedButton extends GuiButton implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { if (isHovering(mouseX, mouseY)) { performAction(); + return true; } + return false; } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedCheckBox.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedCheckBox.java index d4d6f78b..b4ecd8a8 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedCheckBox.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedCheckBox.java @@ -27,8 +27,8 @@ public class GuiAdvancedCheckBox extends GuiCheckBox implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - mousePressed(mc, mouseX, mouseY); + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + return mousePressed(mc, mouseX, mouseY); } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedTextField.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedTextField.java index 55626266..5eff73a0 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedTextField.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiAdvancedTextField.java @@ -67,8 +67,9 @@ public class GuiAdvancedTextField extends GuiTextField implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { mouseClicked(mouseX, mouseY, button); + return isHovering(mouseX, mouseY); } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDraggingNumberInput.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDraggingNumberInput.java index 5701029d..25d51858 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDraggingNumberInput.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDraggingNumberInput.java @@ -23,12 +23,14 @@ public class GuiDraggingNumberInput extends GuiNumberInputWithText { private boolean clicked; @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { if(MouseUtils.isMouseWithinBounds(xPosition, yPosition, width, height) && isEnabled) { dragging = false; clicked = true; prevMouseX = mouseX; + return true; } + return false; } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDropdown.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDropdown.java index fa0c7460..e20b1cfb 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDropdown.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiDropdown.java @@ -133,11 +133,10 @@ public class GuiDropdown extends GuiAdvancedTextFie } @Override - public void mouseClicked(int xPos, int yPos, int mouseButton) { - mouseClickedResult(xPos, yPos); + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + return mouseClickedResult(mouseX, mouseY); } - public boolean mouseClickedResult(int xPos, int yPos) { boolean success = false; if(!isEnabled) return success; @@ -202,9 +201,18 @@ public class GuiDropdown extends GuiAdvancedTextFie } public void setSelectionIndex(int index) { + setSelectionIndexQuietly(index); + fireSelectionChangeEvent(); + } + + /** + * Sets the selection index without notifying SelectionChangeListeners. + * @param index The Selection Index + */ + public void setSelectionIndexQuietly(int index) { this.selectionIndex = index; if(selectionIndex < 0) selectionIndex = -1; - fireSelectionChangeEvent(); + if(selectionIndex >= elements.size()) selectionIndex = elements.size()-1; } private void fireSelectionChangeEvent() { diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiElement.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiElement.java index 03d47bb5..8a298a87 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiElement.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiElement.java @@ -9,7 +9,7 @@ public interface GuiElement { boolean isHovering(int mouseX, int mouseY); - void mouseClick(Minecraft mc, int mouseX, int mouseY, int button); + boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button); void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button); void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button); diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiScrollbar.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiScrollbar.java index d66cf6d3..a17ffd06 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiScrollbar.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiScrollbar.java @@ -61,12 +61,14 @@ public class GuiScrollbar extends Gui implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - if(!enabled) return; + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + if(!enabled) return false; if (isHovering(mouseX, mouseY)) { draggingStart = mouseX; draggingStartPosition = sliderPosition; + return true; } + return false; } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiString.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiString.java index 2fca61b9..e0d331d6 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiString.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiString.java @@ -50,8 +50,8 @@ public class GuiString extends Gui implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + return false; } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiTextArea.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiTextArea.java index c68eb475..98a7d83e 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiTextArea.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiTextArea.java @@ -470,7 +470,7 @@ public class GuiTextArea extends Gui implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { boolean hovering = isHovering(mouseX, mouseY); if (hovering && isFocused() && button == 0) { @@ -486,6 +486,7 @@ public class GuiTextArea extends Gui implements GuiElement { } setFocused(hovering); + return hovering; } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java index 06d26936..809bee61 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiKeyframeTimeline.java @@ -32,13 +32,13 @@ public class GuiKeyframeTimeline extends GuiTimeline { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - if(!enabled) return; + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + if(!enabled) return false; //left mouse button if(button == 0) { long time = getTimeAt(mouseX, mouseY); if(time == -1) { - return; + return false; } int tolerance = (int) (2 * Math.round(zoom * timelineLength / width)); @@ -71,6 +71,8 @@ public class GuiKeyframeTimeline extends GuiTimeline { this.clickTime = currentTime; } + + return isHovering(mouseX, mouseY); } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java index 9eaa82a4..c38d09a5 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiMarkerTimeline.java @@ -24,14 +24,14 @@ public class GuiMarkerTimeline extends GuiTimeline { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - if(!enabled) return; + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + if(!enabled) return false; //left mouse button if(button == 0) { long time = getTimeAt(mouseX, mouseY); if(time == -1) { - return; + return false; } int tolerance = (int) (2 * Math.round(zoom * timelineLength / width)); @@ -66,7 +66,7 @@ public class GuiMarkerTimeline extends GuiTimeline { long time = getTimeAt(mouseX, mouseY); if(time == -1) { - return; + return false; } int tolerance = (int) (2 * Math.round(zoom * timelineLength / width)); @@ -82,6 +82,8 @@ public class GuiMarkerTimeline extends GuiTimeline { ReplayMod.replaySender.jumpToTime(closest.getRealTimestamp()); } } + + return isHovering(mouseX, mouseY); } @Override diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiTimeline.java b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiTimeline.java index c2169ca5..b5dd4831 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiTimeline.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/elements/timelines/GuiTimeline.java @@ -222,8 +222,8 @@ public class GuiTimeline extends Gui implements GuiElement { } @Override - public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { - + public boolean mouseClick(Minecraft mc, int mouseX, int mouseY, int button) { + return isHovering(mouseX, mouseY); } @Override