static void OnPaintListItem(Canvas &canvas, const PixelRect rc, unsigned i) { if (waypoint_select_info.empty()) { assert(i == 0); const UPixelScalar line_height = rc.bottom - rc.top; const Font &name_font = *UIGlobals::GetDialogLook().list.font; canvas.SetTextColor(COLOR_BLACK); canvas.Select(name_font); canvas.text(rc.left + line_height + Layout::FastScale(2), rc.top + line_height / 2 - name_font.GetHeight() / 2, filter_data.IsDefined() || way_points.IsEmpty() ? _("No Match!") : _("Choose a filter or click here")); return; } assert(i < waypoint_select_info.size()); const struct WaypointSelectInfo &info = waypoint_select_info[i]; WaypointListRenderer::Draw(canvas, rc, *info.waypoint, GeoVector(info.distance, info.direction), UIGlobals::GetDialogLook(), UIGlobals::GetMapLook().waypoint, CommonInterface::GetMapSettings().waypoint); }
const Waypoint* dlgWaypointSelect(SingleWindow &parent, const GeoPoint &_location, OrderedTask *ordered_task, const unsigned ordered_task_index) { dialog = LoadDialog(callback_table, parent, Layout::landscape ? _T("IDR_XML_WAYPOINTSELECT_L") : _T("IDR_XML_WAYPOINTSELECT")); assert(dialog != NULL); #ifdef GNAV dialog->SetKeyDownNotify(FormKeyDown); #endif const DialogLook &dialog_look = UIGlobals::GetDialogLook(); waypoint_list = (ListControl*)dialog->FindByName(_T("frmWaypointList")); assert(waypoint_list != NULL); waypoint_list->SetActivateCallback(OnWaypointListEnter); waypoint_list->SetPaintItemCallback(OnPaintListItem); waypoint_list->SetItemHeight(WaypointListRenderer::GetHeight(dialog_look)); name_button = (WndButton*)dialog->FindByName(_T("cmdFltName")); name_button->SetOnLeftNotify(OnFilterNameButtonLeft); name_button->SetOnRightNotify(OnFilterNameButtonRight); distance_filter = (WndProperty*)dialog->FindByName(_T("prpFltDistance")); direction_filter = (WndProperty*)dialog->FindByName(_T("prpFltDirection")); type_filter = (WndProperty *)dialog->FindByName(_T("prpFltType")); location = _location; triangle_validator = new FAITrianglePointValidator(ordered_task, ordered_task_index); last_heading = CommonInterface::Calculated().heading; PrepareData(); UpdateList(); dialog->SetTimerNotify(OnTimerNotify); if (dialog->ShowModal() != mrOK) { delete dialog; delete triangle_validator; return NULL; } unsigned index = waypoint_list->GetCursorIndex(); delete dialog; delete triangle_validator; const Waypoint* retval = NULL; if (index < waypoint_select_info.size()) retval = waypoint_select_info[index].waypoint; if (retval != NULL) dlgWaypointSelectAddToLastUsed(*retval); return retval; }
static void OnWaypointListEnter(unsigned i) { if (WayPointSelectInfo.size() > 0) wf->SetModalResult(mrOK); else OnFilterNameButton(*wbName); }
static void OnPaintListItem(Canvas &canvas, const RECT rc, unsigned i) { if (WayPointSelectInfo.empty()) { assert(i == 0); canvas.text(rc.left + Layout::FastScale(2), rc.top + Layout::FastScale(2), filter_data.defined() || way_points.empty() ? _("No Match!") : _("Choose a filter or click here")); return; } assert(i < WayPointSelectInfo.size()); PaintWaypoint(canvas, rc, WayPointSelectInfo[i]); }
static void OnWaypointListEnter(gcc_unused unsigned i) { if (waypoint_select_info.size() > 0) dialog->SetModalResult(mrOK); else OnFilterNameButton(*name_button); }
static void FillLastUsedList(WaypointSelectInfoVector &list, const std::list<unsigned int> &last_used_ids, const Waypoints &waypoints, const GeoPoint location) { list.clear(); if (last_used_ids.empty()) return; for (auto it = last_used_ids.rbegin(); it != last_used_ids.rend(); it++) { const Waypoint* waypoint = waypoints.LookupId(*it); if (waypoint == NULL) continue; list.push_back(*waypoint, location); } }
static void UpdateList() { FillList(WayPointSelectInfo, way_points, g_location, XCSoarInterface::Basic().Heading, filter_data); wWayPointList->SetLength(std::max(1, (int)WayPointSelectInfo.size())); wWayPointList->SetOrigin(0); wWayPointList->SetCursorIndex(0); wWayPointList->invalidate(); }
static void FillList(WaypointSelectInfoVector &dest, const Waypoints &src, GeoPoint location, Angle heading, const WayPointFilterData &filter) { dest.clear(); if (!filter.defined() && src.size() >= 500) return; FilterWaypointVisitor visitor(filter, location, heading, dest); if (filter.distance_index > 0) src.visit_within_radius(location, Units::ToSysDistance( DistanceFilter[filter.distance_index]), visitor); else src.visit_name_prefix(filter.name, visitor); if (filter.distance_index > 0 || filter.direction_index > 0) std::sort(dest.begin(), dest.end(), WaypointDistanceCompare); }
static void FillList(WaypointSelectInfoVector &list, const Waypoints &src, GeoPoint location, Angle heading, const WaypointFilterData &filter) { list.clear(); if (!filter.IsDefined() && src.size() >= 500) return; FilterWaypointVisitor visitor(filter, location, heading, list); if (filter.distance_index > 0) src.VisitWithinRange(location, Units::ToSysDistance( distance_filter_items[filter.distance_index]), visitor); else src.VisitNamePrefix(filter.name, visitor); if (filter.distance_index > 0 || filter.direction_index > 0) std::sort(list.begin(), list.end(), WaypointDistanceCompare); }
const Waypoint* dlgWayPointSelect(SingleWindow &parent, const GeoPoint &location) { wf = LoadDialog(CallBackTable, parent, Layout::landscape ? _T("IDR_XML_WAYPOINTSELECT_L") : _T("IDR_XML_WAYPOINTSELECT")); if (!wf) return NULL; assert(wf != NULL); wf->SetKeyDownNotify(FormKeyDown); ((WndButton *)wf->FindByName(_T("cmdClose")))-> SetOnClickNotify(OnWPSCloseClicked); ((WndButton *)wf->FindByName(_T("cmdSelect")))-> SetOnClickNotify(OnWPSSelectClicked); ((WndButton *)wf->FindByName(_T("cmdFltName")))-> SetOnClickNotify(OnFilterNameButton); wWayPointList = (WndListFrame*)wf->FindByName(_T("frmWayPointList")); assert(wWayPointList != NULL); wWayPointList->SetActivateCallback(OnWaypointListEnter); wWayPointList->SetPaintItemCallback(OnPaintListItem); wbName = (WndButton*)wf->FindByName(_T("cmdFltName")); wpDistance = (WndProperty*)wf->FindByName(_T("prpFltDistance")); wpDirection = (WndProperty*)wf->FindByName(_T("prpFltDirection")); wpType = (WndProperty *)wf->FindByName(_T("prpFltType")); g_location = location; PrepareData(); UpdateList(); wf->SetTimerNotify(OnTimerNotify); if (wf->ShowModal() != mrOK) { delete wf; return NULL; } unsigned ItemIndex = wWayPointList->GetCursorIndex(); if (ItemIndex >= WayPointSelectInfo.size()) return NULL; delete wf; return WayPointSelectInfo[ItemIndex].way_point; }
static void UpdateList() { if (filter_data.type_index == TF_LAST_USED) FillLastUsedList(waypoint_select_info, last_used_waypoint_ids, way_points, location); else FillList(waypoint_select_info, way_points, location, last_heading, filter_data); waypoint_list->SetLength(std::max(1, (int)waypoint_select_info.size())); waypoint_list->SetOrigin(0); waypoint_list->SetCursorIndex(0); waypoint_list->Invalidate(); }