void WaypointListRenderer::Draw(Canvas &canvas, const PixelRect rc, const Waypoint &waypoint, const GeoVector *vector, const DialogLook &dialog_look, const WaypointLook &look, const WaypointRendererSettings &settings) { const PixelScalar line_height = rc.bottom - rc.top; const Font &name_font = *dialog_look.list.font; const Font &small_font = *dialog_look.small_font; Buffer buffer; // Y-Coordinate of the second row PixelScalar top2 = rc.top + name_font.GetHeight() + Layout::FastScale(4); // Use small font for details canvas.Select(small_font); // Draw leg distance UPixelScalar leg_info_width = 0; if (vector) { FormatUserDistanceSmart(vector->distance, buffer.buffer(), true); UPixelScalar width = leg_info_width = canvas.CalcTextWidth(buffer.c_str()); canvas.text(rc.right - Layout::FastScale(2) - width, rc.top + Layout::FastScale(2) + (name_font.GetHeight() - small_font.GetHeight()) / 2, buffer.c_str()); // Draw leg bearing FormatBearing(buffer.buffer(), buffer.MAX_SIZE, vector->bearing); width = canvas.CalcTextWidth(buffer.c_str()); canvas.text(rc.right - Layout::FastScale(2) - width, top2, buffer.c_str()); if (width > leg_info_width) leg_info_width = width; leg_info_width += Layout::FastScale(2); } // Draw details line FormatWaypointDetails(buffer, waypoint); PixelScalar left = rc.left + line_height + Layout::FastScale(2); canvas.text_clipped(left, top2, rc.right - leg_info_width - left, buffer.c_str()); // Draw waypoint name canvas.Select(name_font); canvas.text_clipped(left, rc.top + Layout::FastScale(2), rc.right - leg_info_width - left, waypoint.name.c_str()); // Draw icon RasterPoint pt = { (PixelScalar)(rc.left + line_height / 2), (PixelScalar)(rc.top + line_height / 2) }; WaypointIconRenderer wir(settings, look, canvas); wir.Draw(waypoint, pt); }
void DrawSymbol(const struct WaypointRendererSettings &settings, const WaypointLook &look, Canvas &canvas, bool small_icons, Angle screen_rotation) const { WaypointIconRenderer wir(settings, look, canvas, small_icons, screen_rotation); wir.Draw(*waypoint, point, (WaypointIconRenderer::Reachability)reachable, in_task); }
void WaypointListRenderer::Draw(Canvas &canvas, const PixelRect rc, const Waypoint &waypoint, fixed distance, fixed arrival_altitude, const DialogLook &dialog_look, const WaypointLook &look, const WaypointRendererSettings &settings) { const PixelScalar line_height = rc.bottom - rc.top; const Font &name_font = *dialog_look.list.font; const Font &small_font = *dialog_look.small_font; // Y-Coordinate of the second row PixelScalar top2 = rc.top + name_font.GetHeight() + Layout::FastScale(4); // Use small font for details canvas.Select(small_font); // Draw distance and arrival altitude StaticString<256> buffer; TCHAR dist[20], alt[20], radio[20]; FormatUserDistanceSmart(distance, dist, true); FormatRelativeUserAltitude(arrival_altitude, alt, true); buffer.Format(_T("%s: %s - %s: %s"), _("Distance"), dist, _("Arrival Alt"), alt); if (waypoint.radio_frequency.IsDefined()) { waypoint.radio_frequency.Format(radio, ARRAY_SIZE(radio)); buffer.AppendFormat(_T(" - %s MHz"), radio); } UPixelScalar left = rc.left + line_height + Layout::FastScale(2); canvas.text_clipped(left, top2, rc, buffer); // Draw waypoint name canvas.Select(name_font); canvas.text_clipped(left, rc.top + Layout::FastScale(2), rc, waypoint.name.c_str()); // Draw icon RasterPoint pt = { PixelScalar(rc.left + line_height / 2), PixelScalar(rc.top + line_height / 2) }; WaypointIconRenderer::Reachability reachable = positive(arrival_altitude) ? WaypointIconRenderer::ReachableTerrain : WaypointIconRenderer::Unreachable; WaypointIconRenderer wir(settings, look, canvas); wir.Draw(waypoint, pt, reachable); }