Only allow a single keyframe to be selected

Fix crash when adding keyframe exactly on top of another
This commit is contained in:
johni0702
2016-09-02 13:45:40 +02:00
parent cd1a53531b
commit 50ba370c1c
4 changed files with 32 additions and 40 deletions

View File

@@ -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) {

View File

@@ -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();

View File

@@ -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() {

View File

@@ -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;
}