package com.xenoage.zong.musiclayout.layouter;
import static com.xenoage.utils.collections.CList.ilist;
import com.xenoage.zong.core.position.Time;
import lombok.AllArgsConstructor;
import com.xenoage.utils.annotations.NonNull;
import com.xenoage.utils.collections.CList;
import com.xenoage.utils.collections.IList;
import com.xenoage.zong.core.position.MP;
import com.xenoage.zong.musiclayout.ScoreFrameLayout;
import com.xenoage.zong.musiclayout.ScoreLayout;
import com.xenoage.zong.musiclayout.stampings.StaffStamping;
import com.xenoage.zong.musiclayout.stampings.Stamping;
import com.xenoage.zong.musiclayout.stampings.SystemCursorStamping;
/**
* This class modifies a given {@link ScoreLayout}
* so that the given playback situation is shown.
*
* @author Andreas Wenger
*/
@AllArgsConstructor public class PlaybackLayouter {
@NonNull private final ScoreLayout scoreLayout;
private static IList<Stamping> noStampings = CList.<Stamping>ilist();
/**
* Sets a {@link SystemCursorStamping} at the given {@link MP},
* representing the current playback position.
*/
public void setCursorAt(Time time) {
//remove old playback cursors
removePlaybackStampings();
//create new one
SystemCursorStamping cursor = createCursorAt(time);
//find frame
if (cursor != null) {
ScoreFrameLayout frame = scoreLayout.getScoreFrameLayout(time.measure);
frame.setPlaybackStampings(ilist(cursor));
}
}
/**
* Returns a new {@link SystemCursorStamping} at the given {@link Time},
* representing the current playback position, or null if there is none.
*/
public SystemCursorStamping createCursorAt(Time time) {
ScoreFrameLayout frame = scoreLayout.getScoreFrameLayout(time.measure);
if (frame != null) {
StaffStamping topStaff = frame.getStaffStamping(0, time.measure);
StaffStamping bottomStaff = frame.getStaffStamping(scoreLayout.score.getStavesCount() - 1,
time.measure);
if (topStaff != null && bottomStaff != null)
return new SystemCursorStamping(topStaff, bottomStaff, frame.getPositionX(time));
}
return null;
}
/**
* Removes all playback stampings.
*/
public void removePlaybackStampings() {
for (ScoreFrameLayout frame : scoreLayout.frames) {
frame.setPlaybackStampings(noStampings);
}
}
}