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.createPath();
|
||||
currentTimeline.createPath();
|
||||
selectedTimeKeyframe = selectedPositionKeyframe = null;
|
||||
selectedKeyframe = null;
|
||||
}
|
||||
|
||||
private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); currentTimeline.createPath(); }
|
||||
private Keyframe selectedTimeKeyframe, selectedPositionKeyframe;
|
||||
private Keyframe selectedKeyframe;
|
||||
|
||||
public Keyframe getSelectedTimeKeyframe() {
|
||||
return selectedTimeKeyframe;
|
||||
public Keyframe getSelectedKeyframe() {
|
||||
return selectedKeyframe;
|
||||
}
|
||||
|
||||
public Keyframe getSelectedPositionKeyframe() {
|
||||
return selectedPositionKeyframe;
|
||||
}
|
||||
|
||||
public void setSelectedPositionKeyframe(Keyframe selectedPositionKeyframe) {
|
||||
this.selectedPositionKeyframe = selectedPositionKeyframe;
|
||||
}
|
||||
|
||||
public void setSelectedTimeKeyframe(Keyframe selectedTimeKeyframe) {
|
||||
this.selectedTimeKeyframe = selectedTimeKeyframe;
|
||||
public void setSelectedKeyframe(Keyframe selected) {
|
||||
this.selectedKeyframe = selected;
|
||||
}
|
||||
|
||||
public void setCurrentTimeline(Timeline currentTimeline) {
|
||||
|
||||
@@ -100,9 +100,7 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
||||
if (keyframe.getTime() >= startTime && keyframe.getTime() <= endTime) {
|
||||
double relativeTime = keyframe.getTime() - startTime;
|
||||
int positonX = BORDER_LEFT + (int) (relativeTime / visibleTime * visibleWidth) - KEYFRAME_SIZE / 2;
|
||||
int u = KEYFRAME_TEXTURE_X +
|
||||
(mod.getSelectedTimeKeyframe() == keyframe || mod.getSelectedPositionKeyframe() == keyframe
|
||||
? KEYFRAME_SIZE : 0);
|
||||
int u = KEYFRAME_TEXTURE_X + (mod.getSelectedKeyframe() == keyframe ? KEYFRAME_SIZE : 0);
|
||||
int v = KEYFRAME_TEXTURE_Y;
|
||||
if (keyframe.getValue(CameraProperties.POSITION).isPresent()) {
|
||||
if (keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()) {
|
||||
@@ -196,7 +194,7 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
||||
lastClickedTime = now;
|
||||
lastClickedKeyframe = keyframe;
|
||||
lastClickedPath = pathKeyframePair.getLeft();
|
||||
selectKeyframe(lastClickedPath, lastClickedKeyframe);
|
||||
gui.getMod().setSelectedKeyframe(lastClickedKeyframe);
|
||||
// We might be dragging
|
||||
draggingStartX = position.getX();
|
||||
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
|
||||
public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) {
|
||||
if (!dragging) {
|
||||
@@ -293,7 +281,7 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
|
||||
draggingChange = gui.moveKeyframe(path, lastClickedKeyframe, newTime);
|
||||
|
||||
// Selected keyframe has been replaced
|
||||
selectKeyframe(lastClickedPath, path.getKeyframe(newTime));
|
||||
gui.getMod().setSelectedKeyframe(path.getKeyframe(newTime));
|
||||
|
||||
// Path has been changed
|
||||
path.updateAll();
|
||||
|
||||
@@ -258,8 +258,12 @@ public class GuiPathing {
|
||||
|
||||
@Override
|
||||
public int getY() {
|
||||
Keyframe keyframe = mod.getSelectedPositionKeyframe();
|
||||
return keyframe != null ? 60 : 40;
|
||||
Keyframe keyframe = mod.getSelectedKeyframe();
|
||||
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
|
||||
@@ -281,8 +285,12 @@ public class GuiPathing {
|
||||
|
||||
@Override
|
||||
public int getY() {
|
||||
Keyframe keyframe = mod.getSelectedTimeKeyframe();
|
||||
return keyframe != null ? 100 : 80;
|
||||
Keyframe keyframe = mod.getSelectedKeyframe();
|
||||
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
|
||||
@@ -400,7 +408,15 @@ public class GuiPathing {
|
||||
Timeline timeline = mod.getCurrentTimeline();
|
||||
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;
|
||||
if (keyframe == null) {
|
||||
change = AddKeyframe.create(path, time);
|
||||
@@ -454,11 +470,7 @@ public class GuiPathing {
|
||||
|
||||
timeline.pushChange(change);
|
||||
|
||||
if (isTime) {
|
||||
mod.setSelectedTimeKeyframe(keyframe);
|
||||
} else {
|
||||
mod.setSelectedPositionKeyframe(keyframe);
|
||||
}
|
||||
mod.setSelectedKeyframe(keyframe);
|
||||
}
|
||||
|
||||
public Change updateInterpolators() {
|
||||
|
||||
@@ -230,7 +230,7 @@ public class PathPreviewRenderer {
|
||||
float posY = 0f;
|
||||
float size = 10f / ReplayMod.TEXTURE_SIZE;
|
||||
|
||||
if (keyframe == mod.getSelectedPositionKeyframe()) {
|
||||
if (keyframe == mod.getSelectedKeyframe()) {
|
||||
posY += size;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user