Only allow a single keyframe to be selected
Fix crash when adding keyframe exactly on top of another
This commit is contained in:
@@ -59,26 +59,18 @@ public class ReplayModSimplePathing implements PathingRegistry {
|
|||||||
currentTimeline = createTimeline();
|
currentTimeline = createTimeline();
|
||||||
currentTimeline.createPath();
|
currentTimeline.createPath();
|
||||||
currentTimeline.createPath();
|
currentTimeline.createPath();
|
||||||
selectedTimeKeyframe = selectedPositionKeyframe = null;
|
selectedKeyframe = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); currentTimeline.createPath(); }
|
private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); currentTimeline.createPath(); }
|
||||||
private Keyframe selectedTimeKeyframe, selectedPositionKeyframe;
|
private Keyframe selectedKeyframe;
|
||||||
|
|
||||||
public Keyframe getSelectedTimeKeyframe() {
|
public Keyframe getSelectedKeyframe() {
|
||||||
return selectedTimeKeyframe;
|
return selectedKeyframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Keyframe getSelectedPositionKeyframe() {
|
public void setSelectedKeyframe(Keyframe selected) {
|
||||||
return selectedPositionKeyframe;
|
this.selectedKeyframe = selected;
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelectedPositionKeyframe(Keyframe selectedPositionKeyframe) {
|
|
||||||
this.selectedPositionKeyframe = selectedPositionKeyframe;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSelectedTimeKeyframe(Keyframe selectedTimeKeyframe) {
|
|
||||||
this.selectedTimeKeyframe = selectedTimeKeyframe;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCurrentTimeline(Timeline currentTimeline) {
|
public void setCurrentTimeline(Timeline currentTimeline) {
|
||||||
|
|||||||
@@ -100,9 +100,7 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
|||||||
if (keyframe.getTime() >= startTime && keyframe.getTime() <= endTime) {
|
if (keyframe.getTime() >= startTime && keyframe.getTime() <= endTime) {
|
||||||
double relativeTime = keyframe.getTime() - startTime;
|
double relativeTime = keyframe.getTime() - startTime;
|
||||||
int positonX = BORDER_LEFT + (int) (relativeTime / visibleTime * visibleWidth) - KEYFRAME_SIZE / 2;
|
int positonX = BORDER_LEFT + (int) (relativeTime / visibleTime * visibleWidth) - KEYFRAME_SIZE / 2;
|
||||||
int u = KEYFRAME_TEXTURE_X +
|
int u = KEYFRAME_TEXTURE_X + (mod.getSelectedKeyframe() == keyframe ? KEYFRAME_SIZE : 0);
|
||||||
(mod.getSelectedTimeKeyframe() == keyframe || mod.getSelectedPositionKeyframe() == keyframe
|
|
||||||
? KEYFRAME_SIZE : 0);
|
|
||||||
int v = KEYFRAME_TEXTURE_Y;
|
int v = KEYFRAME_TEXTURE_Y;
|
||||||
if (keyframe.getValue(CameraProperties.POSITION).isPresent()) {
|
if (keyframe.getValue(CameraProperties.POSITION).isPresent()) {
|
||||||
if (keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()) {
|
if (keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()) {
|
||||||
@@ -196,7 +194,7 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
|||||||
lastClickedTime = now;
|
lastClickedTime = now;
|
||||||
lastClickedKeyframe = keyframe;
|
lastClickedKeyframe = keyframe;
|
||||||
lastClickedPath = pathKeyframePair.getLeft();
|
lastClickedPath = pathKeyframePair.getLeft();
|
||||||
selectKeyframe(lastClickedPath, lastClickedKeyframe);
|
gui.getMod().setSelectedKeyframe(lastClickedKeyframe);
|
||||||
// We might be dragging
|
// We might be dragging
|
||||||
draggingStartX = position.getX();
|
draggingStartX = position.getX();
|
||||||
dragging = true;
|
dragging = true;
|
||||||
@@ -241,16 +239,6 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void selectKeyframe(int path, Keyframe keyframe) {
|
|
||||||
if (path == GuiPathing.POSITION_PATH) {
|
|
||||||
gui.getMod().setSelectedPositionKeyframe(keyframe);
|
|
||||||
gui.getMod().setSelectedTimeKeyframe(null);
|
|
||||||
} else {
|
|
||||||
gui.getMod().setSelectedPositionKeyframe(null);
|
|
||||||
gui.getMod().setSelectedTimeKeyframe(keyframe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) {
|
public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) {
|
||||||
if (!dragging) {
|
if (!dragging) {
|
||||||
@@ -293,7 +281,7 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
|||||||
draggingChange = gui.moveKeyframe(path, lastClickedKeyframe, newTime);
|
draggingChange = gui.moveKeyframe(path, lastClickedKeyframe, newTime);
|
||||||
|
|
||||||
// Selected keyframe has been replaced
|
// Selected keyframe has been replaced
|
||||||
selectKeyframe(lastClickedPath, path.getKeyframe(newTime));
|
gui.getMod().setSelectedKeyframe(path.getKeyframe(newTime));
|
||||||
|
|
||||||
// Path has been changed
|
// Path has been changed
|
||||||
path.updateAll();
|
path.updateAll();
|
||||||
|
|||||||
@@ -258,8 +258,12 @@ public class GuiPathing {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getY() {
|
public int getY() {
|
||||||
Keyframe keyframe = mod.getSelectedPositionKeyframe();
|
Keyframe keyframe = mod.getSelectedKeyframe();
|
||||||
return keyframe != null ? 60 : 40;
|
if (keyframe == null || !keyframe.getValue(CameraProperties.POSITION).isPresent()) {
|
||||||
|
// No keyframe selected but there might be one at exactly the position of the cursor
|
||||||
|
keyframe = mod.getCurrentTimeline().getPaths().get(POSITION_PATH).getKeyframe(timeline.getCursorPosition());
|
||||||
|
}
|
||||||
|
return keyframe != null && keyframe.getValue(CameraProperties.POSITION).isPresent() ? 60 : 40;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -281,8 +285,12 @@ public class GuiPathing {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getY() {
|
public int getY() {
|
||||||
Keyframe keyframe = mod.getSelectedTimeKeyframe();
|
Keyframe keyframe = mod.getSelectedKeyframe();
|
||||||
return keyframe != null ? 100 : 80;
|
if (keyframe == null || !keyframe.getValue(TimestampProperty.PROPERTY).isPresent()) {
|
||||||
|
// No keyframe selected but there might be one at exactly the position of the cursor
|
||||||
|
keyframe = mod.getCurrentTimeline().getPaths().get(TIME_PATH).getKeyframe(timeline.getCursorPosition());
|
||||||
|
}
|
||||||
|
return keyframe != null && keyframe.getValue(TimestampProperty.PROPERTY).isPresent() ? 100 : 80;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -400,7 +408,15 @@ public class GuiPathing {
|
|||||||
Timeline timeline = mod.getCurrentTimeline();
|
Timeline timeline = mod.getCurrentTimeline();
|
||||||
Path path = timeline.getPaths().get(isTime ? TIME_PATH : POSITION_PATH);
|
Path path = timeline.getPaths().get(isTime ? TIME_PATH : POSITION_PATH);
|
||||||
|
|
||||||
Keyframe keyframe = isTime ? mod.getSelectedTimeKeyframe() : mod.getSelectedPositionKeyframe();
|
Keyframe keyframe = mod.getSelectedKeyframe();
|
||||||
|
if (keyframe != null && keyframe.getValue(TimestampProperty.PROPERTY).isPresent() ^ isTime) {
|
||||||
|
// Keyframe is on the wrong timeline
|
||||||
|
keyframe = null;
|
||||||
|
}
|
||||||
|
if (keyframe == null) {
|
||||||
|
// No keyframe selected but there may still be one at this exact time
|
||||||
|
keyframe = path.getKeyframe(time);
|
||||||
|
}
|
||||||
Change change;
|
Change change;
|
||||||
if (keyframe == null) {
|
if (keyframe == null) {
|
||||||
change = AddKeyframe.create(path, time);
|
change = AddKeyframe.create(path, time);
|
||||||
@@ -454,11 +470,7 @@ public class GuiPathing {
|
|||||||
|
|
||||||
timeline.pushChange(change);
|
timeline.pushChange(change);
|
||||||
|
|
||||||
if (isTime) {
|
mod.setSelectedKeyframe(keyframe);
|
||||||
mod.setSelectedTimeKeyframe(keyframe);
|
|
||||||
} else {
|
|
||||||
mod.setSelectedPositionKeyframe(keyframe);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Change updateInterpolators() {
|
public Change updateInterpolators() {
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ public class PathPreviewRenderer {
|
|||||||
float posY = 0f;
|
float posY = 0f;
|
||||||
float size = 10f / ReplayMod.TEXTURE_SIZE;
|
float size = 10f / ReplayMod.TEXTURE_SIZE;
|
||||||
|
|
||||||
if (keyframe == mod.getSelectedPositionKeyframe()) {
|
if (keyframe == mod.getSelectedKeyframe()) {
|
||||||
posY += size;
|
posY += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user