mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-04 03:13:49 +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),
|
MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS(1, DESCENDING),
|
||||||
TOTAL_DISTANCE_TRAVELED(0, ASCENDING), TOTAL_AVERAGE_SPEED_OVER_GROUND(2, 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),
|
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;
|
private int precision;
|
||||||
|
|
||||||
|
|||||||
@@ -336,6 +336,37 @@ img.openColumn {
|
|||||||
padding: 15px 0px;
|
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:
|
* Begin CSS for WindowBox component:
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|||||||
+8
-3
@@ -99,6 +99,8 @@ public class DetailTypeFormatter {
|
|||||||
return stringMessages.averageJibeLossInMeters();
|
return stringMessages.averageJibeLossInMeters();
|
||||||
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
|
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
|
||||||
return stringMessages.timeSinceLastPositionFix();
|
return stringMessages.timeSinceLastPositionFix();
|
||||||
|
case RACE_TRACKING_QUALITY:
|
||||||
|
return "TQ";
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -166,12 +168,13 @@ public class DetailTypeFormatter {
|
|||||||
case NUMBER_OF_MANEUVERS:
|
case NUMBER_OF_MANEUVERS:
|
||||||
case DISPLAY_LEGS:
|
case DISPLAY_LEGS:
|
||||||
case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED:
|
case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED:
|
||||||
|
case RACE_TRACKING_QUALITY:
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Throwing an exception to get notificated if an implementation of
|
// Throwing an exception to get notified if an implementation of
|
||||||
// an detail type is missing.
|
// a detail type is missing.
|
||||||
throw new UnsupportedOperationException("Theres currently no support for the enum value '" + detailType
|
throw new UnsupportedOperationException("There is currently no support for the enum value '" + detailType
|
||||||
+ "' in this method.");
|
+ "' in this method.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -271,6 +274,8 @@ public class DetailTypeFormatter {
|
|||||||
return stringMessages.windwardDistanceToGoInMetersTooltip();
|
return stringMessages.windwardDistanceToGoInMetersTooltip();
|
||||||
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
|
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
|
||||||
return stringMessages.timeSinceLastPositionFixTooltip();
|
return stringMessages.timeSinceLastPositionFixTooltip();
|
||||||
|
case RACE_TRACKING_QUALITY:
|
||||||
|
return "Tracking Quality";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
+16
-1
@@ -800,7 +800,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
|||||||
DetailType.SPEED_OVER_GROUND_WHEN_PASSING_START,
|
DetailType.SPEED_OVER_GROUND_WHEN_PASSING_START,
|
||||||
DetailType.DISTANCE_TO_STARBOARD_END_OF_STARTLINE_WHEN_PASSING_START_IN_METERS,
|
DetailType.DISTANCE_TO_STARBOARD_END_OF_STARTLINE_WHEN_PASSING_START_IN_METERS,
|
||||||
DetailType.START_TACK,
|
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() {
|
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,
|
result.put(DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
|
||||||
new FormattedDoubleDetailTypeColumn(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));
|
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,
|
result.put(DetailType.RACE_DISTANCE_TRAVELED,
|
||||||
new FormattedDoubleDetailTypeColumn(DetailType.RACE_DISTANCE_TRAVELED, new RaceDistanceTraveledInMeters(),
|
new FormattedDoubleDetailTypeColumn(DetailType.RACE_DISTANCE_TRAVELED, new RaceDistanceTraveledInMeters(),
|
||||||
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
|
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
|
||||||
@@ -954,6 +957,18 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
|||||||
return result;
|
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> {
|
private class RaceTimeSinceLastPositionFixInSeconds implements LegDetailField<Double> {
|
||||||
@Override
|
@Override
|
||||||
public Double get(LeaderboardRowDTO row) {
|
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