mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-07-23 14:22:06 +08:00
NAV DIRECTIONS UI
This commit is contained in:
@@ -161,10 +161,8 @@ void HudRendererSP::updateState(const UIState &s) {
|
||||
navigationValid = nav.getValid();
|
||||
if (navigationValid && nav.getAllManeuvers().size() > 0) {
|
||||
auto maneuver = nav.getAllManeuvers()[-1];
|
||||
QString modifier = QString::fromStdString(maneuver.getModifier());
|
||||
if (modifier == "left") navigationArrowType = "left";
|
||||
else if (modifier == "right") navigationArrowType = "right";
|
||||
else navigationArrowType = "straight";
|
||||
navigationModifier = QString::fromStdString(maneuver.getModifier());
|
||||
navigationManeuverType = QString::fromStdString(maneuver.getType());
|
||||
|
||||
float dist = maneuver.getDistance();
|
||||
if (is_metric) {
|
||||
@@ -189,10 +187,22 @@ void HudRendererSP::updateState(const UIState &s) {
|
||||
} else {
|
||||
navigationStreet = instruction;
|
||||
}
|
||||
|
||||
// Get next maneuver if available
|
||||
if (nav.getAllManeuvers().size() > 1) {
|
||||
auto nextManeuver = nav.getAllManeuvers()[-2];
|
||||
navigationNextModifier = QString::fromStdString(nextManeuver.getModifier());
|
||||
navigationNextManeuverType = QString::fromStdString(nextManeuver.getType());
|
||||
navigationHasNext = true;
|
||||
} else {
|
||||
navigationHasNext = false;
|
||||
}
|
||||
} else {
|
||||
navigationStreet = "W. Gonzalez Blvd."; // sample fields for metadrive sim (@nayan)
|
||||
navigationDistance = "5.8 mi";
|
||||
navigationArrowType = "straight";
|
||||
navigationModifier = "straight";
|
||||
navigationNextModifier = "right";
|
||||
navigationHasNext = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -226,17 +236,17 @@ void HudRendererSP::draw(QPainter &p, const QRect &surface_rect) {
|
||||
if (smartCruiseControlMapEnabled) y_scc_m = orders[i++];
|
||||
|
||||
// Smart Cruise Control - Vision
|
||||
bool scc_vision_active_pulse = pulseElement(smartCruiseControlVisionFrame);
|
||||
if ((smartCruiseControlVisionEnabled && !smartCruiseControlVisionActive) || (smartCruiseControlVisionActive && scc_vision_active_pulse)) {
|
||||
//bool scc_vision_active_pulse = pulseElement(smartCruiseControlVisionFrame);
|
||||
//if ((smartCruiseControlVisionEnabled && !smartCruiseControlVisionActive) || (smartCruiseControlVisionActive && scc_vision_active_pulse)) {
|
||||
drawSmartCruiseControlOnroadIcon(p, surface_rect, x_offset, y_scc_v, "SCC-V");
|
||||
}
|
||||
//}
|
||||
smartCruiseControlVisionFrame = smartCruiseControlVisionActive ? (smartCruiseControlVisionFrame + 1) : 0;
|
||||
|
||||
// Smart Cruise Control - Map
|
||||
bool scc_map_active_pulse = pulseElement(smartCruiseControlMapFrame);
|
||||
if ((smartCruiseControlMapEnabled && !smartCruiseControlMapActive) || (smartCruiseControlMapActive && scc_map_active_pulse)) {
|
||||
//bool scc_map_active_pulse = pulseElement(smartCruiseControlMapFrame);
|
||||
//if ((smartCruiseControlMapEnabled && !smartCruiseControlMapActive) || (smartCruiseControlMapActive && scc_map_active_pulse)) {
|
||||
drawSmartCruiseControlOnroadIcon(p, surface_rect, x_offset, y_scc_m, "SCC-M");
|
||||
}
|
||||
//}
|
||||
smartCruiseControlMapFrame = smartCruiseControlMapActive ? (smartCruiseControlMapFrame + 1) : 0;
|
||||
|
||||
// Bottom Dev UI
|
||||
@@ -349,7 +359,7 @@ bool HudRendererSP::pulseElement(int frame) {
|
||||
}
|
||||
|
||||
void HudRendererSP::drawSmartCruiseControlOnroadIcon(QPainter &p, const QRect &surface_rect, int x_offset, int y_offset, std::string name) {
|
||||
int x = surface_rect.center().x();
|
||||
int x = surface_rect.left() + 860;
|
||||
int y = surface_rect.height() / 4;
|
||||
|
||||
QString text = QString::fromStdString(name);
|
||||
@@ -727,36 +737,41 @@ void HudRendererSP::drawSpeedLimitPreActiveArrow(QPainter &p, QRect &sign_rect)
|
||||
}
|
||||
|
||||
void HudRendererSP::drawSetSpeedSP(QPainter &p, const QRect &surface_rect) {
|
||||
// Draw outer box + border to contain set speed
|
||||
const QSize default_size = {172, 204};
|
||||
QSize set_speed_size = is_metric ? QSize(200, 204) : default_size;
|
||||
QRect set_speed_rect(QPoint(60 + (default_size.width() - set_speed_size.width()) / 2, 45), set_speed_size);
|
||||
// Combined speed display container - taller to fit both speeds
|
||||
const int container_width = 172;
|
||||
const int container_height = 280;
|
||||
const int container_x = 60;
|
||||
const int container_y = 45;
|
||||
|
||||
// Draw set speed box
|
||||
QRect speed_container(container_x, container_y, container_width, container_height);
|
||||
|
||||
// Draw outer rounded rectangle container
|
||||
p.setPen(QPen(QColor(255, 255, 255, 75), 6));
|
||||
p.setBrush(QColor(0, 0, 0, 166));
|
||||
p.drawRoundedRect(set_speed_rect, 32, 32);
|
||||
p.drawRoundedRect(speed_container, 24, 24);
|
||||
|
||||
// ===== BOTTOM SECTION: MAX/SET SPEED =====
|
||||
|
||||
// Colors based on status
|
||||
QColor max_color = QColor(0xa6, 0xa6, 0xa6, 0xff);
|
||||
QColor max_label_color = QColor(0xa6, 0xa6, 0xa6, 0xff);
|
||||
QColor set_speed_color = QColor(0x72, 0x72, 0x72, 0xff);
|
||||
if (is_cruise_set) {
|
||||
set_speed_color = QColor(255, 255, 255);
|
||||
if (speedLimitAssistActive) {
|
||||
set_speed_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0, 0xff, 0, 0xff);
|
||||
max_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0x80, 0xd8, 0xa6, 0xff);
|
||||
max_label_color = longOverride ? QColor(0x91, 0x9b, 0x95, 0xff) : QColor(0x80, 0xd8, 0xa6, 0xff);
|
||||
} else {
|
||||
if (status == STATUS_DISENGAGED) {
|
||||
max_color = QColor(255, 255, 255);
|
||||
max_label_color = QColor(255, 255, 255);
|
||||
} else if (status == STATUS_OVERRIDE) {
|
||||
max_color = QColor(0x91, 0x9b, 0x95, 0xff);
|
||||
max_label_color = QColor(0x91, 0x9b, 0x95, 0xff);
|
||||
} else {
|
||||
max_color = QColor(0x80, 0xd8, 0xa6, 0xff);
|
||||
max_label_color = QColor(0x80, 0xd8, 0xa6, 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Draw "MAX" or carState.cruiseState.speedCluster (when ICBM is active) text
|
||||
// ICBM counter logic
|
||||
if (!pcmCruiseSpeed && carControlEnabled) {
|
||||
if (std::nearbyint(set_speed) != std::nearbyint(speedCluster)) {
|
||||
icbm_active_counter = 3 * UI_FREQ;
|
||||
@@ -766,19 +781,25 @@ void HudRendererSP::drawSetSpeedSP(QPainter &p, const QRect &surface_rect) {
|
||||
} else {
|
||||
icbm_active_counter = 0;
|
||||
}
|
||||
int max_str_size = (icbm_active_counter != 0) ? 60 : 40;
|
||||
int max_str_y = (icbm_active_counter != 0) ? 15 : 27;
|
||||
|
||||
// ===== DIVIDER LINE =====
|
||||
int divider_y = container_y + 165;
|
||||
p.setPen(QPen(QColor(255, 255, 255, 50), 2));
|
||||
p.drawLine(container_x + 20, divider_y, container_x + container_width - 20, divider_y);
|
||||
|
||||
// Bottom section - MAX label
|
||||
QRect max_label_rect(container_x, container_y + 175, container_width, 30);
|
||||
p.setFont(InterFont(28, QFont::Normal));
|
||||
p.setPen(max_label_color);
|
||||
QString max_str = (icbm_active_counter != 0) ? QString::number(std::nearbyint(speedCluster)) : tr("MAX");
|
||||
p.drawText(max_label_rect, Qt::AlignCenter, max_str);
|
||||
|
||||
p.setFont(InterFont(max_str_size, QFont::DemiBold));
|
||||
p.setPen(max_color);
|
||||
p.drawText(set_speed_rect.adjusted(0, max_str_y, 0, 0), Qt::AlignTop | Qt::AlignHCenter, max_str);
|
||||
|
||||
// Draw set speed
|
||||
// Bottom section - Set speed value
|
||||
QRect set_speed_rect(container_x, container_y + 210, container_width, 60);
|
||||
QString setSpeedStr = is_cruise_set ? QString::number(std::nearbyint(set_speed)) : "–";
|
||||
p.setFont(InterFont(90, QFont::Bold));
|
||||
p.setFont(InterFont(58, QFont::Bold));
|
||||
p.setPen(set_speed_color);
|
||||
p.drawText(set_speed_rect.adjusted(0, 77, 0, 0), Qt::AlignTop | Qt::AlignHCenter, setSpeedStr);
|
||||
p.drawText(set_speed_rect, Qt::AlignCenter, setSpeedStr);
|
||||
}
|
||||
|
||||
void HudRendererSP::drawE2eAlert(QPainter &p, const QRect &surface_rect, const QString &alert_alt_text) {
|
||||
@@ -836,17 +857,26 @@ void HudRendererSP::drawE2eAlert(QPainter &p, const QRect &surface_rect, const Q
|
||||
}
|
||||
|
||||
void HudRendererSP::drawCurrentSpeedSP(QPainter &p, const QRect &surface_rect) {
|
||||
// Draw in top section of the unified speed container
|
||||
const int container_width = 172;
|
||||
const int container_x = 60;
|
||||
const int container_y = 45;
|
||||
|
||||
// ===== TOP SECTION: CURRENT SPEED =====
|
||||
|
||||
// Current speed value (larger and bolder)
|
||||
QString speedStr = QString::number(std::nearbyint(speed));
|
||||
QRect current_speed_rect(container_x, container_y + 25, container_width, 90);
|
||||
p.setFont(InterFont(85, QFont::Bold));
|
||||
p.setPen(Qt::white);
|
||||
p.drawText(current_speed_rect, Qt::AlignCenter, speedStr);
|
||||
|
||||
int speedX = surface_rect.left() + 120;
|
||||
int speedY = surface_rect.center().y() - 50;
|
||||
int unitsY = surface_rect.center().y();
|
||||
|
||||
p.setFont(InterFont(176, QFont::Bold));
|
||||
HudRenderer::drawText(p, speedX, speedY, speedStr);
|
||||
|
||||
p.setFont(InterFont(66));
|
||||
HudRenderer::drawText(p, speedX, unitsY, is_metric ? tr("km/h") : tr("mph"), 200);
|
||||
// Speed unit label
|
||||
QRect unit_rect(container_x, container_y + 115, container_width, 35);
|
||||
p.setFont(InterFont(30, QFont::Normal));
|
||||
p.setPen(QColor(180, 180, 180, 255));
|
||||
QString unit = is_metric ? tr("km/h") : tr("mph");
|
||||
p.drawText(unit_rect, Qt::AlignCenter, unit);
|
||||
}
|
||||
|
||||
void HudRendererSP::drawBlinker(QPainter &p, const QRect &surface_rect) {
|
||||
@@ -933,99 +963,245 @@ void HudRendererSP::drawBlinker(QPainter &p, const QRect &surface_rect) {
|
||||
p.restore();
|
||||
}
|
||||
|
||||
QString HudRendererSP::getNavigationIconName(const QString &type, const QString &mod) {
|
||||
// Map maneuver type and modifier to icon filename
|
||||
// Icon naming convention: direction_{maneuver_type}_{modifier}.png
|
||||
|
||||
QString icon_name;
|
||||
|
||||
// Maneuver types that support all modifiers
|
||||
if (type == "turn") {
|
||||
// turn: uturn, sharp_right, right, slight_right, straight, slight_left, left, sharp_left
|
||||
if (mod == "uturn") icon_name = "direction_uturn.png";
|
||||
else if (mod == "sharp right") icon_name = "direction_turn_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_turn_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_turn_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_turn_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_turn_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_turn_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_turn_sharp_left.png";
|
||||
}
|
||||
else if (type == "new name") {
|
||||
// new name: sharp_right, right, slight_right, straight, slight_left, left, sharp_left
|
||||
if (mod == "sharp right") icon_name = "direction_new_name_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_new_name_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_new_name_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_new_name_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_new_name_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_new_name_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_new_name_sharp_left.png";
|
||||
}
|
||||
else if (type == "depart") {
|
||||
// depart: right, straight, left
|
||||
if (mod == "right") icon_name = "direction_depart_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_depart_straight.png";
|
||||
else if (mod == "left") icon_name = "direction_depart_left.png";
|
||||
else icon_name = "direction_depart.png"; // default depart
|
||||
}
|
||||
else if (type == "arrive") {
|
||||
// arrive: right, straight, left
|
||||
if (mod == "right") icon_name = "direction_arrive_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_arrive_straight.png";
|
||||
else if (mod == "left") icon_name = "direction_arrive_left.png";
|
||||
else icon_name = "direction_arrive.png"; // default arrive (flag)
|
||||
}
|
||||
else if (type == "merge") {
|
||||
// merge: slight_right, straight, slight_left, left, right
|
||||
if (mod == "slight right") icon_name = "direction_merge_slight_right.png";
|
||||
else if (mod == "right") icon_name = "direction_merge_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_merge_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_merge_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_merge_left.png";
|
||||
}
|
||||
else if (type == "on ramp") {
|
||||
// on ramp: sharp_right, right, slight_right, straight, slight_left, left, sharp_left
|
||||
if (mod == "sharp right") icon_name = "direction_on_ramp_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_on_ramp_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_on_ramp_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_on_ramp_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_on_ramp_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_on_ramp_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_on_ramp_sharp_left.png";
|
||||
}
|
||||
else if (type == "off ramp") {
|
||||
// off ramp: slight_right, right, slight_left, left
|
||||
if (mod == "slight right") icon_name = "direction_off_ramp_slight_right.png";
|
||||
else if (mod == "right") icon_name = "direction_off_ramp_right.png";
|
||||
else if (mod == "slight left") icon_name = "direction_off_ramp_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_off_ramp_left.png";
|
||||
}
|
||||
else if (type == "fork") {
|
||||
// fork: slight_right, right, straight, slight_left, left
|
||||
if (mod == "slight right") icon_name = "direction_fork_slight_right.png";
|
||||
else if (mod == "right") icon_name = "direction_fork_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_fork_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_fork_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_fork_left.png";
|
||||
else icon_name = "direction_fork.png"; // default fork
|
||||
}
|
||||
else if (type == "end of road") {
|
||||
// end of road: right, left
|
||||
if (mod == "right") icon_name = "direction_end_of_road_right.png";
|
||||
else if (mod == "left") icon_name = "direction_end_of_road_left.png";
|
||||
}
|
||||
else if (type == "continue") {
|
||||
// continue: uturn, right, slight_right, straight, slight_left, left
|
||||
if (mod == "uturn") icon_name = "direction_continue_uturn.png";
|
||||
else if (mod == "right") icon_name = "direction_continue_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_continue_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_continue_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_continue_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_continue_left.png";
|
||||
else icon_name = "direction_continue.png"; // default continue
|
||||
}
|
||||
else if (type == "roundabout") {
|
||||
// roundabout: sharp_right, right, slight_right, straight, slight_left, left, sharp_left
|
||||
if (mod == "sharp right") icon_name = "direction_roundabout_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_roundabout_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_roundabout_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_roundabout_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_roundabout_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_roundabout_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_roundabout_sharp_left.png";
|
||||
else icon_name = "direction_roundabout.png"; // default roundabout
|
||||
}
|
||||
else if (type == "rotary") {
|
||||
// rotary: sharp_right, right, slight_right, straight, slight_left, left, sharp_left
|
||||
if (mod == "sharp right") icon_name = "direction_rotary_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_rotary_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_rotary_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_rotary_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_rotary_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_rotary_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_rotary_sharp_left.png";
|
||||
else icon_name = "direction_rotary.png"; // default rotary
|
||||
}
|
||||
else if (type == "roundabout turn") {
|
||||
// Use roundabout icons
|
||||
if (mod == "sharp right") icon_name = "direction_roundabout_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_roundabout_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_roundabout_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_roundabout_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_roundabout_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_roundabout_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_roundabout_sharp_left.png";
|
||||
else icon_name = "direction_roundabout.png";
|
||||
}
|
||||
else if (type == "notification") {
|
||||
// notification: sharp_right, right, slight_right, straight, slight_left, left, sharp_left
|
||||
if (mod == "sharp right") icon_name = "direction_notification_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_notification_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_notification_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_notification_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_notification_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_notification_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_notification_sharp_left.png";
|
||||
}
|
||||
|
||||
// If no match found, return default based on modifier only
|
||||
if (icon_name.isEmpty()) {
|
||||
if (mod == "uturn") icon_name = "direction_uturn.png";
|
||||
else if (mod == "sharp right") icon_name = "direction_turn_sharp_right.png";
|
||||
else if (mod == "right") icon_name = "direction_turn_right.png";
|
||||
else if (mod == "slight right") icon_name = "direction_turn_slight_right.png";
|
||||
else if (mod == "straight") icon_name = "direction_continue_straight.png";
|
||||
else if (mod == "slight left") icon_name = "direction_turn_slight_left.png";
|
||||
else if (mod == "left") icon_name = "direction_turn_left.png";
|
||||
else if (mod == "sharp left") icon_name = "direction_turn_sharp_left.png";
|
||||
else icon_name = "direction_continue_straight.png"; // ultimate fallback
|
||||
}
|
||||
|
||||
return icon_name;
|
||||
}
|
||||
|
||||
void HudRendererSP::drawNavigationHUD(QPainter &p, const QRect &surface_rect) {
|
||||
int x = surface_rect.center().x();
|
||||
int y = 50;
|
||||
int arrowSize = 176;
|
||||
int cy_offset = (navigationArrowType == "left" || navigationArrowType == "right") ? -20 : 0;
|
||||
int cx = x - 100;
|
||||
int textY = y + arrowSize/2 + cy_offset;
|
||||
int cy = (navigationArrowType == "straight") ? textY + 20 : textY + 60; // make straight more centered-ish bc its big boy
|
||||
|
||||
// For local testing
|
||||
/*
|
||||
navigationValid = true;
|
||||
navigationHasNext = true;
|
||||
|
||||
navigationStreet = "W. Gonzalez Blvd.";
|
||||
navigationDistance = "5.8 mi";
|
||||
navigationModifier = "right";
|
||||
navigationManeuverType = "roundabout";
|
||||
navigationNextModifier = "left";
|
||||
navigationNextManeuverType = "arrive";
|
||||
*/
|
||||
|
||||
if (!navigationValid && navigationStreet.isEmpty()) return;
|
||||
|
||||
p.save();
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setBrush(Qt::white);
|
||||
|
||||
if (navigationArrowType == "left") {
|
||||
drawLeftArrow(p, cx, cy, arrowSize);
|
||||
} else if (navigationArrowType == "right") {
|
||||
drawRightArrow(p, cx, cy, arrowSize);
|
||||
} else {
|
||||
drawStraightArrow(p, cx, cy, arrowSize);
|
||||
const int container_width = 620;
|
||||
const int container_height = 120;
|
||||
const int container_x = (surface_rect.width() - container_width) / 2;
|
||||
const int container_y = 80;
|
||||
const int border_radius = 28;
|
||||
|
||||
QRect container_rect(container_x, container_y, container_width, container_height);
|
||||
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setBrush(QColor(0, 0, 0, 180));
|
||||
p.drawRoundedRect(container_rect, border_radius, border_radius);
|
||||
|
||||
// Navigation icon
|
||||
const int icon_size = 80;
|
||||
const int icon_padding = 20;
|
||||
const int icon_x = container_x + icon_padding;
|
||||
const int icon_y = container_y + (container_height - icon_size) / 2;
|
||||
|
||||
QString icon_name = getNavigationIconName(navigationManeuverType, navigationModifier);
|
||||
QPixmap nav_icon = loadPixmap("../../sunnypilot/selfdrive/assets/navigation/" + icon_name, {icon_size, icon_size});
|
||||
|
||||
if (!nav_icon.isNull()) {
|
||||
p.drawPixmap(icon_x, icon_y, nav_icon);
|
||||
}
|
||||
|
||||
const int then_section_width = 90;
|
||||
const int text_x = icon_x + icon_size + 20;
|
||||
const int text_area_width = container_width - (text_x - container_x) - icon_padding - then_section_width;
|
||||
|
||||
// Street name
|
||||
p.setFont(InterFont(45, QFont::Bold));
|
||||
p.setPen(QColor(220, 220, 220, 255));
|
||||
QFontMetrics fm(p.font());
|
||||
QString truncated_street = fm.elidedText(navigationStreet, Qt::ElideRight, text_area_width);
|
||||
QRect street_rect(text_x, container_y + 15, text_area_width, 50);
|
||||
p.drawText(street_rect, Qt::AlignLeft | Qt::AlignVCenter, truncated_street);
|
||||
|
||||
// Distance
|
||||
p.setFont(InterFont(36, QFont::Normal));
|
||||
p.setPen(Qt::white);
|
||||
QRect distance_rect(text_x, container_y + 70, text_area_width, 40);
|
||||
p.drawText(distance_rect, Qt::AlignLeft | Qt::AlignVCenter, navigationDistance);
|
||||
|
||||
// Next Maneuver
|
||||
if (navigationHasNext) {
|
||||
|
||||
const int divider_x = container_x + container_width - then_section_width - 5;
|
||||
p.setPen(QPen(QColor(255, 255, 255, 50), 2));
|
||||
p.drawLine(divider_x, container_y + 15, divider_x, container_y + container_height - 15);
|
||||
|
||||
const int then_x = divider_x + 10;
|
||||
const int then_icon_size = 50;
|
||||
|
||||
QRect then_label_rect(then_x, container_y + 10, then_section_width - 15, 25);
|
||||
p.setFont(InterFont(25, QFont::Normal));
|
||||
p.setPen(QColor(180, 180, 180, 255));
|
||||
p.drawText(then_label_rect, Qt::AlignCenter, tr("Then"));
|
||||
|
||||
// Next maneuver icon
|
||||
const int then_icon_x = then_x + (then_section_width - 15 - then_icon_size) / 2;
|
||||
const int then_icon_y = container_y + 45;
|
||||
|
||||
QString next_icon_name = getNavigationIconName(navigationNextManeuverType, navigationNextModifier);
|
||||
QPixmap next_nav_icon = loadPixmap("../../sunnypilot/selfdrive/assets/navigation/" + next_icon_name, {then_icon_size, then_icon_size});
|
||||
|
||||
if (!next_nav_icon.isNull()) {
|
||||
p.drawPixmap(then_icon_x, then_icon_y, next_nav_icon);
|
||||
}
|
||||
}
|
||||
|
||||
p.restore();
|
||||
|
||||
int gap = (navigationArrowType == "left") ? -10 : 20;
|
||||
int textX = cx + arrowSize/2 + gap;
|
||||
if (navigationArrowType == "right") textX += 40; // move that beech over for right arrow
|
||||
|
||||
// Draw distance text
|
||||
p.setFont(InterFont(80, QFont::Bold));
|
||||
p.setPen(Qt::white);
|
||||
p.drawText(textX, textY, navigationDistance);
|
||||
|
||||
p.setFont(InterFont(50));
|
||||
int streetY = textY + 60; // draw street name below distance text
|
||||
p.drawText(textX, streetY, navigationStreet);
|
||||
}
|
||||
|
||||
void HudRendererSP::drawStraightArrow(QPainter &p, int cx, int cy, int size) {
|
||||
int rectWidth = size * 0.2;
|
||||
int rectHeight = size * 0.6;
|
||||
int rectX = cx - rectWidth / 2;
|
||||
int rectY = cy - rectHeight / 2;
|
||||
p.drawRect(rectX, rectY, rectWidth, rectHeight);
|
||||
|
||||
int triangleHeight = size * 0.3;
|
||||
int triangleBaseWidth = rectWidth * 3;
|
||||
QPolygon triangle;
|
||||
triangle << QPoint(cx - triangleBaseWidth / 2, rectY)
|
||||
<< QPoint(cx + triangleBaseWidth / 2, rectY)
|
||||
<< QPoint(cx, rectY - triangleHeight);
|
||||
p.drawPolygon(triangle);
|
||||
}
|
||||
|
||||
void HudRendererSP::drawLeftArrow(QPainter &p, int cx, int cy, int size) {
|
||||
int vertHeight = size * 0.6;
|
||||
int vertWidth = size * 0.2;
|
||||
int vertX = cx - vertWidth / 2;
|
||||
int vertY = cy - vertHeight;
|
||||
p.drawRect(vertX, vertY, vertWidth, vertHeight);
|
||||
|
||||
int horizWidth = size * 0.4;
|
||||
int horizHeight = size * 0.2;
|
||||
int horizX = cx - horizWidth + vertWidth / 2 + 1; // 1 to adjust pix gap bc my math ain't mathing today
|
||||
int horizY = cy - vertHeight - horizHeight / 2;
|
||||
p.drawRect(horizX, horizY, horizWidth, horizHeight);
|
||||
|
||||
int triangleWidth = size * 0.4;
|
||||
int triangleHeight = size * 0.4;
|
||||
QPolygon triangle;
|
||||
triangle << QPoint(horizX, horizY + horizHeight / 2 - triangleHeight / 2)
|
||||
<< QPoint(horizX, horizY + horizHeight / 2 + triangleHeight / 2)
|
||||
<< QPoint(horizX - triangleWidth, horizY + horizHeight / 2);
|
||||
p.drawPolygon(triangle); // I think i dislike qpolygons. they're mad annoying
|
||||
}
|
||||
|
||||
void HudRendererSP::drawRightArrow(QPainter &p, int cx, int cy, int size) {
|
||||
int vertHeight = size * 0.6;
|
||||
int vertWidth = size * 0.2;
|
||||
int vertX = cx - vertWidth / 2;
|
||||
int vertY = cy - vertHeight;
|
||||
p.drawRect(vertX, vertY, vertWidth, vertHeight);
|
||||
|
||||
int horizWidth = size * 0.4;
|
||||
int horizHeight = size * 0.2;
|
||||
int horizX = cx - vertWidth / 2;
|
||||
int horizY = cy - vertHeight - horizHeight / 2;
|
||||
p.drawRect(horizX, horizY, horizWidth, horizHeight);
|
||||
|
||||
int triangleWidth = size * 0.4;
|
||||
int triangleHeight = size * 0.4;
|
||||
QPolygon triangle;
|
||||
triangle << QPoint(horizX + horizWidth, horizY + horizHeight / 2 - triangleHeight / 2)
|
||||
<< QPoint(horizX + horizWidth, horizY + horizHeight / 2 + triangleHeight / 2)
|
||||
<< QPoint(horizX + horizWidth + triangleWidth, horizY + horizHeight / 2);
|
||||
p.drawPolygon(triangle);
|
||||
}
|
||||
|
||||
@@ -40,10 +40,7 @@ private:
|
||||
void drawCurrentSpeedSP(QPainter &p, const QRect &surface_rect);
|
||||
void drawBlinker(QPainter &p, const QRect &surface_rect);
|
||||
void drawNavigationHUD(QPainter &p, const QRect &surface_rect);
|
||||
|
||||
void drawStraightArrow(QPainter &p, int cx, int cy, int size);
|
||||
void drawLeftArrow(QPainter &p, int cx, int cy, int size);
|
||||
void drawRightArrow(QPainter &p, int cx, int cy, int size);
|
||||
QString getNavigationIconName(const QString &type, const QString &mod);
|
||||
|
||||
bool lead_status;
|
||||
float lead_d_rel;
|
||||
@@ -129,5 +126,9 @@ private:
|
||||
bool navigationValid;
|
||||
QString navigationStreet;
|
||||
QString navigationDistance;
|
||||
QString navigationArrowType;
|
||||
QString navigationModifier;
|
||||
QString navigationManeuverType;
|
||||
QString navigationNextModifier;
|
||||
QString navigationNextManeuverType;
|
||||
bool navigationHasNext;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ae17f4c1896c88a6d520f1acdca99ab23d4ce1140a500b64bea3185041f8ecd9
|
||||
size 1246
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:86a2eaf6070d6b93df385945bd7f4a6e9bb78b7cc42eb5b7ef9a9b6c075c80ce
|
||||
size 1581
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:398f30c89e396bb4bdbac1ba6dfe292f6e3278923e14113e705f4d0591671f32
|
||||
size 1528
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ae17f4c1896c88a6d520f1acdca99ab23d4ce1140a500b64bea3185041f8ecd9
|
||||
size 1246
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0e23cac9bec0de20f9632d19618be9b05eedb010c6e23b0ba7a8e3cc8225f64e
|
||||
size 865
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28
|
||||
size 1400
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c
|
||||
size 1334
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106
|
||||
size 1347
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e02ac2720f12f9373ae2d86d91fffb6203e18aba04b493bd6f41d2953a11cbc9
|
||||
size 1780
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8f83214c1fa6aba33ca3e1fe29db09733a275efe19864866b9edecbb59abb171
|
||||
size 1234
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:459fe6410e061542876fa7de93efaf901d15937f891e801e1b93f8270e750130
|
||||
size 1613
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e3f5fb80d62c92876a5e490917f549e2a443dfc683a6787506747bbbeb75d33b
|
||||
size 1538
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8f83214c1fa6aba33ca3e1fe29db09733a275efe19864866b9edecbb59abb171
|
||||
size 1234
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b9c86ddd75ea1ed2c49c1bdc2e7f98ed15d12226938073688dda1b0bbdf62308
|
||||
size 1439
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cc7248e62d11cf36f9a13d408a0954a51ff0eee9b8e03d8910a2eb2cb6a09ffd
|
||||
size 1456
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8509bd5dbf96e44f73421dc09ca8f7c1dddf2dc21f3b4b15650472b3e06b3470
|
||||
size 658
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5198a3fdb610001358501ca76ab52fe0979b9254ed85cbbb2ce1fab1cb77929a
|
||||
size 2015
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:752424da0ad8430c619045455a86c640b576f8bbe6d3d8b5b6a599b1c61ef489
|
||||
size 1863
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b6590df8da1f30ec61b3bdf729fda1956d340c5abab448ea0062105500cc5da5
|
||||
size 1841
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b4fbd63acf8f5e7f734b332a96e9ad138ad22ee07000ad425712e71b77ce0728
|
||||
size 1800
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a7a7f5bcab30ce961ff7e345c460cfbd133e45c66da1fe1f0e7bc7c826b05f30
|
||||
size 1805
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:676cbe95f9a663816dd77c55dbcf2c346bfae2454be7832914b5527219aba91f
|
||||
size 2473
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28
|
||||
size 1400
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c
|
||||
size 1334
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106
|
||||
size 1347
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e02ac2720f12f9373ae2d86d91fffb6203e18aba04b493bd6f41d2953a11cbc9
|
||||
size 1780
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:08245891301f814fc0245133e39df3fb14720025cc3e4bc7131f953ead47edc8
|
||||
size 1535
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8c629c7273fe2613538295aba807edfddbbae86ae77d6f9b0b60b0486e3f7ca9
|
||||
size 1484
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:72c1ef39486f3dc3f7a0a97777bce16c7c369cc85bf6c82629d6780803804967
|
||||
size 1765
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8b8bfd8019320127ed0fe03d4a1bddab57d5c2345b6cdeab66558ea9b53c0266
|
||||
size 1699
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d10bdde82e7896de072de28da46412d5e2f6c902fd5643c6b48a8fc79ed4232f
|
||||
size 113
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28
|
||||
size 1400
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0457b0597386d0b7d3cc06d961df5fb34211ee575da7fab2f81e424d9954bb42
|
||||
size 1549
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f6e1556f0b888afb6856f8cf3e16632959190f88dd66c4d9db4832a8269cbc5
|
||||
size 1552
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c
|
||||
size 1334
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106
|
||||
size 1347
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:57dbfdabe88f6abbb8993982eef72803ac504842e9a9d388e7dde1623f69f0d7
|
||||
size 1551
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28
|
||||
size 1400
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f2016b7bac3accf541f100a2c83871618214e1806e95e4d80867d30d1dfcf03
|
||||
size 1546
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c
|
||||
size 1334
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106
|
||||
size 1347
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6736b6c2123cbaf90d2c8e4da79a4089ba42c0e7a220a596e45afd511166da9b
|
||||
size 1524
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6a636d33568c658b05e460e05a1eac5c4e1cfced204044657a04191027c44c4c
|
||||
size 1580
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a27d55d704f77bca4beaac30a2c5b5abee304986627d09f971b2a2e0367e8477
|
||||
size 1478
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e711c8e2184440f4ddead06897c90758470e7475fa7e0cf8b2db567e491c8e57
|
||||
size 1519
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28
|
||||
size 1400
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0457b0597386d0b7d3cc06d961df5fb34211ee575da7fab2f81e424d9954bb42
|
||||
size 1549
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:57dbfdabe88f6abbb8993982eef72803ac504842e9a9d388e7dde1623f69f0d7
|
||||
size 1551
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7b2f19864347794510da5e13ebaed40cc01d45bbd649c3e5097052607af52fa7
|
||||
size 1334
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0d2704d4d480568deb63598a48b741b024f4e55f5936e3eeb9cdc3daf6618837
|
||||
size 1346
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1868ec727cd761aad76fb6cb7705360ed9f70a92aea97f4c3b945b043996d1e2
|
||||
size 1906
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b2d41ab080452ce24ce27ed833f24790a6e6218dc4a5df4b35d23d6cfc425fbb
|
||||
size 1543
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:94251b2485f1f8bd0b22eb32fd59459626229c38e4de9aa538ff249b3cc16505
|
||||
size 1743
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6fbc14fb3720b7452c34c64af8c9b6ce4c953a5e65f3b28ad1ed17b5b2bc47f0
|
||||
size 1532
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0fe99a15432706ac8bdd5766d3ed4869042b50e0d3c54665b63ba8eb2aaaef20
|
||||
size 1855
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:45115d7c0d4a6285406777787b19b5f6f9c8231ba773aaaa86ab62b7f94b1c51
|
||||
size 1699
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9ea0a56d30f763f69ba1c5051f05eac13e61a715ae4d80412b1e0570f3263e27
|
||||
size 1821
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:77c42dadeda4d9fdc5b8e7915319880908dd61acb46e289e88f8e067b8e57410
|
||||
size 1736
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1868ec727cd761aad76fb6cb7705360ed9f70a92aea97f4c3b945b043996d1e2
|
||||
size 1906
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b2d41ab080452ce24ce27ed833f24790a6e6218dc4a5df4b35d23d6cfc425fbb
|
||||
size 1543
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:94251b2485f1f8bd0b22eb32fd59459626229c38e4de9aa538ff249b3cc16505
|
||||
size 1743
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e7423462cc52bf5d97b6d2e05626f8066a6580b03922bc35589690b15d04a222
|
||||
size 1532
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0fe99a15432706ac8bdd5766d3ed4869042b50e0d3c54665b63ba8eb2aaaef20
|
||||
size 1855
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2b6cdda3bc23add330fa03095fc46251dbe2516f974d4ae44c321d87dc662d54
|
||||
size 1702
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9ea0a56d30f763f69ba1c5051f05eac13e61a715ae4d80412b1e0570f3263e27
|
||||
size 1821
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:77c42dadeda4d9fdc5b8e7915319880908dd61acb46e289e88f8e067b8e57410
|
||||
size 1736
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28
|
||||
size 1400
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5
|
||||
size 1371
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f2016b7bac3accf541f100a2c83871618214e1806e95e4d80867d30d1dfcf03
|
||||
size 1546
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:57dbfdabe88f6abbb8993982eef72803ac504842e9a9d388e7dde1623f69f0d7
|
||||
size 1551
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c
|
||||
size 1334
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106
|
||||
size 1347
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a
|
||||
size 1063
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:41adb4c64ca3cecf2f6de7dcca8826980369995959ad0eb3d7ec584bbac9b4a6
|
||||
size 1327
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e02ac2720f12f9373ae2d86d91fffb6203e18aba04b493bd6f41d2953a11cbc9
|
||||
size 1780
|
||||
Reference in New Issue
Block a user