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

View File

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

View File

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

View File

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