delayed tail display when CSS transition is used for boat animation during play state "PLAYING"

This commit is contained in:
Axel Uhl committed 2014-01-14 21:51:44 +01:00
1 parent 560a689637
commit 009c2a3a5c
3 files changed
+61 -40

No files matched your search

@@ -48,7 +48,7 @@
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/TvView.html com.sap.sailing.gwt.ui.TvView -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator -startupUrl /gwt/YoutubePopup.html com.sap.sailing.gwt.ui.YoutubePopup"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war &quot;${project_loc:com.sap.sailing.gwt.ui}&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/TvView.html com.sap.sailing.gwt.ui.TvView -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator -startupUrl /gwt/YoutubePopup.html com.sap.sailing.gwt.ui.YoutubePopup com.sap.sailing.gwt.ui.PolarSheets"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m -XX:MaxPermSize=512m"/>
</launchConfiguration>
@@ -12,6 +12,7 @@ import java.util.Set;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.overlays.Polyline;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.impl.Util.Triple;
@@ -318,44 +319,62 @@ public class FixesAndTails {
* <p>
*
* When this method returns, {@link #firstShownFix} and {@link #lastShownFix} have been updated accordingly.
*
* @param delayForTailChangeInMillis
* the time in milliseconds after which to actually draw the tail update, or <code>-1</code> to perform
* the update immediately
*/
protected void updateTail(Polyline tail, CompetitorDTO competitorDTO, Date from, Date to) {
int vertexCount = tail.getPath().getLength();
final List<GPSFixDTO> fixesForCompetitor = getFixes(competitorDTO);
int indexOfFirstShownFix = firstShownFix.get(competitorDTO) == null ? -1 : firstShownFix.get(competitorDTO);
while (indexOfFirstShownFix != -1 && vertexCount > 0
&& fixesForCompetitor.get(indexOfFirstShownFix).timepoint.before(from)) {
tail.getPath().removeAt(0);
vertexCount--;
indexOfFirstShownFix++;
protected void updateTail(final Polyline tail, final CompetitorDTO competitorDTO,
final Date from, final Date to, final int delayForTailChangeInMillis) {
Timer delayedOrImmediateExecutor = new Timer() {
@Override
public void run() {
int vertexCount = tail.getPath().getLength();
final List<GPSFixDTO> fixesForCompetitor = getFixes(competitorDTO);
int indexOfFirstShownFix = firstShownFix.get(competitorDTO) == null ? -1 : firstShownFix
.get(competitorDTO);
while (indexOfFirstShownFix != -1 && vertexCount > 0
&& fixesForCompetitor.get(indexOfFirstShownFix).timepoint.before(from)) {
tail.getPath().removeAt(0);
vertexCount--;
indexOfFirstShownFix++;
}
// now the polyline contains no more vertices representing fixes before "from";
// go back in time starting at indexOfFirstShownFix while the fixes are still at or after "from"
// and insert corresponding vertices into the polyline
while (indexOfFirstShownFix > 0
&& !fixesForCompetitor.get(indexOfFirstShownFix - 1).timepoint.before(from)) {
indexOfFirstShownFix--;
GPSFixDTO fix = fixesForCompetitor.get(indexOfFirstShownFix);
tail.getPath().insertAt(0, LatLng.newInstance(fix.position.latDeg, fix.position.lngDeg));
vertexCount++;
}
// now adjust the polylines tail: remove excess vertices that are after "to"
int indexOfLastShownFix = lastShownFix.get(competitorDTO) == null ? -1 : lastShownFix
.get(competitorDTO);
while (indexOfLastShownFix != -1 && vertexCount > 0
&& fixesForCompetitor.get(indexOfLastShownFix).timepoint.after(to)) {
tail.getPath().removeAt(--vertexCount);
indexOfLastShownFix--;
}
// now the polyline contains no more vertices representing fixes after "to";
// go forward in time starting at indexOfLastShownFix while the fixes are still at or before "to"
// and insert corresponding vertices into the polyline
while (indexOfLastShownFix < fixesForCompetitor.size() - 1
&& !fixesForCompetitor.get(indexOfLastShownFix + 1).timepoint.after(to)) {
indexOfLastShownFix++;
GPSFixDTO fix = fixesForCompetitor.get(indexOfLastShownFix);
tail.getPath().insertAt(vertexCount++, LatLng.newInstance(fix.position.latDeg, fix.position.lngDeg));
}
firstShownFix.put(competitorDTO, indexOfFirstShownFix);
lastShownFix.put(competitorDTO, indexOfLastShownFix);
}
};
if (delayForTailChangeInMillis == -1) {
delayedOrImmediateExecutor.run();
} else {
delayedOrImmediateExecutor.schedule(delayForTailChangeInMillis);
}
// now the polyline contains no more vertices representing fixes before "from";
// go back in time starting at indexOfFirstShownFix while the fixes are still at or after "from"
// and insert corresponding vertices into the polyline
while (indexOfFirstShownFix > 0 && !fixesForCompetitor.get(indexOfFirstShownFix - 1).timepoint.before(from)) {
indexOfFirstShownFix--;
GPSFixDTO fix = fixesForCompetitor.get(indexOfFirstShownFix);
tail.getPath().insertAt(0, LatLng.newInstance(fix.position.latDeg, fix.position.lngDeg));
vertexCount++;
}
// now adjust the polylines tail: remove excess vertices that are after "to"
int indexOfLastShownFix = lastShownFix.get(competitorDTO) == null ? -1 : lastShownFix.get(competitorDTO);
while (indexOfLastShownFix != -1 && vertexCount > 0
&& fixesForCompetitor.get(indexOfLastShownFix).timepoint.after(to)) {
tail.getPath().removeAt(--vertexCount);
indexOfLastShownFix--;
}
// now the polyline contains no more vertices representing fixes after "to";
// go forward in time starting at indexOfLastShownFix while the fixes are still at or before "to"
// and insert corresponding vertices into the polyline
while (indexOfLastShownFix < fixesForCompetitor.size() - 1
&& !fixesForCompetitor.get(indexOfLastShownFix + 1).timepoint.after(to)) {
indexOfLastShownFix++;
GPSFixDTO fix = fixesForCompetitor.get(indexOfLastShownFix);
tail.getPath().insertAt(vertexCount++, LatLng.newInstance(fix.position.latDeg, fix.position.lngDeg));
}
firstShownFix.put(competitorDTO, indexOfFirstShownFix);
lastShownFix.put(competitorDTO, indexOfLastShownFix);
}
/**
@@ -672,17 +672,19 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
Set<CompetitorDTO> competitorDTOsOfUnusedBoatCanvases = new HashSet<CompetitorDTO>(boatOverlays.keySet());
for (CompetitorDTO competitorDTO : competitorsToShow) {
if (fixesAndTails.hasFixesFor(competitorDTO)) {
final long timeForPositionTransitionMillis = timer.getPlayState() == PlayStates.Playing ? // animate when playing
1300*timer.getRefreshInterval()/1000 : -1;
Polyline tail = fixesAndTails.getTail(competitorDTO);
if (tail == null) {
tail = fixesAndTails.createTailAndUpdateIndices(competitorDTO, tailsFromTime, tailsToTime, this);
tail.setMap(map);
} else {
fixesAndTails.updateTail(tail, competitorDTO, tailsFromTime, tailsToTime);
fixesAndTails.updateTail(tail, competitorDTO, tailsFromTime, tailsToTime,
(int) (timeForPositionTransitionMillis==-1?-1:timeForPositionTransitionMillis/2));
competitorDTOsOfUnusedTails.remove(competitorDTO);
}
boolean usedExistingBoatCanvas = updateBoatCanvasForCompetitor(competitorDTO, date,
timer.getPlayState() == PlayStates.Playing ? // animate when playing
1300*timer.getRefreshInterval()/1000 : -1);
timeForPositionTransitionMillis);
if (usedExistingBoatCanvas) {
competitorDTOsOfUnusedBoatCanvases.remove(competitorDTO);
}