mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-03 19:03:52 +00:00
added a general leaderboard detail column for the tracking quality of a race
This commit is contained in:
1 parent
e627d3219c
commit
89430241cb
5 files changed
+123
-5
No files matched your search
+2
-1
@@ -32,7 +32,8 @@ public enum DetailType implements Serializable {
|
||||
MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS(1, DESCENDING),
|
||||
TOTAL_DISTANCE_TRAVELED(0, ASCENDING), TOTAL_AVERAGE_SPEED_OVER_GROUND(2, DESCENDING),
|
||||
TOTAL_TIME_SAILED_IN_SECONDS(1, ASCENDING), RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS(2, DESCENDING),
|
||||
RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS(1 , ASCENDING);
|
||||
RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS(1 , ASCENDING),
|
||||
RACE_TRACKING_QUALITY(0 , ASCENDING);
|
||||
|
||||
private int precision;
|
||||
|
||||
|
||||
@@ -336,6 +336,37 @@ img.openColumn {
|
||||
padding: 15px 0px;
|
||||
}
|
||||
|
||||
|
||||
.trackingQuality-circle {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
-moz-border-radius-topleft: 50%;
|
||||
-webkit-border-top-left-radius: 50%;
|
||||
border-top-left-radius: 50%;
|
||||
-moz-border-radius-topright: 50%;
|
||||
-webkit-border-top-right-radius: 50%;
|
||||
border-top-right-radius: 50%;
|
||||
-moz-border-radius-bottomleft: 50%;
|
||||
-webkit-border-bottom-left-radius: 50%;
|
||||
border-bottom-left-radius: 50%;
|
||||
-moz-border-radius-bottomright: 50%;
|
||||
-webkit-border-bottom-right-radius: 50%;
|
||||
border-bottom-right-radius: 50%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.circleYellow {
|
||||
background: #fbba00;
|
||||
}
|
||||
|
||||
.circleGreen {
|
||||
background: #8ab54e;
|
||||
}
|
||||
|
||||
.circleRed {
|
||||
background: #f01010;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Begin CSS for WindowBox component:
|
||||
******************************************************************************/
|
||||
|
||||
+8
-3
@@ -99,6 +99,8 @@ public class DetailTypeFormatter {
|
||||
return stringMessages.averageJibeLossInMeters();
|
||||
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
|
||||
return stringMessages.timeSinceLastPositionFix();
|
||||
case RACE_TRACKING_QUALITY:
|
||||
return "TQ";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -166,12 +168,13 @@ public class DetailTypeFormatter {
|
||||
case NUMBER_OF_MANEUVERS:
|
||||
case DISPLAY_LEGS:
|
||||
case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED:
|
||||
case RACE_TRACKING_QUALITY:
|
||||
return "";
|
||||
|
||||
default:
|
||||
// Throwing an exception to get notificated if an implementation of
|
||||
// an detail type is missing.
|
||||
throw new UnsupportedOperationException("Theres currently no support for the enum value '" + detailType
|
||||
// Throwing an exception to get notified if an implementation of
|
||||
// a detail type is missing.
|
||||
throw new UnsupportedOperationException("There is currently no support for the enum value '" + detailType
|
||||
+ "' in this method.");
|
||||
}
|
||||
}
|
||||
@@ -271,6 +274,8 @@ public class DetailTypeFormatter {
|
||||
return stringMessages.windwardDistanceToGoInMetersTooltip();
|
||||
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
|
||||
return stringMessages.timeSinceLastPositionFixTooltip();
|
||||
case RACE_TRACKING_QUALITY:
|
||||
return "Tracking Quality";
|
||||
}
|
||||
|
||||
return "";
|
||||
|
||||
+16
-1
@@ -800,7 +800,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
DetailType.SPEED_OVER_GROUND_WHEN_PASSING_START,
|
||||
DetailType.DISTANCE_TO_STARBOARD_END_OF_STARTLINE_WHEN_PASSING_START_IN_METERS,
|
||||
DetailType.START_TACK,
|
||||
DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS };
|
||||
DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
|
||||
DetailType.RACE_TRACKING_QUALITY };
|
||||
}
|
||||
|
||||
public static DetailType[] getAvailableOverallDetailColumnTypes() {
|
||||
@@ -866,6 +867,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
result.put(DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
|
||||
new FormattedDoubleDetailTypeColumn(DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
|
||||
new RaceTimeSinceLastPositionFixInSeconds(), LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
|
||||
result.put(DetailType.RACE_TRACKING_QUALITY, new TrackingQualityColumn(stringMessages.rankGain(), new RaceTrackingQuality(), LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
|
||||
|
||||
result.put(DetailType.RACE_DISTANCE_TRAVELED,
|
||||
new FormattedDoubleDetailTypeColumn(DetailType.RACE_DISTANCE_TRAVELED, new RaceDistanceTraveledInMeters(),
|
||||
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
|
||||
@@ -954,6 +957,18 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
return result;
|
||||
}
|
||||
|
||||
private class RaceTrackingQuality implements LegDetailField<Double> {
|
||||
@Override
|
||||
public Double get(LeaderboardRowDTO row) {
|
||||
Double result = null;
|
||||
LeaderboardEntryDTO fieldsForRace = row.fieldsByRaceColumnName.get(getRaceColumnName());
|
||||
if (fieldsForRace != null) {
|
||||
result = fieldsForRace.timeSinceLastPositionFixInSeconds;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private class RaceTimeSinceLastPositionFixInSeconds implements LegDetailField<Double> {
|
||||
@Override
|
||||
public Double get(LeaderboardRowDTO row) {
|
||||
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
package com.sap.sailing.gwt.ui.leaderboard;
|
||||
|
||||
import com.google.gwt.cell.client.AbstractSafeHtmlCell;
|
||||
import com.google.gwt.safehtml.shared.SafeHtml;
|
||||
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
|
||||
import com.google.gwt.text.shared.SafeHtmlRenderer;
|
||||
import com.sap.sailing.domain.common.DetailType;
|
||||
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
|
||||
|
||||
public class TrackingQualityColumn extends DetailTypeColumn<Double, Double> {
|
||||
public TrackingQualityColumn(String title, LegDetailField<Double> field, String headerStyle, String columnStyle) {
|
||||
super(DetailType.RACE_TRACKING_QUALITY, field, new TrackingQualityCell(), headerStyle, columnStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getValue(LeaderboardRowDTO row) {
|
||||
return getField().get(row);
|
||||
}
|
||||
|
||||
private static class TrackingQualityCell extends AbstractSafeHtmlCell<Double> {
|
||||
private static final String STYLE_TRACKING_QUALITY_CIRCLE = "trackingQuality-circle";
|
||||
private static final String STYLE_TRACKING_QUALITY_CIRCLE_RED = "circleRed";
|
||||
private static final String STYLE_TRACKING_QUALITY_CIRCLE_YELLOW = "circleYellow";
|
||||
private static final String STYLE_TRACKING_QUALITY_CIRCLE_GREEN = "circleGreen";
|
||||
|
||||
public TrackingQualityCell() {
|
||||
super(new SafeHtmlRenderer<Double>() {
|
||||
@Override
|
||||
public SafeHtml render(Double rank) {
|
||||
SafeHtmlBuilder builder = new SafeHtmlBuilder();
|
||||
render(rank, builder);
|
||||
return builder.toSafeHtml();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Double timeSinceLastPositionFixInSeconds, SafeHtmlBuilder builder) {
|
||||
if (timeSinceLastPositionFixInSeconds != null) {
|
||||
builder.append(SafeHtmlUtils.fromTrustedString("<div class=\"" + STYLE_TRACKING_QUALITY_CIRCLE + " "));
|
||||
|
||||
// builder.append(SafeHtmlUtils.fromTrustedString(diffInSeconds + "s"));
|
||||
|
||||
if(timeSinceLastPositionFixInSeconds < 5.0) {
|
||||
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_GREEN));
|
||||
} else if(timeSinceLastPositionFixInSeconds < 10) {
|
||||
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_YELLOW));
|
||||
} else {
|
||||
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_RED));
|
||||
}
|
||||
|
||||
builder.append(SafeHtmlUtils.fromTrustedString("\"></div>"));
|
||||
} else {
|
||||
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_GREEN));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml data, SafeHtmlBuilder sb) {
|
||||
if (data != null) {
|
||||
sb.append(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user