void TaskEditPanel::OnPaintItem(Canvas &canvas, const PixelRect rc, unsigned DrawListIndex) { assert(DrawListIndex <= ordered_task->TaskSize()); const unsigned padding = Layout::GetTextPadding(); const unsigned line_height = rc.bottom - rc.top; TCHAR buffer[120]; // Draw "Add turnpoint" label if (DrawListIndex == ordered_task->TaskSize()) { row_renderer.DrawFirstRow(canvas, rc, _("Add Turnpoint")); return; } const OrderedTaskPoint &tp = ordered_task->GetTaskPoint(DrawListIndex); GeoVector leg = tp.GetNominalLegVector(); bool show_leg_info = leg.distance > fixed(0.01); PixelRect text_rc = rc; text_rc.left += line_height + padding; if (show_leg_info) { // Draw leg distance FormatUserDistanceSmart(leg.distance, buffer, true); const int x1 = row_renderer.DrawRightFirstRow(canvas, rc, buffer); // Draw leg bearing FormatBearing(buffer, ARRAY_SIZE(buffer), leg.bearing); const int x2 = row_renderer.DrawRightSecondRow(canvas, rc, buffer); text_rc.right = std::min(x1, x2); } // Draw details line OrderedTaskPointRadiusLabel(tp.GetObservationZone(), buffer); if (!StringIsEmpty(buffer)) row_renderer.DrawSecondRow(canvas, text_rc, buffer); // Draw turnpoint name OrderedTaskPointLabel(tp.GetType(), tp.GetWaypoint().name.c_str(), DrawListIndex, buffer); row_renderer.DrawFirstRow(canvas, text_rc, buffer); // Draw icon const RasterPoint pt(rc.left + line_height / 2, rc.top + line_height / 2); const unsigned radius = line_height / 2 - padding; OZPreviewRenderer::Draw(canvas, tp.GetObservationZone(), pt, radius, task_look, CommonInterface::GetMapSettings().airspace, airspace_look); }
/** * Does this waypoint exist already in the task? A waypoint must not * be added twice to the task. */ gcc_pure static bool IsInTask(const OrderedTask &task, const Waypoint &wp) { for (unsigned i = 0, n = task.TaskSize(); i < n; ++i) if (task.GetTaskPoint(i).GetWaypoint() == wp) return true; return false; }
void TaskEditPanel::ReverseTask() { if (ordered_task->TaskSize() < 2) return; const unsigned start_index = 0; const unsigned finish_index = ordered_task->TaskSize() - 1; const Waypoint start_wp = ordered_task->GetTaskPoint(start_index).GetWaypoint(); const Waypoint finish_wp = ordered_task->GetTaskPoint(finish_index).GetWaypoint(); if (start_wp.location != finish_wp.location) { // swap start/finish TP if at different location but leave OZ type intact ordered_task->Relocate(start_index, finish_wp); ordered_task->Relocate(finish_index, start_wp); // remove optional start points while (ordered_task->HasOptionalStarts()) ordered_task->RemoveOptionalStart(0); } // reverse intermediate TPs order keeping the OZ type with the respective TP unsigned length = ordered_task->TaskSize()-1; for (unsigned i = 1; i < length - 1; ++i) { const OrderedTaskPoint &otp = ordered_task->GetTaskPoint(length - 1); if (!ordered_task->GetFactory().Insert(otp, i, false)) return; if (!ordered_task->GetFactory().Remove(length, false)) return; } *task_modified = true; ordered_task->ClearName(); ordered_task->GetFactory().CheckAddFinish(); ordered_task->UpdateStatsGeometry(); ordered_task->UpdateGeometry(); RefreshView(); }
void TaskRenderer::Draw(const OrderedTask &task) { tpv.SetBoundingBox(task.get_bounding_box(screen_bounds)); tpv.SetActiveIndex(task.GetActiveIndex()); for (unsigned i = 0; i < 4; i++) { tpv.ResetIndex(); if (i != RenderTaskPoint::LAYER_SYMBOLS && i != RenderTaskPoint::LAYER_LEG) { tpv.SetModeOptional(true); for (unsigned j = 0, end = task.optional_start_points_size(); j < end; ++j) tpv.Draw(*task.get_optional_start(j), (RenderTaskPoint::Layer)i); } tpv.SetModeOptional(false); for (unsigned j = 0, end = task.TaskSize(); j < end; ++j) tpv.Draw(task.GetTaskPoint(j), (RenderTaskPoint::Layer)i); } }
void TaskEditPanel::OnPaintItem(Canvas &canvas, const PixelRect rc, unsigned DrawListIndex) { assert(DrawListIndex <= ordered_task->TaskSize()); const PixelScalar line_height = rc.bottom - rc.top; TCHAR buffer[120]; const Font &name_font = *dialog.GetLook().list.font_bold; const Font &small_font = *dialog.GetLook().small_font; // Draw "Add turnpoint" label if (DrawListIndex == ordered_task->TaskSize()) { canvas.Select(name_font); canvas.SetTextColor(COLOR_BLACK); _stprintf(buffer, _T(" (%s)"), _("Add Turnpoint")); canvas.DrawText(rc.left + line_height + Layout::FastScale(2), rc.top + line_height / 2 - name_font.GetHeight() / 2, buffer); return; } const OrderedTaskPoint &tp = ordered_task->GetTaskPoint(DrawListIndex); GeoVector leg = tp.GetNominalLegVector(); bool show_leg_info = leg.distance > fixed(0.01); // Draw icon const RasterPoint pt(rc.left + line_height / 2, rc.top + line_height / 2); PixelScalar radius = std::min(PixelScalar(line_height / 2 - Layout::FastScale(4)), Layout::FastScale(10)); OZPreviewRenderer::Draw(canvas, tp.GetObservationZone(), pt, radius, task_look, CommonInterface::GetMapSettings().airspace, airspace_look); // 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); canvas.SetTextColor(COLOR_BLACK); UPixelScalar leg_info_width = 0; if (show_leg_info) { // Draw leg distance FormatUserDistanceSmart(leg.distance, buffer, true); UPixelScalar width = leg_info_width = canvas.CalcTextWidth(buffer); canvas.DrawText(rc.right - Layout::FastScale(2) - width, rc.top + Layout::FastScale(2) + (name_font.GetHeight() - small_font.GetHeight()) / 2, buffer); // Draw leg bearing FormatBearing(buffer, ARRAY_SIZE(buffer), leg.bearing); width = canvas.CalcTextWidth(buffer); canvas.DrawText(rc.right - Layout::FastScale(2) - width, top2, buffer); if (width > leg_info_width) leg_info_width = width; leg_info_width += Layout::FastScale(2); } // Draw details line PixelScalar left = rc.left + line_height + Layout::FastScale(2); OrderedTaskPointRadiusLabel(tp.GetObservationZone(), buffer); if (!StringIsEmpty(buffer)) canvas.DrawClippedText(left, top2, rc.right - leg_info_width - left, buffer); // Draw turnpoint name canvas.Select(name_font); OrderedTaskPointLabel(tp.GetType(), tp.GetWaypoint().name.c_str(), DrawListIndex, buffer); canvas.DrawClippedText(left, rc.top + Layout::FastScale(2), rc.right - leg_info_width - left, buffer); }